GUI-在JTextPane上逐行显示一行,并创建一个相关的JProgressBar [英] GUI - Display lines one by one on a JTextPane and make a related JProgressBar
问题描述
如何在JTextPane
上逐行显示并制作相关的JProgressBar
?
How to display lines one by one on a JTextPane
and make a related JProgressBar
?
我有这个循环:
int k;
for (k=0; k<array_TXT.length; k++) {
if (array_TXT[k] != null) {
textPane.append( array_TXT[k] );
}
}
我想在几秒钟后在JTextPane
上的每一行array_TXT[k]
(字符串)一个接一个地添加,并且必须将其同步到JProgressBar
.
I'd like to append every line array_TXT[k]
(string) on the JTextPane
one by one after few seconds and it has to be synchronized to a JProgressBar
.
通过这种方式,每次k
具有不同的值时,它将打印在文本窗格上,并且进度条将始终与这些打印相关.
In this way every time k
has a different value it will print on the text pane and the progress bar will always be related to those prints.
我已经阅读过有关Thread.sleep(x);
的信息,但我不知道该放在哪里以达到我的目标.
I have read about Thread.sleep(x);
but I don't know where to put it in order to reach my aim.
推荐答案
您将要使用 SwingWorker
.它将使您可以在事件调度线程之外的后台执行更新.
You'll want to use a SwingWorker
. It will allow you to execute the updates in the background, off the Event Dispatching Thread.
SwingWorker具有允许您publish
和process
更新回到事件调度线程的方法.
The SwingWorker has methods to allow you to publish
and process
updates back to the Event Dispatching Thread.
它还允许您触发和监视进度更新
It also allows you to fire and monitor progress updates
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ProgressMonitor;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TestProgress {
public static void main(String[] args) {
new TestProgress();
}
public TestProgress() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JProgressBar pb = new JProgressBar();
JTextArea ta = new JTextArea(10, 20);
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new JScrollPane(ta));
frame.add(pb, BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
new BackgroundWorker(ta, pb).execute();
}
});
}
public class BackgroundWorker extends SwingWorker<Void, String> {
private JProgressBar pb;
private JTextArea ta;
public BackgroundWorker(JTextArea ta, JProgressBar pb) {
this.pb = pb;
this.ta = ta;
addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equalsIgnoreCase(evt.getPropertyName())) {
BackgroundWorker.this.pb.setValue(getProgress());
}
}
});
}
@Override
protected void done() {
}
@Override
protected void process(List<String> chunks) {
for (String text : chunks) {
ta.append(text);
ta.append("\n");
}
}
@Override
protected Void doInBackground() throws Exception {
for (int index = 0; index < 100; index++) {
publish("Line " + index);
setProgress(index);
Thread.sleep(125);
}
return null;
}
}
}
Swing Timer示例
如安德鲁(Andrew)所建议,以下是使用SwingTimer
的示例.如果您觉得有用,请给安德鲁赞扬一下.
Swing Timer Example
As suggest by Andrew, the following is an example of using a SwingTimer
. If you find it useful, please give Andrew credit for the idea
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingWorker;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TestProgress {
public static void main(String[] args) {
new TestProgress();
}
private int index = 0;
public TestProgress() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
final JProgressBar pb = new JProgressBar();
final JTextArea ta = new JTextArea(10, 20);
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new JScrollPane(ta));
frame.add(pb, BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
Timer timer = new Timer(250, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
index++;
if (index >= 100) {
((Timer)(e.getSource())).stop();
}
ta.append("Line " + index + "\n");
pb.setValue(index);
}
});
timer.setRepeats(true);
timer.setCoalesce(true);
timer.start();
}
});
}
这篇关于GUI-在JTextPane上逐行显示一行,并创建一个相关的JProgressBar的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!