Долгий процесс с промежуточными результатами - PullRequest
0 голосов
/ 24 июня 2019

у меня есть функция

public String namefunction(){
    while(true){
        StringBuilder a = new StringBuilder();
        //do something
        return a;
    }
}

А теперь я хотел бы создать GUI и JButton.

Но я хотел бы получить результат от namefunction() после каждого цикла после нажатия этой кнопки. Как я могу это сделать?

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

1 Ответ

1 голос
/ 24 июня 2019

Вот очень простой пример использования SwingWorker для получения и отображения промежуточного и окончательного результата из длинного цикла while.
(Для удобства и простоты весь код можно скопировать в SwingMain.java и запустить)

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();
            }
        }
    }
}



enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...