Swing:布尔值未全局更改

时间:2017-02-25 16:53:53

标签: java swing

我正在创建自己的Button类,扩展了JLabel。 我的目标是在鼠标悬停在其上时立即改变其背景。 所以这就是我得到的:

public String st;
public boolean hover = false, down = false;

public Button() {
    addMouseListener(new MouseAdapter() {
        @Override
        public void mouseEntered(MouseEvent e) {
            System.out.println(hover); // false
            hover = true;
            System.out.println(hover); // true
        }
        @Override
        public void mouseExited(MouseEvent e) {
            System.out.println(hover); // true
            hover = false;
            System.out.println(hover); // false
        }
        @Override
        public void mousePressed(MouseEvent e) {
            down = true;
        }
        @Override
        public void mouseReleased(MouseEvent e) {
            down = false;
        }
    });
}

@Override
protected void paintComponent(Graphics g) {
    g.setColor(mainColor());
    g.fillRect(0, 0, getWidth(), getHeight());
}

public Color mainColor() {
    return down ? c1 : (hover ? c2 : c3);
    // hover is always false
}

由于某种原因,布尔值只会在鼠标侦听器内部发生变化。 为了让事情更加混乱,几乎相同的代码在另一个类中完美地运行。

1 个答案:

答案 0 :(得分:1)

您永远不会在repaint()代码中调用MouseListener,因此不会调用paintComponent()方法。

每当您更改自定义组件的属性时,都需要调用repaint()以确保组件以新状态绘制。

  

我正在创建自己的Button类,扩展了JLabel。

为什么要将JLabel扩展为绘制背景?您应该扩展JPanel或JComponent。

如果您需要更多帮助(以及将来提出问题时),请发布适当的MCVE来证明问题。