Разрешить только 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 ответа:
Это кажется прекрасным способом, Но да, есть и другие способы. Ваш класс может сохранить ссылку на дочернюю переменную
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 }