1

我正在尝试构建一个显示随机形状和随机文本的程序。这是我在类中扩展 JPanel 的代码。

@Override
protected void paintComponent(Graphics g) { 
    // draw all shapes        
    super.paintComponent(g);     // clears the background       

    this.add(new JLabel(new RandomText().getRandomSentence()));
    for (RandomShape shape : shapes) {
       shape.draw(g);
    }         
}

我使用 JPanel 而不是 g.drawString() 来显示 HTML 代码。我还有一个通过调用 repaint() 方法“重新生成”窗口的按钮。但是,当我按下重新生成按钮,从而调用 repaint() 方法时,形状会发生变化(就像他们应该做的那样),但文本不会。我发现更奇怪的是,当我调整窗口大小时,新标签会不断添加到我的面板中(随机文本就像他们应该的那样)。

super.paintCompnent(g) 是否不清除添加到面板的组件?如果是这样,为什么我自己调用 repaint() 不会添加额外的标签,就像调整窗口大小一样?

4

4 回答 4

2

调整窗口大小也会强制validate()调用,这会再次在面板上布置组件 - 简单地重新绘制不会。

但是,在您的绘画方法中,您每次都添加一个新的 JLabel 而不会删除任何内容,这几乎肯定不是您想要做的。您应该在一个单独的变量中跟踪 JLabel,并在重新绘制(最好)时更改它的位置,或者在添加新变量之前将其删除。

于 2013-10-07T12:55:18.380 回答
2

这会在每次重绘时为面板添加一个新标签:

this.add(new JLabel(new RandomText().getRandomSentence()));

相反,您应该在面板中添加一个标签可能在您的类的构造函数中。然后setText(aRandomSentence),当按下按钮时。不要修改. _paintComponent()

于 2013-10-07T12:56:15.050 回答
2

super.paintComponent(..);被调用时,它会清除图形元素。但是,它不会更改已添加到其中的对象。每次调用 repaint 时,您都会向面板添加一个新标签。

当你调用 repaint(); 自己,不保证调用所有组件的paintComponent。但是当你调整它的大小时,因为一切都会不同。

于 2013-10-07T12:56:45.603 回答
1

发生这种情况是因为您不断地向 JPanel 添加新的 JLabel。跟踪您的 JLabel 并更改它的文本,而不是添加新的 JLabel。

于 2013-10-07T12:55:25.890 回答