我使用.show()
之前的「阻塞」代碼像一個while循環。但即使.show被調用,UI實際上也不會顯示被調用的面板。Java CardLayout .show()沒有顯示
這裏是展示問題的代碼: (警告:該代碼包含了一段真正的循環。)
import javax.swing.JFrame;
import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JButton;
public class CardTest extends JFrame{
public CardTest() {
CardLayout cl = new CardLayout(0,0);
getContentPane().setLayout(cl);
JPanel panelA = new JPanel();
getContentPane().add(panelA, "PanelA");
JLabel lblPanelA = new JLabel("Panel A");
panelA.add(lblPanelA);
JButton btnSwitchToPanel = new JButton("Switch to Panel B");
panelA.add(btnSwitchToPanel);
JPanel panelB = new JPanel();
getContentPane().add(panelB, "PanelB");
JLabel lblPanelB = new JLabel("Panel B");
panelB.add(lblPanelB);
btnSwitchToPanel.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent event) {
cl.show(getContentPane(), "PanelB");
getContentPane().revalidate();
// Here is the problem. Even though cl.show is called first,
// it still doesn't show, before the while loop has terminated.
int i = 0;
while(i < 1000000){
i++;
System.out.println(i);
}
}
});
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setVisible(true);
}
public static void main(String[] args){
new CardTest();
}
}
如果你想知道,我需要這一個下載器,其中同時實現真正的循環(下載文件)在按下第一個面板中的按鈕後調用。第二個面板包含進度條。但即使在下載代碼之前調用.show函數,進度面板也不會顯示。
UPDATE
我知道,把循環進入一個新的線程,解決了平局的問題,但它也介紹了其他的問題,因爲我依靠的功能順序執行的循環(下載文件後(循環),Unzipp文件,移動這些文件...)。
最好的解決方案是找到一種方法讓.show()調用在繼續循環之前真正花時間切換窗格。
你需要的是這樣的:http://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/ui/ex/ProgressBarForDataFetching.java我建立這個的方式,ProgressBar本質上註冊了一個偵聽器對於更多正在加載的數據,在更多數據被提取時更新進度,然後調用重新繪製,以便UI線程可以重新繪製它以顯示更多進度。你可以在你的代碼中使用這個類,或者用它作爲你如何實現你想要做的事的一個例子 – ControlAltDel
'因爲我在循環後依賴於函數的順序執行 - 所以把所有代碼放在Thread中好。文件的複製與GUI無關。或者,如果您正在使用針對每個複製文件的消息更新GUI,則代碼需要在EDT上執行。這就是爲什麼我建議使用SwingWorker的原因,因爲您可以在結果可用時發佈結果。 – camickr
@camickr這就是我最終做的。我只是想避免在一個單獨的線程中有一些部分,因爲它們都屬於一個序列。但「SwingWorker」實際上是一個好主意。我不知道它的功能。我可以使用回調函數繼續執行下一個函數並保留序列,但最終我認爲它太多了,我使用了「在新線程中刪除序列的以下部分」的解決方案。 – Haeri