2013-05-18 106 views
3

enter image description here我的Swing GUI不更新。爲什麼?

所以,我提出在用戶具有添加或刪除面板的能力的GUI。爲了模擬這一點,我做了一個TimerTask,它取目標JPanel的名稱和包含JPanel的父項。
它倒數爲0,之後它將從父項中刪除JPanel,並在父項和祖父項上調用repaint()

儘管舊面板被刪除,但父項中包含的其他組件不能代替它。從圖中可以看出,滾動條仍然表示2個組件。

我必須手動向下拖動滾動條才能看到它發生了變化,這就是當下面的組件取代它的位置時。

爲什麼會發生這種情況?

這裏是如何的組件嵌套:因爲JPanels與從XML文件中的數據填充,並使用JAXB所以

JScrollPane (grandparent) 
| 
|-> JPanel (parent) 
    | 
    |-> JPanel (target) 

SSCCE是不可能的..這是不可能的:(但這裏是一個從TimerTask

import java.util.TimerTask; 
import javax.swing.*; 

public class RemoverTask extends TimerTask{ 
    StudentPanel s; 
    JPanel h; 
    JScrollPane p; 
    public RemoverTask(StudentPanel s,JPanel holder,JScrollPane pane){ 
     this.s = s; 
     h = holder; 
     p = pane; 
    } 

    @Override 
    public void run(){ 
     long x = Integer.MAX_VALUE/2; 
     JFrame frame = new JFrame("Counter"); 
     JTextArea area = new JTextArea(); 
     JScrollPane pane = new JScrollPane(area); 
     pane.setPreferredSize(new java.awt.Dimension(350, 350)); 
     frame.add(pane); 
     frame.pack(); 
     frame.setVisible(true); 
     while(x > 100){ 
      x = x - 1500; 
      area.append("Value of X: " + x + "\n"); 
     } 
     if(!frame.isVisible()){ 
      frame.dispose(); 
     } 
     h.remove(s); 
     h.repaint(); 
     pane.repaint(); 
    } 
} 
+2

你仍然可以做一個sscce,只是不用擔心xml數據等。簡化問題,男人。另外,不要使用帶Swing應用程序的java.util.Timer,而要使用javax.swing.Timer。包含'JScrollPane'的'JFrame'上的 –

回答

3

片斷您仍然可以使一個SSCCE,只是不擔心XML數據等簡化問題,男人。另外,不要使用java.util.Timer中有一個Swing應用程序,而是一個javax.swing.Timer,一個Swi ng定時器。否則,你會擺動擺動擺動鞦韆EDT是危險的。

問題:你永遠不會在容器上調用revalidate()。在對容器進行更改時,通常會呼叫revalidate(),然後致電repaint()。重新驗證告訴佈局管理器佈置它們的組件,這是改變GUI所必需的。

+0

? –

+0

@LittleChild:無論你從哪個容器中刪除組件或添加組件。 –

+0

'在對容器進行更改時調用repaint()之前'revalidate()。重新驗證告訴佈局管理者佈置他們的組件,這是改變GUI所必需的。「你確定**之前**嗎? –