import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
class Demo implements ActionListener
{
JFrame f;
JButton b;
DisplayDialog dialog;
public Demo()
{
f = new JFrame();
f.setSize(200,200);
b = new JButton("Click me");
f.add(b);
dialog = new DisplayDialog();
b.addActionListener(this);
f.setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
Object o = e.getSource();
if(o==b)
{
dialog.display("Hello");
dialog.display("Hello");
dialog.display("Hello");
dialog.display("Hello");
dialog.display("Hello");
}
}
public static void main(String args[])
{
Demo d = new Demo();
}
class DisplayDialog implements ActionListener
{
JDialog dg;
JLabel l;
JButton b;
Font myfont;
public DisplayDialog()
{
dg = new JDialog(f,"Alert!",true);
dg.setSize(300,150);
l = new JLabel("Message");
b = new JButton("OK");
myfont = new Font("Serif",Font.BOLD,12);
l.setFont(myfont);
dg.add(l);
dg.add(b,"South");
dg.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
b.addActionListener(this);
}
public void actionPerformed(ActionEvent e)
{
Object o = e.getSource();
if(o==b)
{
dg.setVisible(false);
}
}
public void display(String str)
{
if(dg.isVisible())
dg.setVisible(false);
l.setText(str);
dg.setVisible(true);
}
}
}
单击该按钮时,将出现5对话框。现在我想在DisplayDialog类中进行这样的更改,以便每次调用显示方法时,先前打开的对话框都会关闭,而最新的对话框是唯一可见的对话框。
我试过这样做:
public void display(String str)
{
if(dg.isVisible())
dg.setVisible(false);
l.setText(str);
dg.setVisible(true);
}
但它没有做任何事情。 此外,即使只有一个对象实例,我也会惊讶地看到多个对话框出现。根据我的理解,如果对话框已经可见,setVisible(true)不应该做任何事情。
这种情况对我来说非常混乱。
答案 0 :(得分:0)
问题是你无法在单个线程中执行此操作(就像您在演示中预先设置的那样) - setVisible
将始终阻止(等待对话框关闭)并且另一个display
调用将不会调用到那时。
尝试在多帧环境中运行它(就像你已声明你的应用程序一样)但是将display
更改为
public void display(String str){
l.setText(str);
if(dg.isVisible()){
dg.setVisible(true);
}
}
如果此对话框已经可见,则不会显示该对话框,但会更改文本。它的工作条件是,不是像演示一样对display
进行连续调用,而是来自不同的线程。没有别的办法了。 setVisible
会阻止。