AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 78044339
Accepted
Marian34
Marian34
Asked: 2024-02-23 06:40:12 +0800 CST2024-02-23 06:40:12 +0800 CST 2024-02-23 06:40:12 +0800 CST

Como faço para que o Togglebutton funcione corretamente dentro da coluna tableView?

  • 772

Quero fazer com que minha coluna Togglebutons funcione corretamente dentro do meu TableView. Quando pressiono o botão de alternância, nada acontece. Como consertar isso? Não mudei nada no meu modelo "Medicaments.java". Parece que você vê abaixo:

@FXML
private TableColumn<Medicaments, Void> editRow;

Meu modelo:

     public Medicaments(int idNumber, String LOTNumber, String medName, String dateExpiry, int quantity, String unit,String timeLeft) {
    this.idNumber = idNumber;
    this.LOTNumber = LOTNumber;
    this.medName = medName;
    this.dateExpiry = dateExpiry;
    this.quantity = quantity;
    this.unit = unit;
    this.timeLeft = timeLeft;
}

Coluna do botão de alternância:

 private void AddEditButton() {
    TableColumn<Medicaments, Void> colBtn = new TableColumn("");

    Callback<TableColumn<Medicaments, Void>, TableCell<Medicaments, Void>> cellFactory = new 
     Callback<TableColumn<Medicaments, Void>, TableCell<Medicaments, Void>>() {
        @Override
        public TableCell<Medicaments, Void> call(final TableColumn<Medicaments, Void> param) 
          {
            final TableCell<Medicaments, Void> cell = new TableCell<Medicaments, Void>() {
                private final ToggleButton toggleButton = new ToggleButton("Edit");
                {
                    /**/

                    toggleButton.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> {
                        event.consume();
                        toggleButton.selectedProperty().addListener((observable,oldValue, 
                newValue) -> {
                            if(newValue){
                                toggleButton.setText("Save");
                            } else {
                                toggleButton.setText("Edit");
                            }
                        });

                    });
                    /*btn.addEventFilter(MouseEvent.MOUSE_PRESSED, event ->{
                        event.consume();
                        Medicaments data = getTableView().getItems().get(getIndex());
                        System.out.println("selectedData: " + data);

                    });*/

                }
                @Override
                public void updateItem(Void item, boolean empty) {
                    super.updateItem(item, empty);
                    if (empty) {
                        setGraphic(null);
                    } else {
                        setGraphic(toggleButton);
                    }
                }
            };
            return cell;
        }
    };
    editRow.setCellFactory(cellFactory);
}
javafx
  • 2 2 respostas
  • 38 Views

2 respostas

  • Voted
  1. Bill Horvath
    2024-02-23T06:56:04+08:002024-02-23T06:56:04+08:00

    Esta resposta provavelmente se aplica , pois provavelmente você está alterando algo que o TableView não pode ver.

    Se sua instância de TableView for um membro privado da classe na qual o addEditButton()método aparece, você poderá chamá refresh()-la diretamente de dentro do updateItem(Void item, boolean empty)método depois de definir o gráfico. Caso contrário, você terá que adicionar a instância TableView à assinatura do método addEditButton para que o método update possa chamá-la ou acessá-la de dentro do método adicionando um acessador à classe que a contém. O primeiro método ( por exemplo ):

    private void AddEditButton(TableView tableView) {
        ...
                @Override
                public void updateItem(Void item, boolean empty) {
                    super.updateItem(item, empty);
                    if (empty) {
                        this.setGraphic(null);
                    } else {
                        this.setGraphic(toggleButton);
                    }
                    tableView.refresh();
                }
    

    Observe que talvez você precise fazer o tableView final; faz algum tempo.

    • 0
  2. Best Answer
    jewelsea
    2024-02-23T08:21:35+08:002024-02-23T08:21:35+08:00

    Aqui está um exemplo. Haverá outras abordagens que você também poderá adotar e que podem ser mais genéricas.

    Uma solução recomendada pode ser uma implementação baseada em modificações em uma cópia do código de CheckBoxTableCell (que não apresentarei aqui).

    import javafx.application.Application;
    import javafx.beans.binding.Bindings;
    import javafx.beans.property.*;
    import javafx.collections.*;
    import javafx.scene.Scene;
    import javafx.scene.control.*;
    import javafx.stage.Stage;
    
    import java.util.List;
    
    public class ComboTableApp extends Application {
       @Override
       public void start(Stage stage) {
          final ObservableList<Person> data = FXCollections.observableArrayList(
                  new Person("Jacob", "Williams"),
                  new Person("Isabella", "Carlisle"),
                  new Person("Ethan", "Adura")
          );
    
          TableColumn<Person, String> firstNameColumn = new TableColumn<>("First Name");
          firstNameColumn.setCellValueFactory(item -> item.getValue().firstNameProperty());
          TableColumn<Person, String> lastNameColumn = new TableColumn<>("Last Name");
          lastNameColumn.setCellValueFactory(item -> item.getValue().lastNameProperty());
          TableColumn<Person, Person> toggleColumn = new TableColumn<>("Toggle");
          toggleColumn.setCellValueFactory(item -> new SimpleObjectProperty<>(item.getValue()));
          toggleColumn.setCellFactory(p -> new ToggleTableCell());
    
          final TableView<Person> table = new TableView<>(data);
          table.getColumns().addAll(
                  List.of(
                          firstNameColumn, lastNameColumn, toggleColumn
                  )
          );
          table.setPrefHeight(150);
    
          stage.setScene(new Scene(table));
          stage.show();
       }
    
       private static final class Person {
          private final StringProperty firstName;
          private final StringProperty lastName;
          private final BooleanProperty toggleState;
    
          public Person(String firstName, String lastName) {
             this.firstName = new SimpleStringProperty(firstName);
             this.lastName = new SimpleStringProperty(lastName);
             this.toggleState = new SimpleBooleanProperty(false);
          }
    
          public StringProperty firstNameProperty() {
             return firstName;
          }
          public StringProperty lastNameProperty() {
             return lastName;
          }
          public BooleanProperty toggleStateProperty() {
             return toggleState;
          }
       }
    
       private static class ToggleTableCell extends TableCell<Person, Person> {
          private final ToggleButton toggleButton = new ToggleButton();
          private BooleanProperty boundProperty;
    
          public ToggleTableCell() {
             toggleButton.textProperty().bind(
                     Bindings.when(
                                     toggleButton.selectedProperty()
                             )
                             .then("Selected")
                             .otherwise("Unselected")
             );
          }
    
          @Override
          protected void updateItem(Person person, boolean empty) {
             super.updateItem(person, empty);
    
             if (person == null || empty) {
                setGraphic(null);
                if (boundProperty != null) {
                   toggleButton.selectedProperty().unbindBidirectional(boundProperty);
                   boundProperty = null;
                }
                return;
             }
    
             setGraphic(toggleButton);
    
             if (boundProperty != person.toggleStateProperty()) {
                if (boundProperty != null) {
                   toggleButton.selectedProperty().unbindBidirectional(boundProperty);
                }
    
                boundProperty = person.toggleStateProperty();
                toggleButton.selectedProperty().bindBidirectional(boundProperty);
             }
          }
       }
    
       public static void main(String[] args) {
          launch();
       }
    }
    

    Aviso

    Se você mesmo estiver implementando funcionalidades semelhantes, tome cuidado ao tentar copiar um tutorial para um botão simples (como você observou nos comentários). Tal abordagem pode levá-lo por um caminho incorreto.

    Um botão não possui um estado interno que reflita, enquanto um botão de alternância possui um estado (pode ser selecionado ou não).

    À medida que os itens que apoiam as linhas são atualizados (por exemplo, novos itens adicionados à lista, ou a lista é reordenada, ou a tabela é classificada), você precisa do botão de alternância para continuar a refletir o estado correto do item ao qual foi associado (ou o novo item ao qual está agora associado), mas isso é desnecessário para um botão simples que não possui estado.

    Portanto, a natureza do problema que precisa ser resolvido quando um controle com estado, como um ToggleButton, está envolvido, é diferente daquele de um controle sem estado e a solução pode diferir de acordo.

    • 0

relate perguntas

  • Tendo problemas com Javafx ListView

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve