【问题标题】:JTabbedPane swing update errorJTabbedPane 摆动更新错误
【发布时间】:2010-02-27 21:14:05
【问题描述】:

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

【问题讨论】:

    标签: java swing jtabbedpane


    【解决方案1】:

    JComponentupdate() 方法“不会清除背景”,因此您可能需要明确地这样做。 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);
            }
        }
    }
    

    【讨论】:

    • 我没有在 JTabbedPane 上调用更新,它是在 JTabbedPane 的一个面板内的组件上调用的,问题是即使面板在所驻留的不是选定的面板。
    • 将 update() 添加到 ActionPerformed() 会产生我的问题。
    【解决方案2】:

    在面板上调用 update(g) 时 在第一个面板内(它的 动画)

    覆盖 update(...) 方法是一个古老的 AWT 技巧,不应该与 Swing 一起使用。

    阅读 Custom Painting 上的 Swing 教程中的部分,了解执行此操作的正确方法。对于动画,请阅读教程中的“如何使用 Swing Timer”。

    【讨论】:

    • 如何覆盖甚至调用 update() 导致像我这样的问题?
    • IIUC,它混合了 AWT 和 Swing。
    • 我无法回答为什么调用 update() 会导致您遇到问题,因为您的问题不包含代码或特定信息。我所知道的是人们盲目地复制他们在网上找到的代码,没有意识到在 AWT 和 Swing 中绘画的工作方式不同,你不能只是混合和匹配代码。阅读trashgod提供的链接,以更好地理解绘画,不要忘记我为您指出的教程。
    猜你喜欢
    • 2023-03-19
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    相关资源
    最近更新 更多