- PR -

モーダル形式のダイアログの終了をハンドリングしたいのですが。。。

1
投稿者投稿内容
ぷりん
会議室デビュー日: 2004/11/09
投稿数: 1
投稿日時: 2004-11-09 19:34
はじめまして。
現在、Java Swing にてメイン・ウィンドウ(JFrame)からダイアログ(JDialog)をモーダルで表示させて、ダイアログ内の「キャンセル」ボタン処理の後に何らかの処理をメイン・ウィンドウをで行いたいのですが、現在、いくつか不明点があります。

@myDialog.show(); でダイアログを表示させたとき
なぜか、「キャンセル」ボタンを2回おさなければならない。

Awhile (!myDialog.isVisible());でダイアログを表示させたとき
「キャンセル」ボタンを押すとメインウィンドウがハングアップする。。。

もし、本件に関する情報をご存知の方がいましたらご教授いただけると幸いです。

環境
OS:Windows2000 pro
java:1.4.2_06

ソース(見にくいかと思いますが、動作はすると思いますので、参考までに。)
import java.awt.*;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Dimension;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.border.*; // BevelBorderクラスを使う
import javax.swing.event.*; // JSliderクラスを使う
import javax.swing.tree.*;
import java.io.*;

import java.util.*;
import javax.swing.table.*;

public class TestDialog extends JFrame
implements MouseListener
, MouseMotionListener
{
static MyDialog myDialog;

Point pt = new Point(0, 0);
Container cont = null;
JPanel p1 = new JPanel();
JPanel p2 = new JPanel();

JButton btnDialog ; //ダイアログの表示
JButton btnExit ; //閉じる

//垂直方向のツールバーオブジェクトを作成
JToolBar tb1 = new JToolBar(JToolBar.HORIZONTAL);
JToolBar tb2 = new JToolBar(JToolBar.HORIZONTAL);
JToolBar tb3 = new JToolBar(JToolBar.HORIZONTAL);

public boolean bFirstPathAnalyze = true;

boolean bFreezeFlag = false;

JScrollPane scrollpane = new JScrollPane();
JPanel panelPathAnalyze = new JPanel();
JToolBar tbButton = new JToolBar(JToolBar.VERTICAL); //垂直方向のツールバーオブジェクトを作成

/****************************************************************/
/* createButton() */
/****************************************************************/
Font pb_bFont = new Font("Monospaced", Font.PLAIN, 11);
private JButton createButton( String str ) {
JButton btn = new JButton( str );
return( btn );
}

/**
* Main()
*/
public static void main(String[] argv){

JFrame m = new TestDialog();
m.show(); // 表示する
}//main end

/**
* AdminTool()
*/
public TestDialog(){
super("AdminTool");

cont = getContentPane();
//////////////////////////////////////////////////////
// デフォルトの終了処理を設定する
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//////////////////////////////////////////////////////

// マウスリスナを登録する
addMouseListener(this);
// マウスモーションリスナを登録する
addMouseMotionListener(this);

setSize( 600, 400 );

toolbar();
addActionListener();

validate();
repaint();

}//AdminTool() end

/**
* toolbar()
*/
public void toolbar() {

btnDialog = new JButton( "ダイアログの表示..." );
btnExit = new JButton( "閉じる" );

p1.add(btnDialog);
p2.add(btnExit);

// ダイアログボックスを作成する
myDialog = new MyDialog( this );


// コンテナにパネル1を追加する
cont.add( p1, BorderLayout.NORTH);
cont.add( p2, "South" );
}//toolbar()


/**
* addActionListener()
*/
void addActionListener() {

//ダイアログの表示
btnDialog.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
myDialog.setVisible(true);

//「キャンセル」ボタンを2回おさなければならない。。。
myDialog.show();

//「キャンセル」ボタンを押すとメインウィンドウがハングアップする
// while (!myDialog.isVisible());


System.out.println( "キャンセル・ボタンがおされました。" );

}//actionPerformed()
}//ActionListener()
);

//閉じる
btnExit.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}//actionPerformed()
}//ActionListener()
);

}//addActionListener()

/**
* MouseEventに関する7つのメソッドを実装する
*/
public void mouseClicked(MouseEvent e) {
pt = e.getPoint();
// 更新再描画を要求する
}

public void mouseEntered(MouseEvent e) {
// カーソルをハンドカーソルに変更する
setCursor(new Cursor(Cursor.HAND_CURSOR));
}

public void mouseExited(MouseEvent e) {
// 現在の描画位置をリセットしておく
pt.move(0, 0);
// カーソルをポインタカーソルに変更する
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}

public void mousePressed(MouseEvent e) {
pt = e.getPoint();
// 更新再描画を要求する
}
public void mouseDragged(MouseEvent e) {
pt = e.getPoint();
// 更新再描画を要求する
}

public void mouseReleased(MouseEvent e) {}

public void mouseMoved(MouseEvent e) {}

}




class MyDialog extends JDialog
{

// RGBカラーを保持する変数
Color color = Color.black;
Container cont;
JPanel panel;
public boolean pb_bFirst = true;

public int pb_nCurrentPathNo = 1;
public boolean pb_bCancel = false;

Font pb_bFont = new Font("Monospaced", Font.PLAIN, 11);
private JButton createButton( String str ) {
JButton btn = new JButton( str );
btn.setFont( pb_bFont );
return( btn );
}

/**
* 引数付きコンストラクタ
*/
public MyDialog(JFrame frame ) {
// ウィンドウのタイトルと非モーダルなモードを設定する
super(frame, "全般", true); //モーダル

// コンテントペインを取得する
cont = getContentPane();

setSize( 600, 400 );
setLocation(200 + 50, 150);

button();

toolbar();

// 最初は非表示とする
setVisible(false);
}//myDialog()

JButton btnApply;
JButton btnCancel;

JTextArea ta;
JPanel p1 = new JPanel( new GridLayout(1, 4, 20, 10) ); //グリッドレイアウトのパネル1を作成する
JPanel p2 = new JPanel( new GridLayout(1, 4, 20, 10) );
JPanel p3 = new JPanel( new GridLayout(1, 4, 20, 10) );
JToolBar tb1 = new JToolBar(JToolBar.VERTICAL); //垂直方向のツールバーオブジェクトを作成
JToolBar tb2 = new JToolBar(JToolBar.VERTICAL); //垂直方向のツールバーオブジェクトを作成

/**
* toolbar()
*/
public void toolbar()
{
//tb1,tb2 が追加されないようにクリアしておく
JPanel p1 = new JPanel( new GridLayout(1, 4, 20, 10) ); //グリッドレイアウトのパネル1を作成する
JPanel p2 = new JPanel( new GridLayout(1, 4, 20, 10) );
JPanel p3 = new JPanel( new GridLayout(1, 4, 20, 10) );

//CheckBox が追加されないようにクリアしておく
JToolBar tb1 = new JToolBar(JToolBar.VERTICAL); //垂直方向のツールバーオブジェクトを作成
JToolBar tb2 = new JToolBar(JToolBar.VERTICAL); //垂直方向のツールバーオブジェクトを作成

button();
if ( pb_bFirst ) {
pb_bFirst = false;
} else {
return;
}

//ボーダをペイントする
tb1.setBorderPainted(true);
tb2.setBorderPainted(true);

//ツールバーの浮動状態を禁止
tb1.setFloatable(false);
tb2.setFloatable(false);

//このコンポーネントのボーダを設定
tb1.setBorder(new TitledBorder(new EtchedBorder(), "解析"));
tb2.setBorder(new TitledBorder(new EtchedBorder(), "レポートへの出力"));

//解析
p1.add( tb1 );

p2.add( btnApply );
p2.add( btnCancel );

// コンテントペインを取得する
cont.add(p1, "North"); //JCheckbox
cont.add(p3, "West"); //JTable
cont.add(p2, "South"); //JButton

}

public void button()
{
btnApply = createButton( "適用" );
btnCancel = createButton( "キャンセル" );

//適用
btnApply.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
toolbar();
}//actionPerformed()
}//ActionListener()
);//btnApply.addActionListener

//キャンセル
btnCancel.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
setVisible(false);
// ウィンドウを破棄する
dispose();
System.out.println( "キャンセル" );

}
}
);
} //button() end
}



よろしくお願いします。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-11-09 19:46
1.WindowListenerで検索掛けてみてください。
2.イベントディスパッチスレッドのコンテキスト上でビジーウェイト
(while(ループ脱出条件式);)をかけるのは最悪です。イベントディス
パッチスレッド上での処理は、常に速やかに終了しなければなりません。
そうしないと、そのループを抜けるまで以降のイベントが何も処理され
なくなり、ご覧になったようなフリーズ状態になります。

何らかの非同期処理をその位置で行いたい場合は、通常スレッドを新しく
起こします。どちらにしても、ビジーウェイトはやっちゃダメですよ。


[ メッセージ編集済み 編集者: シュン 編集日時 2004-11-09 20:09 ]
1

スキルアップ/キャリアアップ(JOB@IT)