0

我正在为学校做作业,但我遇到了一个问题: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

4 回答 4

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
}
于 2012-06-12T12:30:45.407 回答
0

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

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

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

于 2012-06-12T12:20:04.607 回答
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
}

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

于 2012-06-12T12:33:10.430 回答
0
public void setColor(Color kleur) {
    if(this.getBackground()==Color.white) {
        this.setBackground(kleur);
        repaint();
    }
}

不要将 == repalce 与 equals 一起使用并尝试 invalidate(。您的代码基本上是说只有在背景为白色时才替换背景???

于 2012-06-12T13:03:03.317 回答