用了證據,contrie,這聽起來像你在事件調度線程的上下文中循環。
這意味着,直到退出循環(和方法),JTextArea
的內容將不會被更新到屏幕
Swing是一個單線程環境。事件派發線程負責處理繪畫請求等。阻止此線程的任何內容都將阻止它處理繪畫更新。
還要求您對用戶界面的所有更新和交互,從美國東部時間範圍內完成了...
你有幾個選項...
你可以使用一個javax.swing.Timer
,這將允許觸發一個ActionEvent
定期基地,這是在EDT的情況下觸發。這意味着當計時器「等待」時,它不會阻止EDT ...
您可以使用SwingWorker
,它允許您在後臺線程中執行處理,但爲您提供了返回結果的能力publish
在EDT和process
這些在美國東部時間內更新...
退房Concurrency in Swing更多細節
與例如
javax.swing.Timer
AC更新ts作爲一種循環(全部是一個不受控制的循環)。每個時期都會觸發。你需要治療,就好像你剛纔循環的另一次迭代,並根據需要更新UI的狀態...
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TextTimer {
public static void main(String[] args) {
new TextTimer();
}
public TextTimer() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public static final String[] TEXT = new String[]{
"Why, you wanna tell me how to live my life?",
"Who, are you to tell me if it's black or white?",
"Mama, can you hear me? Try to understand.",
"Is innocence the difference between a boy and a man?",
"My daddy lived the lie, that's just the price that he paid",
"Sacrificed his life, just slavin' away.",
"",
"Ohhh, if there's one thing I hang onto,",
"That gets me through the night.",
"I ain't gonna do what I don't want to,",
"I'm gonna live my life.",
"Shining like a diamond, rolling with the dice,",
"Standing on the ledge, I show the wind how to fly.",
"When the world gets in my face,",
"I say, Have A Nice Day.",
"Have A Nice Day",
"",
"Take a look around you; nothing's what it seems",
"We're living in the broken home of hopes and dreams,",
"Let me be the first to shake a helping hand.",
"Anybody brave enough to take a stand,",
"I've knocked on every door, on every dead end street,",
"Looking for forgiveness,",
"what's left to believe?",
"",
"Ohhh, if there's one thing I hang onto,",
"That gets me through the night.",
"I ain't gonna do what I don't want to,",
"I'm gonna live my life.",
"Shining like a diamond, rolling with the dice,",
"Standing on the ledge, I show the wind how to fly.",
"When the world gets in my face,",
"I say, Have A Nice Day.",
"Have A Nice Day.",
"",
"[Guitar Solo]",
"",
"Ohhh, if there's one thing I hang onto,",
"That gets me through the night.",
"I ain't gonna do what I don't want to,",
"I'm gonna live my life.",
"Shining like a diamond, rolling with the dice,",
"Standing on the ledge, I show the wind how to fly.",
"When the world gets in my face,",
"I say, Have A Nice Day.",
"Have A Nice Day.",
"Have A Nice Day.",
"Have A Nice Day.",
"Have A Nice Day.",
"",
"When The world keeps trying, to drag me down,",
"I gotta raise my hands, I'm gonna stand my ground.",
"Well I say, Have A Nice Day.",
"Have A Nice Day",
"Have A Nice Day"
};
public class TestPane extends JPanel {
private JTextArea ta;
private int currentLine = 0;
public TestPane() {
setLayout(new BorderLayout());
ta = new JTextArea(20, 40);
add(new JScrollPane(ta));
Timer timer = new Timer(500, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String text = TEXT[currentLine];
ta.append(text + "\n");
ta.setCaretPosition(ta.getText().length());
currentLine++;
if (currentLine >= TEXT.length) {
((Timer)e.getSource()).stop();
}
}
});
timer.start();
}
}
}
這沒有任何意義。你用什麼GUI,哪個Text組件?你可以發佈一些代碼或一些截圖嗎?你是說你希望他們分開行,或者你想看到某種動畫? – Link19
一次一個或全部列表,它有什麼不同? – Rakesh
顯示您的嘗試代碼,並且有人可能會提供幫助。 – kiheru