簡體   English   中英

未顯示Java SwingWorker對話框

[英]java SwingWorker dialog is not shown

在Netbeans中,我創建了一個GUI項目,該項目使用框架前端,可以添加組件並雙擊以編輯其事件。 我指的是具有“源”,“設計”和“歷史”選項卡的窗口。

以下是組件和關系:

1-打開文件選擇器的按鈕。

2-一個TextArea以顯示文件選擇器的結果。 如果用戶選擇一個文件,它將在TextArea中顯示文件名; 否則會寫“被用戶取消”。

3-同時,如果用戶選擇一個文件,我想打開一個“請稍候”對話框,打開SwingWorker並在后台做一些工作。

問題是,當用戶選擇文件時,我看不到“請稍候”對話框! Netbeans生成的完整代碼可從pastebin獲得 部分代碼如下所示:

private void OpenSongFileActionPerformed(java.awt.event.ActionEvent evt) {                                              
    // TODO add your handling code here:
    JFileChooser fileChooser = new JFileChooser();
    fileChooser.setAcceptAllFileFilterUsed(false);
    FileNameExtensionFilter filter = new FileNameExtensionFilter("MP3 files", "mp3");
    fileChooser.addChoosableFileFilter(filter);
    fileChooser.setCurrentDirectory(new File(System.getProperty("user.dir")));
    int result = fileChooser.showOpenDialog(this);
    if (result != JFileChooser.APPROVE_OPTION) {
        //ReadInfo.setText("No song has been selected");
        System.out.println("OpenSongFile canceled by user");
        return;
    }
    final JDialog loading = new JDialog(this);
    JPanel p1 = new JPanel(new BorderLayout());
    p1.add(new JLabel("Please wait..."), BorderLayout.CENTER);
    loading.setUndecorated(true);
    loading.getContentPane().add(p1);
    loading.pack();
    loading.setLocationRelativeTo(this);
    loading.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
    loading.setModal(true);
    SwingWorker<String, Void> worker = new SwingWorker<String, Void>() {
        @Override
        protected String doInBackground() throws InterruptedException {
            for (int i = 0; i < 10000; i++) 
                for (int j = 0; j < 10000; j++) 
                    ;
            return "hello";
        }
        @Override
        protected void done() {
            loading.dispose();
        }
    };
    worker.execute();
    loading.setVisible(true);
    try {
        worker.get();
    } catch (Exception e1) {
        e1.printStackTrace();
    }

    File selectedFile = fileChooser.getSelectedFile();
    ReadInfo.setText("Selected file: " + selectedFile.getAbsolutePath());
}                              

PS:我使用了此處解釋的SwingWorker代碼。

worker.get(); 將一直阻塞,直到SwingWorker返回為止,這意味着您正在阻塞EDT,從而阻止顯示對話框。

相反,請使用SwingWorkerPropertyChangeListener支持並監視STARTDONE事件

SwingWorker<String, Void> worker = new SwingWorker<String, Void>() {
    @Override
    protected String doInBackground() throws InterruptedException {
        Thread.sleep(5000);
        return "hello";
    }

    @Override
    protected void done() {
        loading.dispose();
    }
};
worker.addPropertyChangeListener(new PropertyChangeListener() {
    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        System.out.println(evt.getPropertyName());
        Object value = evt.getNewValue();
        if (value instanceof SwingWorker.StateValue) {
            SwingWorker.StateValue state = (SwingWorker.StateValue) value;
            switch (state) {
                case DONE: {
                    try {
                        String result = worker.get();
                        JOptionPane.showMessageDialog(null, result);
                    } catch (InterruptedException | ExecutionException ex) {
                        ex.printStackTrace();
                    }
                }
                break;
            }
        }
    }
});
worker.execute();
loading.setVisible(true);

另一個問題是您的循環可能運行得如此之快,以至於窗口在屏幕上實現之前就已關閉。

例如,我只是使用Thread.sleepdoInBackground方法暫停5秒鍾...

import java.awt.BorderLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

public class Memory extends JFrame {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                makeItSo();
            }
        });
    }

    public static void makeItSo() {
        final JDialog loading = new JDialog();
        JPanel p1 = new JPanel(new BorderLayout());
        p1.add(new JLabel("Please wait..."), BorderLayout.CENTER);
        loading.setUndecorated(true);
        loading.getContentPane().add(p1);
        loading.pack();
        loading.setLocationRelativeTo(null);
        loading.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
        loading.setModal(true);
        SwingWorker<String, Void> worker = new SwingWorker<String, Void>() {
            @Override
            protected String doInBackground() throws InterruptedException {
                Thread.sleep(5000);
                return "hello";
            }

            @Override
            protected void done() {
                loading.dispose();
            }
        };
        worker.addPropertyChangeListener(new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                System.out.println(evt.getPropertyName());
                Object value = evt.getNewValue();
                if (value instanceof SwingWorker.StateValue) {
                    SwingWorker.StateValue state = (SwingWorker.StateValue) value;
                    switch (state) {
                        case DONE: {
                            try {
                                String result = worker.get();
                                JOptionPane.showMessageDialog(null, result);
                            } catch (InterruptedException | ExecutionException ex) {
                                ex.printStackTrace();
                            }
                        }
                        break;
                    }
                }
            }
        });
        worker.execute();
        loading.setVisible(true);
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM