Netbeansでは、コンポーネントを追加してダブルクリックしてイベントを編集できるフレームフロントエンドを使用するGUIプロジェクトを作成しました。私は、 "ソース"、 "デザイン"、 "履歴"タブを持つウィンドウを参照しています。java SwingWorkerダイアログが表示されない
1 - ファイル選択を開くボタン:ここ
は、コンポーネントと関係しています。
2 aファイルセレクタの結果を示す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());
}
P.Sを:私はSwingWorkerのコードはhereを説明しました。
私は操作ループ(遅延)が実行されないされないので、それがバックグラウンドタスクが実行されている疑い。もっと説明してください。 – mahmood
あなたは 'doInBackground'メソッドで何も印刷しないことを知っていますか? 'if(result!= JFileChooser.APPROVE_OPTION){'が 'true'でない限り、動作していることは間違いありません。私はまた、 'get'がブロックメソッドであることは間違いないと思います。更新された例を試してください。それでも動作しない場合は、問題を示す実行可能なサンプルを提供する必要があります。もう1つの問題は、作業者が非常に速く完了し、画面が閉じられる前に閉じられることです。 – MadProgrammer
'addPropertyChangeListener'に関連するインポート行はどれですか? – mahmood