2011-10-02 162 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與圖像,這解決了它