GUI-在JTextPane上逐行显示一行,并创建一个相关的JProgressBar [英] GUI - Display lines one by one on a JTextPane and make a related JProgressBar

查看:94
本文介绍了GUI-在JTextPane上逐行显示一行,并创建一个相关的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具有允许您publishprocess更新回到事件调度线程的方法.

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆