为什么JPanel不会改变颜色并保持这种状态?

时间:2012-06-12 12:10:57

标签: java swing jpanel

我正在为学校工作,但我遇到了一个问题:P。 我得到了这段代码:

public void mouseEntered(MouseEvent e) {
    MyPanel b = (MyPanel)e.getSource();
    System.out.println("ID: "+b.getId()+"");
    b.setColor(Color.blue);
}

在我的MyPanel对象中:

public void setColor(Color kleur) {
    if(this.getBackground()==Color.white) {
        this.setBackground(kleur);
        repaint();
    }
}

当我用鼠标进入面板时,我输入的颜色会闪烁。但我希望它保持颜色,这样我就可以在一个带有500个Jpanels的Jform中绘制一条线索(我已将它们添加到ArrayList中,但这部分工作正常)

我做错了什么?

4 个答案:

答案 0 :(得分:1)

根据@ ErickRobertson对该问题的评论,我猜问题如下:

您的MyPanel替换了JPanel#paintComponents()方法。那可能吗?如果是这样,您可以执行以下操作。在MyPanel#setColor(Color)方法中,您不设置背景,而是设置包含新背景颜色的字段:

private Color backgroundColor = Color.white;
public void setColor(Color kleur) {
  backgroundColor = kleur;
  repaint();
}

然后,在MyPanel#paintComponents(Graphics)

@Override
public void paintComponent(Graphics g) {
  super.paintComponent(g);
  // draw background
  g.setColor(backgroundColor);
  g.fillRect(0, 0, getWidth(), getHeight());
  // draw your stuff here
}

答案 1 :(得分:0)

确保一次只能看到一个JPanel。

当您将JPanels添加到其父级时,它们是否会相互叠加?如果是这样,那么当你在其中一个上面调用repaint()时,它会立即被重新绘制,你可以看到它是蓝色的。但是一旦整个窗口再次重新绘制,JPanels就按照它们被添加的顺序绘制,最后一个最终绘制在顶部。此面板仍然具有白色背景,这就是您所看到的。

确保一次只能看到其中一个面板,或者您有一些计划来管理这些面板,以便只能看到其中一个面板。否则,请确保它们以网格或其他方式布局,以便它们不会出现在彼此之上。

答案 2 :(得分:0)

您的MouseListener已实施,因为您从MouseEvent获取了该面板。让面板实现MouseListener并让他们决定何时为自己改变颜色更容易。

class Panel extends JPanel implements MouseListener {

    public Panel() {
        // Make sure the listener listens 
        addMouseListener(this);
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        setColor(Color.blue);
    }
    // ... other mouselisteners can be ignored or implemented as needed
}

如果您需要通知mouseenter,您仍然可以保留对其他类的引用。只需创建一个私有成员并在构造函数中设置引用。

答案 3 :(得分:0)

public void setColor(Color kleur) {
    if(this.getBackground()==Color.white) {
        this.setBackground(kleur);
        repaint();
    }
}

不要使用==替换为equals并尝试验证(。如果背景为白色,您的代码基本上只是替换背景???