ProgressBar и цикл. Как совместить?

331
07 июня 2017, 02:37

Как сделать что бы работал прогресс бар в модальном окне?
Ибо пока не закрою диалог, код дальше не выполняется.
Сделал такой пример:

package testModalProgressBar;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
public class MainClass {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createFrame();
            }
        });
    }
    private static void createFrame() {
        JFrame frame = new JFrame("main frame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setPreferredSize(new Dimension(250, 70));
        JButton bt = new JButton("клац");
        frame.getContentPane().add(bt);
        frame.pack();
        frame.setVisible(true);
        bt.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                ModalProgressBar mpb = new ModalProgressBar(10);
                for(int i = 0; i < 10; i++) {
                    try {
                        Thread.sleep(150);
                    } catch (InterruptedException e) {e.printStackTrace();}
                    mpb.inc();
                    System.out.println(i);
                }
                mpb.close();
            }
        });
    }
}
class ModalProgressBar extends JDialog {
    private static final long serialVersionUID = 1L;
    private JProgressBar jpb;
    public ModalProgressBar(int max) {
        super();
        setTitle("Прогресс...");
        setModal(true);
        jpb = new JProgressBar(0, max);
        add(BorderLayout.CENTER, jpb);
        //setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
        setSize(250, 50);
        setResizable(false);
        setLocationRelativeTo(null);
        setVisible(true);
    }
    public void inc() {
        jpb.setValue(jpb.getValue()+1);
    }
    public void close() {
        setVisible(false);
        dispose();
    }
}  

Не могу сообразить, так что в данном случае делать с потоками? Как с помощью них это распараллелить?

UPD: Придумал такой вариант, но он не красивый:

    private static void createFrame() {
        JFrame frame = new JFrame("main frame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setPreferredSize(new Dimension(250, 70));
        JButton bt = new JButton("клац");
        frame.getContentPane().add(bt);
        frame.pack();
        frame.setVisible(true);
        bt.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                ModalProgressBar mpb = new ModalProgressBar(49);
                Thread t = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        for(int i = 0; i < 50; i++) {
                            try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}
                            mpb.inc();
                            System.out.println(i);
                        }
                        mpb.close();
                    }
                });
                t.start();
                mpb.setVisible(true);
            }
        });
    }
}

class ModalProgressBar extends JDialog {
    private static final long serialVersionUID = 1L;
    private JProgressBar jpb;
    public ModalProgressBar(int max) {
        super();
        setTitle("Прогресс...");
        setModal(true);
        jpb = new JProgressBar(0, max);
        jpb.setStringPainted(true);
        add(BorderLayout.CENTER, jpb);
        //setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
        setSize(250, 47);
        setResizable(false);
        setLocationRelativeTo(null);
        //setVisible(true);
    }
    public void inc() {
        jpb.setValue(jpb.getValue()+1);
    }
    public void close() {
        setVisible(false);
        dispose();
    }
READ ALSO
LocalDateTime to Date

LocalDateTime to Date

Мне нужно конвертировать дату, хранящуюся в переменной типа LocalDateTime в формате (год,месяц,день,час,минута) в формат миллисекунд, прошедших...

340
VK api login activity

VK api login activity

Привет друзья! Как в VK API сделать свою активити с логином как показано на рисунке 2?

346
Записать текст с консоли в файл

Записать текст с консоли в файл

Как сделать что бы данная строка не прерывала вывод в консоль, но при этом продолжала записывать в файл

346
Возможно ли добавить и выполнить макрос в Excel файле из java-кода?

Возможно ли добавить и выполнить макрос в Excel файле из java-кода?

Возможно ли добавить макрос в Excel файл динамически, с помощью java-кода, и выполнить его так же?

240