2010-02-27 56 views
2

我在JTabbedPane中有2個JPanel,當第一個面板(它的動畫)內的面板上調用更新(g)時,即使第二個面板是選定的面板(即可以看到的面板)更新的面板出現在屏幕上。爲什麼是這樣,我怎樣才能繞過這種行爲?JTabbedPane擺動更新錯誤

回答

5

update()方法JComponent「不清除背景」,因此您可能需要明確地執行此操作。 JTabbedPane的典型examples通常不需要使用update()。顯示您的使用情況的sscce可能會有所幫助。

附錄1:不清楚你爲什麼打電話update()。下面是一個不顯示異常的簡單動畫。

附錄2:見Painting in AWT and Swing: paint() vs. update()。您可能想用repaint()代替actionPerformed()

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); 
     } 
    } 
} 
+0

我沒有在JTabbedPane上調用更新,它在JTabbedPane中某個面板內的組件上調用,問題是組件總是被繪製到屏幕上,即使面板中駐留的是isn' t選定的面板。 – dominic 2010-02-27 22:25:25

+0

將更新()添加到您的ActionPerformed()會造成我的問題。 – dominic 2010-02-28 01:50:30

+0

查看上面添加的鏈接。 – trashgod 2010-02-28 03:09:49

2

時更新(克)稱爲面板 在第一面板內(它的一個 動畫)

重寫更新(...)方法是一種老式的AWT技巧,不應該與Swing一起使用。

請閱讀Swing教程Custom Painting的部分,以獲取正確的方法。對於動畫,請閱讀教程中的「如何使用Swing Timer」。

+0

+1覆蓋'update()'?誰知道! – trashgod 2010-02-27 23:20:40

+0

重寫甚至調用update()會如何導致像我一樣的問題? – dominic 2010-02-27 23:59:30

+0

IIUC,它將AWT和Swing混合在一起。 – trashgod 2010-02-28 03:05:52