每个单元格都有按钮的javafx列表视图

 2023-02-15    340  

问题描述

我有一个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);
        }
    }   
}

推荐答案

这是已提交的错误.请参阅有关OTN的讨论.

每个单元格都有按钮的javafx列表视图

就像在讨论中一样,我强烈建议不要在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);
        }
    }   
}

以及更有效的效率,这也为错误提供了解决方法.

以上所述是小编给大家介绍的每个单元格都有按钮的javafx列表视图,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/33787.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。