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