web-dev-qa-db-ja.com

JDialogを閉じるためのボタン

JDialogの下部にボタン(JButton)を追加して、押されたときにJDialogを閉じるようにします。問題は、そのボタンのActionListenerに何を書くべきかわからないことです。ボタンでプログラムを終了したくないので、ダイアログを閉じてください。

JDialogは、JOptionPaneのメソッドの1つを呼び出すのではなく、JDialogのコンストラクターの1つを明示的に呼び出すことによって作成されます。

Googleを使用してこれに対する答えを見つけることができなかったことに非常に驚きました。頻繁に発生する問題は、多くのプログラミングサイトで広くカバーされると予想しました。そうではないことはかなり奇妙です。

18
SoboLAN
_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();
  }
}
_
  • 閉じていないdispose()メソッドの親フレームを使用してdialolgのみを閉じます。 JVMが終了しなかった理由。

36
Mohammed Aslam

here のように、ActionListenerWindowEvent.WINDOW_CLOSINGをディスパッチさせることができます。

7
trashgod

ActionListeneractionPerformed()メソッドには、次のようなものが必要です。

dialog.setVisible(false);

ダイアログを永続的に削除する(メモリから解放する)場合は、alsoを呼び出します。

dialog.dispose(); 

... dialogはダイアログの名前です。 dialogがローカル変数である場合、この方法でアクセスするには、最終的にする必要があります(または、Java 8以降)から「実質的に最終」であることを確認するだけです) 。

JDialogのサブクラスの一部としてボタンを追加する場合(つまり、class MyDialog extends JDialogそして、あなたはMyDialog)にアクションリスナーを追加しています:

MyDialog.this.setVisible(false);
6
Michael Berry

私はこれをわずかに異なって行いましたが、それは目的を果たします。いくつかのクラスがあります。これらはJPanelを拡張し、さまざまな目的を果たし、JDialogを使用してユーザーの入力を取得します。

典型的なクラスには、必要なフィールド、保存ボタン、キャンセルボタンが含まれます。

パブリッククラスEnterpriseGUIが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);

    }  
}
0
Gaurang

他の回答に加えて、ダイアログルートペインのデフォルトボタンとして設定できます。

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 が押されます。

0
Matthieu