JFrame中動態添加或者刪除JPanel后總是不正確顯示需要的界面問題:
1.刪除panel后還是顯示之前的界面,新刪除的panel在界面上並沒有被刪除;
2.刪除panel1后添加新的panel2,只顯示刪除panel1后的界面,新添加的panel2不顯示;
盡管使用了Pane().repaint();重繪方法,照理來說是可以重新繪制新的界面的,但是界面並沒有更新。
那么這里就分兩種情況處理:
1.刪除或者添加一個非JFrame的直接子控件。
scrollPanel.removeAll();//刪除scrollPanel的所有子控件,或者scrollPanel.remove(comp);刪除scrollPanel的某個控件。
scrollPanel.updateUI();
這里一定要用updateUI()函數,當scrollPanel的內容或者說界面發生變化時需要更新其UI顯示。添加也同理。
contentPanel.add(keyLable);//contentPanel添加一個控件
contentPanel.updateUI();
2.刪除一個JFrame的直接子控件。
resultFrame.getContentPane().remove(exceptionLabel);//JFrame刪除其直接子控件exceptionLabel
resultFrame.getContentPane().repaint();
因為JFrame沒有updateUI()函數,所以這里使用重繪函數repaint();
3.JFrame動態添加一個控件,不管這個控件是否還有很多子控件,情況都一樣,可以對其子控件使用updateUI()函數。
但是,這還遠遠不夠,你會發現不管添加了什么控件,這個時候界面就是沒有更新。
原因是JFrame沒有更新。
你可以嘗試放大或者縮小窗口,界面就更新了。
那么怎么處理呢?不可能每次都要放大或縮小窗口吧,所以,這里就需要對JFrame進行刷新其界面的操作。
方法1.重新顯示窗體。
resultFrame.getContentPane().add(scrollPanel); resultFrame.setVisible(false); resultFrame.setVisible(true);
方法2.重新驗證窗體。
resultFrame.getContentPane().add(scrollPanel);
resultFrame.invalidate();
resultFrame.validate();
方法3.重置其窗體大小。
resultFrame.getContentPane().add(scrollPanel);
resultFrame.pack();
resultFrame.setSize(1000, 600);
方法遠不止上面這幾種,但是僅通過這個方法resultFrame.getContentPane().repaint();這個一定是不行的,他不會真正同步重新更新JFrame,除非有外界因素更新到JFrame,不然界面是不會刷新的。