我正在为学校工作,但我遇到了一个问题: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中,但这部分工作正常)
我做错了什么?
答案 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并尝试验证(。如果背景为白色,您的代码基本上只是替换背景???