プロが教える店舗&オフィスのセキュリティ対策術

先日は、お世話になりました。
再度質問をさせていただきたく思います。

JWindow、JFrameでJDialogと同等の処理をしようと自作しております。
大体はできたのですが、モーダル化ができません。

親画面でsetEnable(false)で操作できないようにし、
子画面でボタンが押されたら、dispase()するのと同時に、親画面を
setEnable(ture)にして操作可能にすることはできるのですが、
この処理では、親画面が子画面を呼び出した後も、
親画面の処理は進んでしまいますよね。

子画面でボタンが押下されるまで親画面の処理をとめるにはどのようにすればいいのでしょうか。

javaのバージョンは1.4です。
よろしくお願いいたします。

A 回答 (1件)

//何の検証もない、"信頼できない"コードを書いてみました。


//どこまで正しいのかわからないので、
//仕事には使いたくない感じですが。

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;


class MyEQ extends EventQueue{
public void d(AWTEvent e){dispatchEvent(e);}
}


public class Demo implements ActionListener{
boolean blocking;static Frame f;
static MyEQ myEQ=new MyEQ();
{Toolkit.getDefaultToolkit().getSystemEventQueue().push(myEQ);}

public static void main(String[] args){
f=new Frame("Main Frame");
Button b=new Button("モーダルダイアログ表示");
b.addActionListener(new Demo());f.add(b);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.pack();f.setVisible(true);
}

public void actionPerformed(ActionEvent e){
System.out.println("start");
modalStart();
System.out.println("end");
}

private void eventPump(){
AWTEvent event=null;
while(blocking){
try{event=myEQ.getNextEvent();}catch(Exception e){}
myEQ.d(event);
}
}

private void modalStart(){
MyDialog d=new MyDialog("モーダルダイアログ",this);
f.setEnabled(false);d.setVisible(true);
blocking=true;eventPump();
}

void modalEnd(){
blocking=false;f.setEnabled(true);
}
}

class MyDialog extends Frame{
Demo demo;
MyDialog(String title,Demo demo){
super(title);
this.demo=demo;
Button b=new Button("(^^)");
b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("(^^)");
}
});
add(b);pack();
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) {
MyDialog.this.demo.modalEnd();dispose();
}
});
}
}
    • good
    • 0
この回答へのお礼

ソースコードの添付ありがとうございました。
参考にさせていただきます。

お礼日時:2007/05/29 13:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!