2011-10-02 522 views
13

我正在使用Java进行项目,并且在点击该特定按钮JFrame后需要重新加载整个JFrame。这个怎么做?如何刷新或重新加载JFrame?

+3

你是什么意思'刷新'?它是否“将所有组件返回到首次放入框架时的状态”,“更换组件”,还有其他的东西? –

+0

是在运行时添加/删除JComponent,还是更改大小,需要重新布局..., – mKorbel

+0

您正在用JFrame做什么。请亲近它。 ? –

回答

23

尝试

SwingUtilities.updateComponentTreeUI(frame); 

如果仍不能再完成上述步骤尝试

frame.invalidate(); 
frame.validate(); 
frame.repaint(); 
+4

-1 for updateComponentTreeUI:当最可能的目标仅仅是重新加载数据时,这几乎是**总是**错误的事情(它重新设置UI代表)。 – kleopatra

+1

_reload frame_不是一个技术术语,无论它应该是什么意思,updateComponentTree都是** NOT **答案。事实上,这个问题是太不确定,不能回答,所以投票结束 – kleopatra

0

您应使用此代码

this.setVisible(false); //this will close frame i.e. NewJFrame 

new NewJFrame().setVisible(true); // Now this will open NewJFrame for you again and will also get refreshed 
+6

坏问题吸引不好的答案(这就是为什么建议关闭问题 - 失败; - )*没有* - 无论问题的真正问题,创建一个新的框架是*不*解决方案。你不会因为需要一些新的油漆而拆掉你的房子,对吧? – kleopatra

+0

@kleopatra不,他不会。 – Ibrahim

0

试试这个代码之后的工作。我也遇到了同样的问题,但我解决了一些问题。

public class KitchenUserInterface { 

    private JFrame frame; 
    private JPanel main_panel, northpanel , southpanel; 
    private JLabel label; 
    private JButton nextOrder; 
    private JList list; 

    private static KitchenUserInterface kitchenRunner ; 

    public void setList(String[] order){ 
     kitchenRunner.frame.dispose(); 
     kitchenRunner.frame.setVisible(false); 
     kitchenRunner= new KitchenUserInterface(order); 

    } 

    public KitchenUserInterface getInstance() { 
     if(kitchenRunner == null) { 
      synchronized(KitchenUserInterface.class) { 
       if(kitchenRunner == null) { 
        kitchenRunner = new KitchenUserInterface(); 
       } 
      } 
     } 


     return this.kitchenRunner; 
    } 

    private KitchenUserInterface() { 


     frame = new JFrame("Lullaby's Kitchen"); 
     main_panel = new JPanel(); 
     main_panel.setLayout(new BorderLayout()); 
     frame.setContentPane(main_panel); 



     northpanel = new JPanel(); 
     northpanel.setLayout(new FlowLayout()); 


     label = new JLabel("Kitchen"); 

     northpanel.add(label); 


     main_panel.add(northpanel , BorderLayout.NORTH); 


     frame.setSize(500 , 500); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    private KitchenUserInterface (String[] order){ 
     this(); 
     list = new JList<String>(order); 
     main_panel.add(list , BorderLayout.CENTER); 

     southpanel = new JPanel(); 
     southpanel.setLayout(new FlowLayout()); 

     nextOrder = new JButton("Next Order Set"); 
     nextOrder.addActionListener(new OrderUpListener(list)); 
     southpanel.add(nextOrder); 
     main_panel.add(southpanel, BorderLayout.SOUTH); 



    } 

    public static void main(String[] args) { 
     KitchenUserInterface dat = kitchenRunner.getInstance(); 
     try{ 

     Thread.sleep(1500); 
     System.out.println("Ready"); 
     dat.setList(OrderArray.getInstance().getOrders()); 
     } 
     catch(Exception event) { 
      System.out.println("Error sleep"); 
      System.out.println(event); 
     } 


     } 

} 
3

只是使用 frame.setVisible(false); frame.setVisible(true); 我有这个问题与JLabels与图像,这解决了它