2010-04-21 152 views
2

我有一个屏幕,其中的一个组件根据布尔值而变得不可见。如果在创建屏幕后布尔值发生变化,如何刷新屏幕以考虑这一点?Java刷新屏幕

回答

1

在需要布置的容器上调用validate()方法 - 可能是窗口的内容窗格。

1

尝试拨打repaint(),然后打电话给paintComponent()

3

我认为revalidate()更适合在这里,如果你正在处理JComponents。

根据JavaDoc:

支持延迟自动布局。

调用invalidate,然后将此组件的validateRoot添加到需要验证的组件列表。在所有当前未决事件分派后进行验证。换句话说,在调用此方法之后,将验证在向上移动此组件的包含层次结构时找到的第一个validateRoot(如果有)。默认情况下,JRootPane,JScrollPane和JTextField从isValidateRoot返回true。

当属性值发生变化时,此组件的大小,位置或内部布局受到影响时,将自动在此组件上调用此方法。这种自动更新不同于AWT,因为程序通常不再需要调用验证来更新GUI的内容。

1

我认为(用Java 6?)你不需要做任何事......这应该会自动发生 - 不是吗?

通过下面的例子,它会自动发生...

public class TT extends JFrame 
{ 
    public TT() 
    { 
     setLayout(new FlowLayout()); 
     JLabel label = new JLabel(); 
     label.setText("Label:"); 
     add(label); 

     final JTextField textField = new JTextField(); 
     add(textField); 

     JButton button = new JButton(); 
     button.setText("Button"); 
     button.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent event) 
      { 
       if (textField.isVisible()) 
       { 
        textField.setVisible(false); 
       } 
       else 
       { 
        textField.setVisible(true); 
       } 
      } 
     }); 
     add(button); 
    setSize(100,100); 
    } 

    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       TT frame = new TT(); 
       frame.setDefaultCloseOperation(TT.EXIT_ON_CLOSE); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

[添加]并使用布局管理器一样GridBagLayout也将解决“重新铺设出”的页面的问题。