Подтвердить что ты не робот

Кнопка закрытия JDialog

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

JDialog создается путем явного вызова одного из конструкторов JDialog, а не путем вызова одного из методов из JOptionPane.

Я был очень удивлен, что не смог найти ответ на этот вопрос с помощью Google. Я ожидал, что проблема, которая так часто распространяется, будет широко освещаться на многих сайтах программирования. Довольно странно, что это не так.

4b9b3361

Ответ 1

import java.awt.event.*;
import javax.swing.*;

public class YourDialog extends JDialog implements ActionListener {

  JButton button;

  public YourDialog() {
     button = new JButton("Close");
     button.addActionListener(this);
     add(button);
     pack();
     setVisible(true);
  }

  public void actionPerformed(ActionEvent e) {
      dispose();
  }
}
  • закрыть только dialolg, используя dispose() метод родительский кадр не закрыт. причина, по которой JVM не прекращается.

Ответ 2

Вы можете отправить ActionListener a WindowEvent.WINDOW_CLOSING, как показано здесь.

Ответ 3

В методе actionPerformed() ActionListener вам понадобится что-то вроде:

dialog.setVisible(false);

Если вы хотите навсегда избавиться от диалога (освободить его из памяти), вам также следует позвонить:

dialog.dispose(); 

... где dialog - это имя вашего диалога. Если dialog является локальной переменной, вам нужно сделать ее окончательной, чтобы получить к ней доступ таким образом (или просто убедиться, что она "эффективно окончательна" начиная с Java 8 и далее).

Если вы добавляете кнопку как часть подкласса JDialog (то есть, если у вас есть class MyDialog extends JDialog и вы добавляете прослушиватель действий в MyDialog), вам понадобится:

MyDialog.this.setVisible(false);

Ответ 4

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

JButton myButton = new JButton("Close");
myButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        dispose(); // Or whatever else
        setVisible(false);
    }
});
getRootPane().setDefaultButton(myButton);

Таким образом, его ActionListener будет вызываться при каждом нажатии Enter.

Ответ 5

Я сделал это немного по-другому, и это служит цели. У меня есть несколько классов. Они расширяют JPanel, служат различным целям и используют JDialogs для получения пользовательских отзывов.

Типичный класс будет содержать необходимые поля, кнопки сохранения и отмены.

общедоступный класс EnterpriseGUI extends javax.swing.JPanel {...} будет выглядеть следующим образом:

JPanel class in designer mode

Класс EnterpriseGUI имеет закрытую переменную jdialog и метод для установки jdialog. Также ActionEvent для кнопки "Сохранить" и "Отмена".

private JDialog jdialog;
public void setJDialog(JDialog jdialog) {
    this.jdialog = jdialog;
}
private void btnSaveActionPerformed(java.awt.event.ActionEvent evt) {                                        
    // Do your stuff..
    jdialog.dispose();
} 
private void btnCancelActionPerformed(java.awt.event.ActionEvent evt) {                                          
    // Discard your stuff..
    jdialog.dispose();
} 

Наконец, я создаю экземпляр EnterpriseGUI из любого другого класса по мере необходимости и встраиваю его в JDialog.

Class OtherClass{
private JDialog dialog;
private EnterpriseGUI = new enterprisegui();
    private void button1ActionPerformed(java.awt.event.ActionEvent evt) {                                             
        this.dialog = new JDialog(this, "My dialog", true);
        this.dialog.setResizable(false);
        enterprisegui.setJDialog(dialog);
        this.dialog.getContentPane().add(enterprisegui);
        this.dialog.pack();

        Dimension Size = Toolkit.getDefaultToolkit().getScreenSize();
        this.dialog.setLocation(new Double((Size.getWidth()/2) - 
                (dialog.getWidth()/2)).intValue(), new Double((Size.getHeight()/2) - 
                        (dialog.getHeight()/2)).intValue());
        this.dialog.setVisible(true);

    }  
}