2

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

4

2 回答 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 回答