Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX在鼠标单击时设置按钮样式_Java_Css_Button_Javafx_Mouseevent - Fatal编程技术网

JavaFX在鼠标单击时设置按钮样式

JavaFX在鼠标单击时设置按钮样式,java,css,button,javafx,mouseevent,Java,Css,Button,Javafx,Mouseevent,我正在从事的一个Java项目遇到了一个问题:我正在通过面板上javafx中的代码创建一个按钮网格。这些按钮都是我编写的JavaFXButton类的一个子类的类型 下面是该类的标题: private final String BASIC_STYLE = "-fx-font: 6 arial;"; private final String CLICKED_STYLE = "-fx-background-color: #0f0"; private int row; private int col;

我正在从事的一个Java项目遇到了一个问题:我正在通过面板上javafx中的代码创建一个按钮网格。这些按钮都是我编写的JavaFXButton类的一个子类的类型

下面是该类的标题:

private final String BASIC_STYLE = "-fx-font: 6 arial;";
private final String CLICKED_STYLE = "-fx-background-color: #0f0";

private int row;
private int col;
private String category;
private boolean selected = false;
在构造函数中,我执行以下操作:

this.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            toggleSelected();
        }
    });
它基本上应该在每次单击按钮时交换样式。当我点击按钮时,按钮首先被操作系统选中(边框变成蓝色),只有在我第二次点击完全相同的按钮后,它才会变成绿色(我通过setStyle赋予它的样式)。 但是,选定属性在第一次单击时变为true,第二次单击时变为false,这意味着我单击按钮一次,它会得到一个蓝色边框,并且selected=true,如果我第二次单击它,它会变为绿色,selected=false,如果我第三次单击它,它会再次变为正常,但selected将再次变为true。 我觉得很奇怪,第一次点击一个按钮就可以正确地更改“selected”变量,但不能更改样式。为什么会发生这种情况?我如何避免在单击按钮之前必须先选择按钮?

您可以进行初始化

selected = false ;

但您的事件处理程序强制执行该规则

selected == true -> setStyle(BASIC_STYLE);
selected == false -> setStyle(CLICKED_STYLE);
因此,您的初始状态与处理程序强制执行的状态不一致

从初始状态开始,第一次单击时,
selected
被设置为
true
,这将导致
setStyle(基本样式)
(这是它已经具有的值,因此没有任何更改)。从那时起,一切都将根据需要切换

您需要更改初始状态,或者在处理程序中切换
setStyle(…)
调用的逻辑。

public class buttonerAction extends Button{
public class ButtonEnterAction extends Button {

    boolean selected = true;

    public ButtonEnterAction(String connect) {
        setText(connect);
        action();
    }

    public ButtonEnterAction() {
        action();
    }

    private void action() {
        EventHandler<KeyEvent> enterEvent = (KeyEvent event) -> {
            if (event.getCode() == KeyCode.ENTER) {
                fire();
            }
        };
        addEventFilter(KeyEvent.KEY_PRESSED, enterEvent);

//        setOnMouseEntered(new EventHandler<MouseEvent>() {
//            @Override
//            public void handle(MouseEvent me) {
//                SepiaTone st = new SepiaTone();
//                setEffect(st);
//            }
//        });
//        setOnMouseExited(new EventHandler<MouseEvent>() {
//            @Override
//            public void handle(MouseEvent me) {
//                setEffect(null);
//            }
//        });
    }

    @Override
    public void fire() {
        super.fire(); //To change body of generated methods, choose Tools | Templates.
        if (selected) {
            SepiaTone st = new SepiaTone();
            setEffect(st);
        } else {
            setEffect(null);
        }
        selected = !selected;
    }

}
所选布尔值=真; 公共按钮操作(字符串连接){ setText(连接); 动作(); } PublicButtonEnterAction(){ 动作(); } 私人无效诉讼{ EventHandler enterEvent=(KeyEvent事件)->{ if(event.getCode()==KeyCode.ENTER){ 火(); } }; addEventFilter(按下KeyEvent.KEY_,输入事件); //SetOnMouseCentered(新事件处理程序(){ //@覆盖 //公共无效句柄(MouseEvent me){ //SepiaTone st=新的SepiaTone(); //集落效应(st); // } // }); //setOnMouseExited(新的EventHandler(){ //@覆盖 //公共无效句柄(MouseEvent me){ //setEffect(空); // } // }); } @凌驾 公共场所火灾(){ super.fire();//若要更改生成方法的主体,请选择工具|模板。 如果(选定){ SepiaTone st=新的SepiaTone(); 集落效应(st); }否则{ setEffect(空); } 选中=!选中; } }
在ButtonEnterAction中创建Instant类类似

ButtonEnterAction bea = new ButtonEnterAction("TestButton");

        bea.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                System.out.println("hello");
            }
        });
buttonerAction bea=新的buttonerAction(“TestButton”);
bea.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
System.out.println(“你好”);
}
});

初始化为什么样式?在构造函数中:this.setStyle(this.BASIC_样式);
public class ButtonEnterAction extends Button {

    boolean selected = true;

    public ButtonEnterAction(String connect) {
        setText(connect);
        action();
    }

    public ButtonEnterAction() {
        action();
    }

    private void action() {
        EventHandler<KeyEvent> enterEvent = (KeyEvent event) -> {
            if (event.getCode() == KeyCode.ENTER) {
                fire();
            }
        };
        addEventFilter(KeyEvent.KEY_PRESSED, enterEvent);

//        setOnMouseEntered(new EventHandler<MouseEvent>() {
//            @Override
//            public void handle(MouseEvent me) {
//                SepiaTone st = new SepiaTone();
//                setEffect(st);
//            }
//        });
//        setOnMouseExited(new EventHandler<MouseEvent>() {
//            @Override
//            public void handle(MouseEvent me) {
//                setEffect(null);
//            }
//        });
    }

    @Override
    public void fire() {
        super.fire(); //To change body of generated methods, choose Tools | Templates.
        if (selected) {
            SepiaTone st = new SepiaTone();
            setEffect(st);
        } else {
            setEffect(null);
        }
        selected = !selected;
    }

}
ButtonEnterAction bea = new ButtonEnterAction("TestButton");

        bea.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                System.out.println("hello");
            }
        });