JavaFX在鼠标单击时设置按钮样式
我正在从事的一个Java项目遇到了一个问题:我正在通过面板上javafx中的代码创建一个按钮网格。这些按钮都是我编写的JavaFXButton类的一个子类的类型 下面是该类的标题: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;
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");
}
});