Java 漫长的过程和中期结果

Java 漫长的过程和中期结果,java,swing,user-interface,Java,Swing,User Interface,我有功能 公共字符串名称函数(){ while(true){ StringBuilder a=新的StringBuilder(); //做点什么 返回a; } } 现在我想创建GUI和JButton 但我想在单击此按钮后,在每次循环后从namefunction()获取结果。我怎么做 public void actionPerformed(ActionEvent e){ 如果(e.getSource().equals(myButton1)){ tekst4.setText(namefunctio

我有功能

公共字符串名称函数(){
while(true){
StringBuilder a=新的StringBuilder();
//做点什么
返回a;
}
}
现在我想创建GUI和JButton

但我想在单击此按钮后,在每次循环后从
namefunction()
获取结果。我怎么做

public void actionPerformed(ActionEvent e){
如果(e.getSource().equals(myButton1)){
tekst4.setText(namefunction());
}
}

这里是一个非常基本的示例,使用
SwingWorker
从长
while
循环中接收和显示中间和最终结果。
(为了方便和简单,可以将整个代码复制粘贴到
SwingMain.java
并运行)

导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.util.List;
导入java.util.concurrent.ExecutionException;
导入javax.swing.DefaultListModel;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JList;
导入javax.swing.JPanel;
导入javax.swing.SwingWorker;
公务舱SwingMain{
公共静态void creategui(){
JFrame f=新JFrame(“SwingWorker演示”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 setLocationRelativeTo(空);
f、 添加(新的TestPanel());
f、 包装();
f、 setVisible(真);
}
公共静态void main(字符串[]args){
creategui();
}
}
类TestPanel扩展了JPanel{
私有最终默认列表模型列表模型;
私家侦探;
私人最终JLabel最终结果;
私人最终按钮启动;
测试面板(){
setLayout(新边界布局(2,2));
开始=新的JButton(“开始”);
addActionListener(e->start());
添加(开始,BorderLayout.PAGE_开始);
listModel=新的DefaultListModel();
JList interimResults=新的JList(listModel);
interimResults.setPreferredSize(新维度(150200));
添加(interimResults,BorderLayout.CENTER);
finalResults=新的JLabel(“-等待最终结果-”);
添加(最终结果,边框布局。第页\结束);
}
私有void start(){
start.setEnabled(false);;
swingWorker=新的MyWorker();
swingWorker.execute();
}
/*阶级摇摆工人
T-此SwingWorker的返回的结果类型
doInBackground和get方法
V-该SwingWorker的操作员用于执行中间结果的类型
发布和处理方法
*/
类MyWorker扩展了SwingWorker{
//长过程(工作)是用这种方法完成的
@凌驾
受保护的字符串doInBackground()引发异常{
int计数器=0;
StringBuilder结果=新建StringBuilder();
while(计数器<10){
append(String.valueOf(counter));
发布(result.toString());//临时结果
计数器++;
睡眠(500);
}
返回result.toString();//结束结果
}
//此方法用于处理临时“已发布”结果列表
@凌驾
受保护的无效进程(列表块){
for(字符串s:块){
listModel.addElement;
}
}
//完成时调用
@凌驾
受保护的void done(){
试一试{
setText(“最终结果:+get());
}捕获(InterruptedException | ExecutionException ex){
例如printStackTrace();
}
}
}
}



此函数是否将作为线程的一部分运行?@MitchelPaulin没有代码不是“作为线程的一部分运行”。如果函数在while块中返回(无条件地如上所述),则while无效,您可以将其删除。不,需要此“while”。但是这个函数中的代码太长了,我想向您展示一下它的总体工作原理。您可以使用
publish
方法获得中间结果,使用
done
获得最终结果。
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.List;
import java.util.concurrent.ExecutionException;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.SwingWorker;

public class SwingMain {

    public static void creategui(){

        JFrame f = new JFrame("SwingWorker Demo");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocationRelativeTo(null);
        f.add(new TestPanel());
        f.pack();
        f.setVisible(true);
    }

    public static void main(String[] args) {
        creategui();
    }
}

class TestPanel extends JPanel {

    private final DefaultListModel<String> listModel;
    private MyWorker swingWorker;
    private final JLabel finalResults;
    private final JButton start;

    TestPanel() {
        setLayout(new BorderLayout(2, 2));
        start = new JButton("Start");
        start.addActionListener(e->start());
        add(start, BorderLayout.PAGE_START);

        listModel = new DefaultListModel<>();
        JList<String> interimResults = new JList<>(listModel);
        interimResults.setPreferredSize(new Dimension(150,200));
        add(interimResults, BorderLayout.CENTER);

        finalResults = new JLabel("- waiting for final results - ");
        add(finalResults, BorderLayout.PAGE_END);
    }

    private void start() {
        start.setEnabled(false);;
        swingWorker = new MyWorker();
        swingWorker.execute();
    }

    /*Class SwingWorker<T,V>
          T - the result type returned by this SwingWorker's
              doInBackground and get methods
          V - the type used for carrying out intermediate results by this SwingWorker's
              publish and process methods
     */
    class MyWorker extends SwingWorker<String, String> {

        //long process (work) is done in this method
        @Override
        protected String doInBackground() throws Exception {

            int counter = 0;
            StringBuilder result = new StringBuilder();

            while(counter < 10){
                result.append(String.valueOf(counter));
                publish(result.toString()); //interim result
                counter++;
                Thread.sleep(500);
            }

            return result.toString(); //end result
        }

        //This method is processing List of interim "published" results
        @Override
        protected void process(List< String> chunks) {
            for (String s : chunks) {
                listModel.addElement(s);
            }
        }

        //invoked when done
        @Override
        protected void done() {
            try {
                finalResults.setText("Final result: "+ get());
            } catch (InterruptedException | ExecutionException ex) {
                ex.printStackTrace();
            }
        }
    }
}