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

时间:2015-01-26 18:15:24

标签: java css button javafx mouseevent

我遇到了一个我正在研究的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;真的很奇怪。变量正确但不是风格。为什么会发生这种情况?我怎样才能避免在点击之前先选择按钮?

2 个答案:

答案 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");
            }
        });