#java #swing
#java #swing
Вопрос:
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) не должен ничего делать, если диалоговое окно уже видно.
Вся эта ситуация меня очень смущает.
Комментарии:
1. Я исправил эту проблему, используя JFrame вместо JDialog, но я не понимаю, почему в jdialog создается несколько диалоговых окон, но в jframe этого не происходит.
Ответ №1:
Дело в том, что вы не можете сделать это в одном потоке (например, вы предварительно настраиваете его в своей демонстрации) — setVisible
всегда будет блокироваться (подождите, пока диалоговое окно не закроется), и display
до этого не будет вызван другой вызов.
Попробуйте запустить его в многокадровом env (как вы заявили, что ваше приложение), но измените display
на
public void display(String str){
l.setText(str);
if(dg.isVisible()){
dg.setVisible(true);
}
}
Таким образом, диалоговое окно не будет отображаться, если оно уже видно, но текст будет изменен. Условием для его работы является то, что это не последовательные вызовы display
, подобные в demo, но из разных потоков. Другого пути нет. setVisible
всегда будет блокироваться.