一个关于JDialog的问题!

时间:2008-01-16 12:57:56  来源:  作者:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Text{
private JFrame jf1,jf2;
private JButton b1,b2;
private JTextArea jta1,jta2;
private JDialog jd;
private JScrollPane jsp1,jsp2;
public Text(){
jf1=new JFrame("Text");
jf2=new JFrame("Frame");
b1=new JButton("Frame");
b2=new JButton("Dialog");
jta1=new JTextArea(20,15);
jta2=new JTextArea(20,15);
jta1.setEditable(false);
jta2.setEditable(false);
jsp1=new JScrollPane(jta1);
jsp2=new JScrollPane(jta2);
jd=new JDialog(jf1,"Dialog",true);
}

public void creatFrame(){
jf1.getContentPane().setLayout(new GridLayout(1,2));
jf1.getContentPane().add(b1);
jf1.getContentPane().add(b2);

b1.addMouseListener(new MouseAdapter(){
public void mouseReleased(MouseEvent e){
echoFrame();
jta1.setText(jta1.getText()+"Hello Frame!");
}
});

b2.addMouseListener(new MouseAdapter(){
public void mouseReleased(MouseEvent e){
jta2.setText(jta2.getText()+"Hello Dialog!");
echoDialog();

}
});

jf1.setSize(150,200);
jf1.setVisible(true);
jf1.pack();
}

public void echoFrame(){
jf2.getContentPane().add(jsp1);

jf2.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
jta1.setText("");
jf2.dispose();
}
});

jf2.setSize(90,90);
jf2.setVisible(true);
jf2.pack();
}

public void echoDialog(){
jd.getContentPane().add(jsp2);

jd.addWindowListener(new WindowAdapter(){
public void windownClosing(WindowEvent e){
jta2.setText("");
jd.dispose();
}
});

jd.setSize(150,90);
jd.setVisible(true);
jd.pack();
}

public static void main(String args[]){
Text t=new Text();
t.creatFrame();
}
}




当按Frame按钮的时候,产生一个JFrame 里面的有一句话“Hello Frame!”
关闭这个JFrame后再按这个按钮依然是这样的情况
但是当你按Dialog按钮的时候 问题出现了,第一次产生一个JDialog里面有一句话“Hello Dialog!”但是当你关闭这个Dialog后再看里面就是“Hello Dialog!Hello Dialog!”两句话了,但是我在程序里已经写明了关闭Dialog时将那个TextArea设置为空啊!而且在设置Dialog里的TextArea必须要setText,然后再产生窗口,不象Frame那样,顺序无所谓,请高手解释一下原因!



 sakulagi 回复于:2004-09-28 11:10:40

public void echoDialog(){
jd.getContentPane().add(jsp2);

jd.addWindowListener(new WindowAdapter(){
public void [color=red]windownClosing[/color](WindowEvent e){
jta2.setText("");
jd.dispose();


你没发现这里拼写错误了么?


 crystal8034 回复于:2004-09-28 14:26:53

这个地方是写错了!呵呵!~
不过
b2.addMouseListener(new MouseAdapter(){ 
public void mouseReleased(MouseEvent e){ 
jta2.setText(jta2.getText()+"Hello Dialog!"); 
echoDialog(); 

为什么Dialog一定要先 setText然后在显示窗口,但是Frame就可以先显示窗口再 setText


 sakulagi 回复于:2004-09-29 16:01:46

引用: jd=new JDialog(jf1,"Dialog",true); 
把true改成false就可以了。


 sakulagi 回复于:2004-09-29 16:15:35

问题出在setVisible()这个方法上。通常这个方法上是调用show(boolean)方法,然后调用show()或是hide()

这样你的引用:
 jd.setVisible(true); 


实际上调用了Dialog.show()这个方法(因为JDialog直接继承从Dialog了这个方法,没有覆盖它)。这样如果是一个modal dialog的话,那么Dialog.show()的javadoc说得很清楚,一直到dialog被关闭,这个show()方法都不会返回,这样你的echoDialog()方法也一直不会返回,自然也就没有调用setText()了。
解决的方法就是把jd的modal属性去掉。也就是在构造的时候,第三个参数设置成false。


 crystal8034 回复于:2004-09-30 08:43:29

OK!!明白了!!高人就是厉害!




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=415687
转载请注明作者名及原文出处


文章评论

共有 位网友发表了评论 查看完整内容