listview - 每个单元格中带有按钮的 javafx listview

标签 listview javafx

我有一个 javafx 应用程序,其中包含带有自定义单元工厂的 ListView 。每个单元格都包含一个按钮,用于对该单元格执行特定操作。在更新到 java 8 之前一切正常,但是在使用 java 8 运行我的应用程序之后,当我单击按钮而不是按按钮处理事件时,整个单元格都会被选中。这是我的代码:

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.GridPane;

public class CustomCell extends ListCell<String> {
    private Button actionBtn;   

    public CustomCell() {
        super();    

        setOnMouseClicked(new EventHandler<MouseEvent>() {

            @Override
            public void handle(MouseEvent event) {              
                //do something                  
            }
        });     
    }

    @Override
    public void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);
        setEditable(false);
        if (item != null) {
            Label name = new Label(item);                           
            actionBtn = new Button("my action");            
            actionBtn.setOnAction(new EventHandler<ActionEvent>() {

                @Override
                public void handle(ActionEvent arg0) {
                    System.out.println("hiiiiiiiii");

                }
            });                     

            GridPane pane = new GridPane();
            pane.getStyleClass().add("gridpane");           
            pane.add(name, 0, 0);
            pane.add(actionBtn, 0, 1);              
            setGraphic(pane);
        } else {
            setText(null);
            setGraphic(null);
        }
    }   
}

最佳答案

这是一个错误,已提交。请参阅this discussion on OTN .

正如在那次讨论中一样,我强烈建议不要在 updateItem(...) 方法中创建新控件。最好为单元创建一次,然后在 updateItem(...) 中配置它们。例如:

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.GridPane;

public class CustomCell extends ListCell<String> {
    private Button actionBtn;   
    private Label name ;
    private GridPane pane ;

    public CustomCell() {
        super();    

        setOnMouseClicked(new EventHandler<MouseEvent>() {

            @Override
            public void handle(MouseEvent event) {              
                //do something                  
            }
        }); 

        actionBtn = new Button("my action");
        actionBtn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                System.out.println("Action: "+getItem());
            }
        });
        name = new Label();
        pane = new GridPane();
        pane.add(name, 0, 0);
        pane.add(actionBtn, 0, 1);
        setText(null);
    }

    @Override
    public void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);
        setEditable(false);
        if (item != null) {
            name.setText(item);                          
            setGraphic(pane);
        } else {
            setGraphic(null);
        }
    }   
}

除了显着提高效率之外,这还提供了解决该错误的方法。

关于listview - 每个单元格中带有按钮的 javafx listview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23137131/

相关文章:

java - 如何在 Java 中将字体样式转换为字体粗细?

java - Android,ListView和ArrayAdaptater,getView只调用一次

android - 当它在 scrollview android 内部时,listview 大小的问题很小

android - 如何在 setOnItemClickListener 上将 ListView 记录从 sqlite 显示到第二个 ListView

java - 如何将 JavaFX SDK 直接捆绑到输出 jar 中?

JavaFX 模态阶段在 MAC 上表现异常

java - 使用三个单选按钮从水平布局切换到垂直布局

java - 在 Android 应用中仅显示截止日期为今天的待办事项

java - 使用 JSON 文件填充 ListView

javafx - 需要从高度图创建三角形网格的帮助(JavaFX)