Разрешить только 1 (дочерний) JFrame на экране


У меня есть главный JFrame. Внутри рамки есть кнопка. Когда я нажимаю кнопку, она открывает дочерний кадр.

Но я хочу, чтобы только один дочерний кадр был открыт в любое время, (вместо этого, когда я снова нажимаю кнопку, она дает мне второй дочерний кадр и т. д...).

Итак, я добавил actionListener к кнопке, чтобы сделать ее отключенной, когда открывается дочерний фрейм, и добавить windowListener к дочернему фрейму, так что когда я нажимаю кнопку Закрыть в правом верхнем углу, она сделайте кнопку (на основной раме) способной.

Вот мой код:

 import java.awt.Button;
 import java.awt.EventQueue;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 import javax.swing.JButton;

 import javax.swing.JFrame;

 public class Form1 extends JFrame implements ActionListener{
 JButton btn1=new JButton("help");

public Form1() {
    super("Form 1");
    this.add(btn1);        
    setSize(200, 200);
    btn1.addActionListener(this);
    setVisible(true);
}

public void actionPerformed(ActionEvent e) {
    if(e.getSource()==btn1){
        btn1.setEnabled(false);
        final Form2 x= new Form2();
        x.addWindowListener(new WindowAdapter(){
        @Override
        public void windowClosing(WindowEvent e){
        x.dispose();
        btn1.setEnabled(true);


    }    

    });
    }        
}

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable(){

        @Override
        public void run() {
             new Form1();

        }
});    

}
}  

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Form2 extends JFrame {
JLabel lbl1=new JLabel("đang mở form 2 - trợ giúp");    
public Form2() {
    super();
    add(lbl1);
    setVisible(true);
    setSize(200, 200);


}



}  

Итак, мой вопрос: есть ли другой способ, чтобы я мог открыть только один дочерний фрейм (это означает, что когда этот дочерний фрейм открывается, нажатие кнопки в главном фрейме ничего не делает, если этот дочерний фрейм не закрыт)?

3 3

3 ответа:

Это кажется прекрасным способом, Но да, есть и другие способы. Ваш класс может сохранить ссылку на дочернюю переменную JFrame в качестве переменной-члена. Кнопка может проверить, является ли этот член null или удален, и если да, то создать новый; но в противном случае она может просто вывести существующий дочерний элемент на передний план.

Вместо этого используйте модальный диалог. Подробнее см. В разделе Как создавать диалоги.

Диалог может бытьмодальным . Когда модальный диалог виден, онблокирует пользовательский ввод во все другие окна программы . JOptionPane создает JDialogs, которые являются модальными. Чтобы создать немодальный диалог, необходимо использовать класс JDialog напрямую.

Постройте Form2 заранее и используйте setVisible(true), чтобы показать его, и setVisible(false), чтобы скрыть его. Вот в качестве примера:

if(e.getSource()==btn1){ 
    btn1.setVisible(false); // not really needed if you disable form1 on btn1 press
    form2.setVisible(true);  // show form2
    form1.setVisible(false); // hide form1
}