2

JTabbedPane に 2 つの JPanels があり、最初のパネル (アニメーション) 内のパネルで update(g) が呼び出されると、2 番目のパネルが選択されたパネル (つまり、表示されているパネル) であっても、更新されたパネルが画面。これはなぜですか?また、この動作を回避するにはどうすればよいですか?

4

2 に答える 2

5

「背景をクリアしない」というupdate()方法なので、明示的に行う必要があるかもしれません。JComponentの典型的なJTabbedPaneは、通常、を使用する必要はありませんupdate()。おそらく、使用状況を示すsscceが役立つ場合があります。

補遺1:なぜあなたが呼んでいるのかは明らかではありませんupdate()。以下は、異常を示さない単純なアニメーションです。

補遺2:AWTおよびSwingでのペイント:paint()とupdate()を参照してください。repaint()代わりにで使用することをお勧めします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 チュートリアルのセクションをお読みください。また、アニメーションについては、チュートリアルにある「スイングタイマーの使用方法」も参照してください。

于 2010-02-27T22:57:08.587 に答える