2017-02-25 44 views
0

我正在创建自己的Button类,扩展了JLabel。 我的目标是在鼠标悬停在其上方时立即更改其背景。 所以这是我得到:Swing:布尔值全局变化

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 
} 

出于某种原因,布尔值将只有鼠标监听器里改变。 为了让事情更加令人困惑,几乎相同的代码在另一个类中工作得很好。

+0

“出于某种原因,布尔值只会在鼠标侦听器内部发生变化。”这是什么意思? –

+0

你可以编辑你的问题来显示实际的课程吗? –

+0

这是发布一个适当的[mcve],当你问一个问题时,它可以证明问题,所以我们不必猜测你在做什么。 – camickr

回答

1

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

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

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

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

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