当前位置: 首页 > 面试题库 >

用SwingWorker打开JDialog吗?

汝开畅
2023-03-14
问题内容

我有一个使用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打开的负载?


问题答案:

这有点棘手,SwingWorker在显示之前,您需要先启动JDialog,但同时也需要使对话框可见,以免阻塞代码的其他方面。

本示例使用PropertyChangeListener附件来SwingWorker监视STARTED状态,这时将进度对话框设置为可见,但使用进行此操作SwingUtilities.invokeLater,以免阻塞当前事件执行过程…

然后,它使用SwingWorkerdone方法在对话框完成时关闭对话框…

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来进行数据库更新,并创建了一个模态JDialog来向用户显示正在发生的事情(使用JProgressBar)。模态对话框的defaultCloseOperation设置为DO_NOTHING,因此只能通过适当的调用将其关闭- 我使用。 SwingWorker在doInBackgrou

  • 问题内容: 我必须查询数据库以获取要写入的数据并加速打开对话框 我没有创建任何文本,并在完成处理后设置了文本 但是文字没有更新 有什么办法可以做到这一点 这是我对话框的src代码: 问题答案: 为了使您能够进行后台工作,您需要调用方法。如果您不添加它,那么…它将不知道何时开始工作。就像其他任何变量一样: 但是,如果您从未将其添加到任何内容(或未添加到),则将永远不会添加/执行该内容。 在构造函数内

  • 问题内容: 当我打开自定义JDialog以及关闭对话框以再次继续时,如何使我的应用程序暂停。 问题答案: 只需使用: 我通常从的构造函数中调用它。 请参阅中的Javadocs 。 http://java.sun.com/javase/6/docs/api/java/awt/Dialog.html#setModal(boolean) 这将导致执行在当前线程上阻塞,直到对话框关闭。 或者,您可以使用:

  • 你好,我正在制作一个简单的桌面应用程序,我正在设计用户界面。我正在使用NetBeans快速设计它。我确实看了很多网站和博客来寻找答案,但是找不到正确的答案。我是UI设计新手。您的答复/建议将不胜感激。 问题是: 我在应用程序中有一个JFrame。这个Jframe有几个JPanel,当用户登录应用程序时,这些JPanel被设置为可见/不可见状态。其中两个面板默认设置为不可见状态(我使用了将它们设置为

  • 场景如下: 将windowOpened()处理程序添加到JDialog的新实例 首次使用jdialog显示对话框。setVisible(true) 如预期:windowOpened()处理程序已触发 jdialog。setVisible(false) jdialog。setVisible(true) 预期,但未发生:windowOpened()处理程序已触发 当我的模态对话框第一次出现在屏幕上时,

  • 我正在创建一个测验,并创建了一个具有JFrame的类,它的作用类似于主菜单。在这个菜单上,我创建了一个JButton,我想打开单独的JDialog(其中包含问题等)。 JDialog是一个名为QuestionDialog.java独立类 这里是我在主菜单JFrame类中的代码,特别是我要打开新JDialog public static void main(String[]args){SwingUt