【发布时间】:2010-02-27 21:14:05
【问题描述】:
我在 JTabbedPane 中有 2 个 JPanel,当在第一个面板(它的动画)内的一个面板上调用 update(g) 时,即使第二个面板是选定的面板(即您可以看到的面板),更新的面板出现在屏幕上。为什么会这样?我该如何规避这种行为?
【问题讨论】:
标签: java swing jtabbedpane
我在 JTabbedPane 中有 2 个 JPanel,当在第一个面板(它的动画)内的一个面板上调用 update(g) 时,即使第二个面板是选定的面板(即您可以看到的面板),更新的面板出现在屏幕上。为什么会这样?我该如何规避这种行为?
【问题讨论】:
标签: java swing jtabbedpane
JComponent 的 update() 方法“不会清除背景”,因此您可能需要明确地这样做。 JTabbedPane 中的典型 examples 通常不需要使用 update()。也许sscce 显示您的使用情况可能会有所帮助。
附录 1:不清楚你为什么打电话给update()。下面是一个没有显示异常的简单动画。
附录 2:见 Painting in AWT and Swing: paint() vs. update()。您可能希望在 actionPerformed() 中使用 repaint()。
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);
}
}
}
【讨论】:
在面板上调用 update(g) 时 在第一个面板内(它的 动画)
覆盖 update(...) 方法是一个古老的 AWT 技巧,不应该与 Swing 一起使用。
阅读 Custom Painting 上的 Swing 教程中的部分,了解执行此操作的正确方法。对于动画,请阅读教程中的“如何使用 Swing Timer”。
【讨论】: