JTabbedPane摆动更新错误

发布于 2024-08-23 08:42:09 字数 127 浏览 6 评论 0原文

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

I have 2 JPanels in a JTabbedPane and when update(g) is called on a panel inside the first panel (Its an animation) even if the second panel is the selected panel(i.e the one you can see) the updated panel appears on the screen. Why is this and how can i circumvent this behaviour?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

妄司 2024-08-30 08:42:09

< JComponent 的 code>update() 方法“不会清除背景”,因此您可能需要明确执行此操作。 JTabbedPane 通常不需要使用 < a href="http://java.sun.com/javase/6/docs/api/javax/swing/JComponent.html#update%28java.awt.Graphics%29" rel="nofollow noreferrer">更新()。也许 sscce 显示您的使用情况可能会有所帮助。

附录 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);
        }
    }
}

The update() method of JComponent "doesn't clear the background," so you may need to do that explicitly. Typical examples of JTabbedPane don't usually require using update(). Perhaps an sscce showing your usage might help.

Addendum 1: It's not clear why you are calling update(). Below is a simple animation that does not exhibit the anomaly.

Addendum 2: See Painting in AWT and Swing: paint() vs. update(). You may want to use repaint() in actionPerformed() instead.

enter image description here

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);
        }
    }
}
寄居人 2024-08-30 08:42:09

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

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

阅读 Swing 教程中关于自定义绘制的部分执行此操作的正确方法。对于动画,请阅读教程中的“如何使用 Swing Timer”。

when update(g) is called on a panel
inside the first panel (Its an
animation)

Overriding the update(...) method is an old AWT trick and should never be used with Swing.

Read the section from the Swing tutorial on Custom Painting for the proper way to do this. And for animation read up on "How to Use Swing Timer" found in the tutorial as well.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文