java(swing)で、登録ボタンを押すとファイルを読み込みDBに登録する処理です。
その処理で、登録ボタンを押すと、ダイアログを起動して、処理中とメッセージ表示したいのですが、データが多く、画面が固まった状態になり、メッセージが表示されないのです。何かいい方法ありますでしょうか?
*******************************************************************
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class topMain {
public static void main(String[] args) {
//メニュー画面を起動する
topMain frame = new topMain();
frame.topFrame();
}
private void topFrame() {
JFrame jf = new JFrame();
//フレームのサイズ設定
jf.setSize(1000, 600);
jf.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
jf.getContentPane().setLayout(null);
JButton b1 = new JButton("登録ボタン");
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//ダイアログボックスを開く
//ダイアログボックスは起動するが、
//メッセージが表示されない、
//おそらく大きいデータを読むとき画面が固まるため
//重いファイルを読み込む
//DB登録処理
//ダイアログを閉じる
}
});
jf.getContentPane().add(b1);
b1.setBounds(40, 400, 240, 100);
jf.setVisible(true);
}
}
*******************************************************************
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
意味がいまいち分からないんだけど
DBから読み込むデータが多くて
VMへの負荷が高くて
ダイアログにメッセージを表示する余裕がない
ってこと?
だとしたら、読み込みを開始する前に
ダイアログを表示すれば良いんじゃない?
この回答への補足
回答ありがとうございます。
以下のソースを実行したとき、LABEL「実行中」の値を表示したいのですが、ダイアログが固まった状態になり、値が表示されないのです。
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class topMain {
public static void main(String[] args) {
//メニュー画面を起動する
topMain frame = new topMain();
frame.topFrame();
}
private void topFrame() {
JFrame jf = new JFrame();
//フレームのサイズ設定
jf.setSize(1000, 600);
jf.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
jf.getContentPane().setLayout(null);
JButton b1 = new JButton("登録ボタン");
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//ダイアログボックスを開く
JDialog jd =new JDialog();
jd.setTitle("ddddddddd");
jd.getContentPane().add(new JLabel("実行中"),BorderLayout.CENTER);
//jd.getContentPane().setLayout(null);
jd.setBounds(10, 10, 50, 20);
jd.setSize(100,100);
jd.setVisible(true);
//ファイルを読み込む
long i=0;
while(true){
if(i==800000000){
break;
}
i++;
//ダイアログを閉じる
jd.dispose();
System.out.println("END");
}
});
jf.getContentPane().add(b1);
b1.setBounds(40, 400, 240, 100);
jf.setVisible(true);
}
}
No.2
- 回答日時:
actionPerformedメソッドはswingでの表示や入力などを処理している唯一のスレッドであるイベントディスパッチスレッド上で呼ばれ実行される。
したがってactionPerformed内で時間の掛かる処理をすることは表示処理などを行う機会が失われるのでこれを行ってはならない。
替わりにactionPerformed内では時間の掛かる処理を開始する機会だけを与えて、その処理自体は別スレッドで行うようにする。
例えばactionPerformed内を以下のような感じに。
final JDialog d = new JDialog();
d.add(new JLabel("ファイル読み込み&DB登録中"));
d.pack();
d.setVisible(true);
new Thread(new Runnable() {
public void run() {
...時間の掛かる処理をここに記述...
SwingUtilities.invokeLater(new Runnable() {
public void run() {
d.setVisible(false);
d.dispose();
}
});
}
}).start();
「時間の掛かる処理を行った後、ダイアログを閉じる」という処理をrunメソッドに書き、それを別スレッドで実行する。
上の例は非モーダルダイアログの場合で、モーダルダイアログの場合はsetVisible(true)した時点でダイアログが閉じられるまで処理が先に進まなくなるので、
final JDialog d = new JDialog((JFrame)null, true);
final JProgressBar pb = new JProgressBar();
pb.setIndeterminate(true);
pb.setStringPainted(true);
d.add(pb);
d.pack();
d.addWindowListener(new WindowAdapter() {
@Override public void windowOpened(WindowEvent e) {
new Thread(new Runnable() {
public void run() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
pb.setString("ファイルから読み込み中");
}
});
...時間の掛かる読み込み処理をここに記述...
SwingUtilities.invokeLater(new Runnable() {
public void run() {
pb.setString("DBへ登録中");
}
});
...時間の掛かる登録処理をここに記述...
SwingUtilities.invokeLater(new Runnable() {
public void run() {
d.setVisible(false);
d.dispose();
}
});
}
}).start();
}
});
d.setVisible(true);
のようにダイアログを開いた時点でスレッドを開始するようにWindowListenerを前もってダイアログに登録しておく方法が考えられる。
もし進捗状況まで示したいならJProgressBarやProgressMonitor、ProgressMonitorInputStreamなどが結構便利だと思う。
また、別スレッドでの実行を記述する場合に1.6以降ならSwingWorkerの使用を検討してみてもいいかも。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アコーディオンメニューをアン...
-
重たい処理のタイムアウト強制終了
-
JavaScriptからJAVAクラスを呼...
-
ExcelVBA で文字列の特定の文字...
-
jQueryの処理順序について
-
ツリー型 多階層メニューでの...
-
数値の定数を付ける時
-
tryの終了
-
Tomcat高負荷時の設定について
-
C#の処理をリアルタイムに表示...
-
JSP、サーブレットの初期処理
-
再度、スレッドが実行中かどう...
-
SwingUtilities.invokeLater(ne...
-
処理実行後、終了させないで最...
-
jQueryでdiv作成後まで待ってか...
-
「タイプ初期化子が例外をスロ...
-
エクセルVBAで、条件に一致する...
-
配列の重複する値とその個数を...
-
複数の変数を宣言する時、同時...
-
オブジェクト参照がオブジェク...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
tryの終了
-
Javaでのデバッグコード削除
-
Tomcat高負荷時の設定について
-
JavaScriptからJAVAクラスを呼...
-
[Java] while(true)の意味
-
数値の定数を付ける時
-
ラジオボタンの選択判定
-
JSP、サーブレットの初期処理
-
JavaでVBのDOEVENTSと同様の処...
-
JAVAからJAVASCRIPT関数を呼び出し
-
doGetとdoPostの違い
-
Delphiのマルチスレッドの割り...
-
C#で別スレッドの終了を知りたい
-
SwingUtilities.invokeLater(ne...
-
FocusLostでイベント処理を中断...
-
onBlurとonFocusの処理順序につ...
-
アコーディオンメニューをアン...
-
JAVAにおける画像のJPEG保存の...
-
Tomcatのスレッドを破棄する方法
-
C#でバックグラウンド処理から...
おすすめ情報