モードレスJDialogは内容を表示しません
-
27-10-2019 - |
質問
(Java SE 6)プログラムが時間をかけて作業を行っている間に「待ってください」メッセージを表示するポップアップダイアログを作成しようとしています。これを行うには、モードレスJDialogを使用することを選択したため、プログラムが実行され続けて機能している間に機能します(モーダルのものを使用すると、ユーザーがダイアログが閉じるまでプログラムが停止します) 。
問題は、この方法でモットレスのダイアログを使用すると、タイトルを持つjdialogが表示されますが、内容が表示されないことです(何らかの理由で塗装されないと推測しています)。私は塗り直しなどを呼びかけようとしましたが、何もうまくいかないようです。
さて、インターウェブ上の多くの人々によると、これはスイングを伴う本物のバグであり、私が見つけた唯一の答えは、このように物事を行わず、ユーザーに待つように通知する他の手段を見つけることです。ここにいる誰かが以前にこの問題を抱えていて、仕事を見つけたのか興味があります。
ありがとう!
解決
別の方法として、使用を検討してください SwingWorker
これで示唆されているように、暫定的な進歩を示しています 例.
他のヒント
それはバグではありません。メインスレッドの隣のSEPREDスレッドで、重い重量の仕事と軽量のスイングジョブを実行する必要があります。ダイアログGUIスレッドと、バックラウンドでの重い慎重なジョブとの関係との関係の間の論理的な影響のために必要です。メインスレッドが分類されていない場合、一部の通知イベントにより、スイングドローが阻止されます。私は同じ問題を抱えていたので、JDialogで表示するためにJFRAMEから始めたFTPアップロードの進捗状況を監視しようとしました。
最初に試した:
//Activated by Upload Button
public void actionPerformed(ActionEvent e) {
if("Upload".equals(e.getActionCommand())){
// some Declarations
new Thread(){
public void run() {
/*Run JDialog with the Upload - ProgressBar*/
FileUploadProgressBar fileUploadProgressBar = new FileUploadProgressBar(localFile, remoteFile, ftpPersistence);
}
}.start();
/*Run the heavy weigth Job - the Upload*/
ftpPersistence.uploadFile(localFile, remoteFile);
// ...
}
//...
}
しかし、このようにして、私はjdialog frameborderとバルクのコンテンツペインを獲得しますが...
次に試してみてください:
//Activated by Upload Button
public void actionPerformed(ActionEvent e) {
if("Upload".equals(e.getActionCommand())){
// some Declarations
new Thread(){
public void run() {
/*Run JDialog with the Upload - ProgressBar*/
FileUploadProgressBar fileUploadProgressBar = new FileUploadProgressBar(localFile, remoteFile, ftpPersistence);
}
}.start();
new Thread(){
public void run()
/*Run the heavy weigth Job - the Upload*/
ftpPersistence.uploadFile(localFile, remoteFile);
}
}.start();
// ...
}
//...
}
そして最後にそれはうまくいきました、それが役立つことを願っています;)
私はこれを使用していますが、それは機能します - 元のコード(実行中に塗り直すために見つけた修正なし)はここからです:http://inversionconsulting.blogspot.com/2008/03/java-jdialog-and-jprogressbar-example.html
しかし、私はそれを(わずかな変更で)に統合しました:
JProgressBar pb = new JProgressBar(0,100);
pb.setPreferredSize(new Dimension(275,30));
pb.setString("Running");
pb.setStringPainted(true);
pb.setValue(0);
JLabel label = new JLabel("Progress: ");
JPanel center_panel = new JPanel();
center_panel.add(label);
center_panel.add(pb);
JDialog dialog = new JDialog((JFrame)null, "Working ...");
dialog.getContentPane().add(center_panel, BorderLayout.CENTER);
dialog.pack();
dialog.setVisible(true);
dialog.setLocationRelativeTo(null); // center on screen
後でコードでは、ループを実行しているとき(変数「tot」を使用して1〜10)ダイアログを塗り直し、プログラムがループを実行するときに進行状況バーを更新します。ページ上のリンク)(私は複数のスレッドを使用していません、これはすべてメインスレッドにあります):
//set progress bar
pb.setValue(tot*10);
//repaint it
dialog.getContentPane().paintAll(pb.getGraphics());
このソリューションを見つけるには、多くの時間と試行錯誤が必要でした。それが私と同じようにあなたのために働くことを願っています。
やってみました 検証() (コンテナにコンポーネントを追加した後に必要です)?また、ソースコードの投稿を検討して、確認することができます。幸運を。