Java 与SwingWorker一起打开JDialog?
我有一个使用JPA的J2SE项目。在一些JDialogs中,我返回getResultList,并在类的构造函数中填充JTable、JComboBox、JList等 因此,当我为这些对话框创建任何实例时,有时速度会很慢 我认为使用SwingWorker和JProgressbar并创建一个加载来打开JDialogs是一个很好的解决方案,但我不知道如何做到这一点 我正在试这个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
//
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年后仍能找到您的有用贡献!谢谢你!