AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 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

如何使 Togglebutton 在 tableView 列中正常工作?

  • 772

我想让我的切换按钮列在我的 TableView 中正常工作。当我按下切换按钮时,什么也没有发生。如何修复这个问题?我没有更改“Medicaments.java”模型中的任何内容。看起来就像您在下面看到的那样:

@FXML
private TableColumn<Medicaments, Void> editRow;

我的型号:

     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;
}

切换按钮列:

 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 个回答
  • 38 Views

2 个回答

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

    这个答案可能适用,因为您可能会更改 TableView 看不到的内容。

    如果您的 TableView 实例是该方法所在的类的私有成员addEditButton(),则可以在设置图形后refresh()直接从方法内部调用它。updateItem(Void item, boolean empty)否则,您必须将 TableView 实例添加到 addEditButton 方法签名中,以便 update 方法可以调用它,或者通过向保存它的类添加访问器来从方法内部访问它。第一种方法(例如):

    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();
                }
    

    请注意,您可能必须制作tableView final; 有一阵子了。

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

    这是一个例子。您还可以采取其他可能更通用的方法。

    推荐的解决方案可能是基于对CheckBoxTableCell代码副本的修改的实现(我不会在此处介绍)。

    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();
       }
    }
    

    警告

    如果您自己实现类似的功能,请小心尝试复制简单按钮的教程(如您在评论中所述)。这种方法可能会导致您走上错误的道路。

    按钮没有反映的内部状态,而切换按钮则有状态(可以选择或不选择)。

    当支持行的项目更新时(例如,将新项目添加到列表中,或对列表重新排序,或对表格进行排序),您需要切换按钮继续反映与其关联的项目的正确状态(或现在与之关联的新项目),但这对于没有状态的简单按钮来说是不必要的。

    因此,当涉及诸如 ToggleButton 之类的有状态控件时,需要解决的问题的性质与无状态控件不同,并且解决方案可能相应地有所不同。

    • 0

相关问题

  • Javafx ListView 遇到问题

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    为什么这个简单而小的 Java 代码在所有 Graal JVM 上的运行速度都快 30 倍,但在任何 Oracle JVM 上却不行?

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    何时应使用 std::inplace_vector 而不是 std::vector?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Martin Hope
    Aleksandr Dubinsky 为什么 InetAddress 上的 switch 模式匹配会失败,并出现“未涵盖所有可能的输入值”? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge 为什么这个简单而小的 Java 代码在所有 Graal JVM 上的运行速度都快 30 倍,但在任何 Oracle JVM 上却不行? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini 具有指定基础类型但没有枚举器的“枚举类”的用途是什么? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer 何时应使用 std::inplace_vector 而不是 std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB 为什么 GCC 生成有条件执行 SIMD 实现的代码? 2024-02-17 06:17:14 +0800 CST

热门标签

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

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve