我在 JTabbedPane 中有 2 个 JPanel,当在第一个面板(它的动画)内的一个面板上调用 update(g) 时,即使第二个面板是选定的面板(即您可以看到的面板),更新的面板也会出现在屏幕。为什么会这样,我该如何规避这种行为?
问问题
2015 次
2 回答
5
“不清除背景”的update()
方法,因此您可能需要明确地执行此操作。的JComponent
典型示例JTabbedPane
通常不需要使用update()
. 也许显示您的使用情况的sscce可能会有所帮助。
附录 1:不清楚你为什么打电话给update()
. 下面是一个没有显示异常的简单动画。
附录 2:参见AWT 和 Swing 中的绘画:paint() 与 update()。您可能想改用repaint()
in actionPerformed()
。
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;
public class JTabbedTest {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
//@Override
public void run() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTabbedPane jtp = new JTabbedPane();
jtp.setPreferredSize(new Dimension(320, 200));
jtp.addTab("Reds", new ColorPanel(Color.RED));
jtp.addTab("Greens", new ColorPanel(Color.GREEN));
jtp.addTab("Blues", new ColorPanel(Color.BLUE));
f.add(jtp, BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
});
}
private static class ColorPanel extends JPanel implements ActionListener {
private final Random rnd = new Random();
private final Timer timer = new Timer(1000, this);
private Color color;
private int mask;
private JLabel label = new JLabel("Stackoverflow!");
public ColorPanel(Color color) {
super(true);
this.color = color;
this.mask = color.getRGB();
this.setBackground(color);
label.setForeground(color);
this.add(label);
timer.start();
}
//@Override
public void actionPerformed(ActionEvent e) {
color = new Color(rnd.nextInt() & mask);
this.setBackground(color);
}
}
}
于 2010-02-27T21:58:30.247 回答
2
当在第一个面板内的面板上调用 update(g) 时(它是一个动画)
覆盖 update(...) 方法是一个古老的 AWT 技巧,不应该与 Swing 一起使用。
阅读 Swing 教程中关于自定义绘画的部分,了解执行此操作的正确方法。对于动画,请阅读教程中的“如何使用 Swing Timer”。
于 2010-02-27T22:57:08.587 回答