[英]JButton text not changing
所以我的代碼基本上有一個帶有一些文本字段和一個JButton
的JPanel
,當用戶點擊按鈕時它轉到按鈕監聽器,然后從文本字段中獲取數據並處理它,創建JLabels
,它將它添加到另一個看不見的JPanel
。 然后,我使第一個JPanel不可見,並使第二個面板可見,揭示我生成的“結果”。
這一切都有效,但問題是,當我的程序處理從文本字段獲取的數據時,我希望JButton
改變它所說的內容,我已經嘗試過使用event.getSource().setText()
,我能夠發現它正在更改按鈕文本(通過打印到控制台),但它沒有更新帶有更改文本的按鈕。
在此之后我嘗試了所有形式的重新驗證並重新繪制和驗證,但沒有一個工作。 有任何想法嗎? 謝謝!
//entryPanel is the first panel, and picksPanel is the second panel
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
((JButton)event.getSource()).setText("Thinking...");
revalidate();
repaint();
try
{
CriticPick picks = new CriticPick(cityfield.getText(),statefield.getText());
LinkedList<Movie> pickslist = picks.getList();
glayout.setRows(pickslist.size()+2+thepicks.movnum);
picksPanel.add(new JLabel("The Results:"));
//In my actual code I do a bunch of processing and looping that results in jlabels being added to picksPanel
for (int i=0;i<pickslist.size();i++)
{
JLabel label = new JLabel(pickslist.get(i).title);
picksPanel.add(label);
}
}
catch (Exception exc)
{
System.out.println(exc);
}
entryPanel.setVisible(false);
picksPanel.setVisible(true);
}});
guiFrame.add(entryPanel);
guiFrame.add(picksPanel);
guiFrame.setLayout(new FlowLayout(FlowLayout.LEFT));
guiFrame.setVisible(true);
}
原因是在作業完成之前沒有處理任何繪制事件,因此當您認為它時, setText
的效果將不會顯示。
repaint()
只承諾“盡快”重新繪制(根據文檔),但由於繪制事件在與按鈕單擊事件(“事件調度線程”)相同的線程上處理,因此您的處理有效地導致setText
調用和面板隱藏/顯示在作業完成后同時發生(可以這么說)。
如果您的工作需要相當長的時間,那么阻止EDT與數據運算工作的效果是顯而易見的 - 由於EDT沒有任何機會重新繪制,處理調整大小/鼠標點擊事件等,UI將變得完全沒有響應。
重處理應該在后台線程中完成,最好是借助SwingWorker
。 這使EDT可以自由處理油漆(和其他)事件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.