2013-05-18 43 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所必需的。“你确定**之前**吗? –