JTabbedPane摆动更新错误

我在JTabbedPane中有2个JPanel,当在第一个面板内的面板上调用update(g)时(即动画),即使第二个面板是所选面板(即你可以看到的面板),更新的面板也出现在屏幕。 为什么这样,我怎么能规避这种行为呢?

JComponentupdate()方法“不清除背景”,因此您可能需要明确地执行此操作。 JTabbedPane典型示例通常不需要使用update() 。 也许显示您的使用情况的sscce可能有所帮助。

附录1:目前尚不清楚为什么要调用update() 。 下面是一个没有exception的简单动画。

附录2: 在AWT和Swing中看绘画:paint()与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一起使用。

阅读自定义绘画的Swing教程中的部分,了解正确的方法。 对于动画,请阅读教程中的“如何使用Swing Timer”。