Java 与SwingWorker一起打开JDialog?

Java 与SwingWorker一起打开JDialog?,java,swing,jdialog,swingworker,jprogressbar,Java,Swing,Jdialog,Swingworker,Jprogressbar,我有一个使用JPA的J2SE项目。在一些JDialogs中,我返回getResultList,并在类的构造函数中填充JTable、JComboBox、JList等 因此,当我为这些对话框创建任何实例时,有时速度会很慢 我认为使用SwingWorker和JProgressbar并创建一个加载来打开JDialogs是一个很好的解决方案,但我不知道如何做到这一点 我正在试这个 // JProgressbar progress = new JProgressBar(); //custommer dia

我有一个使用JPA的J2SE项目。在一些JDialogs中,我返回getResultList,并在类的构造函数中填充JTable、JComboBox、JList等

因此,当我为这些对话框创建任何实例时,有时速度会很慢

我认为使用SwingWorker和JProgressbar并创建一个加载来打开JDialogs是一个很好的解决方案,但我不知道如何做到这一点

我正在试这个

//
JProgressbar progress = new JProgressBar();

//custommer dialog
JDialog custommer = new JDialog(); //here slow because I have List<Customer> and others lists
custommer.setModal(true);

private void openDialogs(JDialog dialog){
    progress.setVisible(true);
    progress.setIndeterminate(true);

    SwingWorker sw = new SwingWorker(){
        protected Object doInBackground(){
          //opening dialog
          dialog.setVisible(true);
          return null;
        }
    }

    //after opened
    protected void done(){
        progress.setVisible(false);
    }

}

如何打开JDialog并创建一个加载,以便使用SwingWorker和JProgressbar打开?

这里有一个棘手的问题,您需要在显示JDialog之前启动SwingWorker,但是您还需要让对话框在其他地方可见,以免阻塞代码的其他方面

此示例使用连接到SwingWorker的PropertyChangeListener来监视启动状态,此时它会将进度对话框设置为可见,但它使用SwingUtilities.invokeLater来执行此操作,以便不阻止当前事件执行过程

然后,它使用SwingWorker的done方法在对话框完成时关闭对话框

import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;

public class LongWaiting {

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

    public LongWaiting() {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {

                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }
                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JLabel("Loading stuff"));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

                Loader loader = new Loader(frame);
                loader.execute();

            }

        });
    }

    public class Loader extends SwingWorker {

        private ProgressPane progressPane;
        private JDialog dialog;

        public Loader(Frame owner) {
            progressPane = new ProgressPane();
            progressPane.setBorder(new EmptyBorder(5, 5, 5, 5));
            dialog = new JDialog(owner, "Loading", true);
            dialog.add(progressPane);
            dialog.pack();
            dialog.setLocationRelativeTo(owner);
            dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
            addPropertyChangeListener(new PropertyChangeListener() {
                @Override
                public void propertyChange(PropertyChangeEvent evt) {
                    if ("state".equals(evt.getPropertyName())) {
                        if (getState() == StateValue.STARTED) {
                            SwingUtilities.invokeLater(new Runnable() {
                                @Override
                                public void run() {
                                    if (getState() == StateValue.STARTED) {
                                        dialog.setVisible(true);
                                    }
                                }
                            });
                        } 
                    } 
                }
            });
        }

        @Override
        protected Object doInBackground() throws Exception {
            Thread.sleep(10000);
            return null;
        }

        @Override
        protected void done() {
            dialog.dispose();
        }

    }

    public class ProgressPane extends JPanel {

        private JLabel message;
        private JProgressBar pb;

        public ProgressPane() {
            message = new JLabel("Loading...");
            pb = new JProgressBar();
            pb.setIndeterminate(true);

            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            gbc.weightx = 1;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.insets = new Insets(2, 0, 2, 0);
            add(message, gbc);
            add(pb, gbc);
        }

    }

}

在将对话框设置为可见之前,您需要启动SwingWorker…@MadProgrammer How?2年后仍能找到您的有用贡献!谢谢你!