我遇到了一个我正在研究的Java项目的问题:我正在通过窗格上的javafx中的代码创建一个按钮网格。这些按钮是我写的javafx Button类的子类的所有类型。
这是班级的标题:
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();
}
});
这里是toggleSelected()方法:
public void toggleSelected() {
this.selected = !selected;
this.setStyle(selected ? this.BASIC_STYLE : this.BASIC_STYLE+this.CLICKED_STYLE);
}
每次点击按钮时,基本上应该交换样式。当我点击按钮时,按钮首先被操作系统选中(边框变为蓝色),只有在我再次点击完全相同的按钮后,它才会变为绿色(我的样式)通过setStyle提供它)。 但是,所选属性在第一次单击时变为true,在第二次单击时变为false,这意味着我在按钮上单击一次并且它获得蓝色边框并且selected = true,如果我再次单击它变为绿色并选中= false,如果我第三次点击它再次变为正常但选择将再次为真。 我发现第一次点击一个按钮改变了所选的&#34;真的很奇怪。变量正确但不是风格。为什么会发生这种情况?我怎样才能避免在点击之前先选择按钮?
答案 0 :(得分:0)
您初始化
selected = false ;
和
setStyle(BASIC_STYLE);
但您的事件处理程序会强制执行规则
selected == true -> setStyle(BASIC_STYLE);
selected == false -> setStyle(CLICKED_STYLE);
因此,您的初始状态与处理程序强制执行的状态不一致。
从初始状态开始,第一次点击时,selected
设置为true
,这会导致setStyle(BASIC_STYLE)
(这是它已有的值,所以没有任何变化)。从那时起,一切都将按要求切换。
您需要更改初始状态,或者在处理程序中切换setStyle(...)
调用的逻辑。
答案 1 :(得分:0)
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中创建Instant Class就像。
ButtonEnterAction bea = new ButtonEnterAction("TestButton");
bea.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("hello");
}
});