[英]JTabbedPane swing update error
我在JTabbedPane中有2个JPanels,并且即使在第二个面板是选定面板(即您可以看到的面板)上的第一个面板(它是动画)中的一个面板上调用update(g)时,更新的面板也会显示在屏幕。 为什么会这样,我该如何规避这种行为?
JComponent
的update()
方法“不会清除背景”,因此您可能需要明确地执行此操作。 JTabbedPane
典型示例通常不需要使用update()
。 显示您的用法的脚本可能会有所帮助。
附录1:不清楚为什么要调用update()
。 以下是一个没有异常现象的简单动画。
附录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计时器”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.