Java 如何从按钮关闭jdialog?

Java 如何从按钮关闭jdialog?,java,swing,modal-dialog,jdialog,Java,Swing,Modal Dialog,Jdialog,我有一个Jframe(美因茨) 它有一个按钮(showDialog) 当用户单击按钮时 jdialog(Dialogz)将显示 那个jdialog有一个按钮 如何从该按钮(在jdialog内)关闭jdialog 在创建对话框的实例后,是否可以更改对话框的模式 我需要阻止jdialog的所有者 在这里我试着 import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionLis

我有一个Jframe(美因茨)

它有一个按钮(showDialog)

当用户单击按钮时

jdialog(Dialogz)将显示

那个jdialog有一个按钮

  • 如何从该按钮(在jdialog内)关闭jdialog
  • 在创建对话框的实例后,是否可以更改对话框的模式
我需要阻止jdialog的所有者

在这里我试着

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;


    public class Mainz extends JFrame implements ActionListener{
        JButton showDialog = new JButton("show dialog");

        public Mainz() {
            setLayout(new FlowLayout());
            showDialog.addActionListener(this);
            add(showDialog);
            setVisible(true);   
        }
        @Override
        public void actionPerformed(ActionEvent e) {
            new Dialogz(this, true);
        }

        public static void main(String[]args){
            new Mainz();
    }
    }
    class Dialogz extends JDialog{
        JButton close = new JButton("close");

        public Dialogz(JFrame owner,boolean modal) {
            super(owner, modal);
            System.out.println(this.getModalityType());
            add(close);
            setLocationRelativeTo(owner);
            setVisible(true);

            close.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent ae){
                    closez();
                }
            });
        } 

        void closez(){
            setModal(false);
            this.dispose();
            System.out.println("Method Done");

        }
    }
非常感谢你的帮助

在创建对话框的实例后,是否可以更改对话框的模式

是的,您可以在运行时更改
setModal
modalitypes
,但是对于这种形式的代码我没有任何意义

如何从该按钮(在jdialog内)关闭jdialog

在这种情况下,是否调用
setVisible
dispose()


  • 只创建一次
    JDialog

  • 将其创建为局部变量

  • 更改
    myDialog.setDefaultCloseOperation(JDialog.HIDE\u ON\u CLOSE)
    ,然后在
    工具栏中的
    按钮
    (使用
    X
    )也隐藏
    JDialog

  • 然后您可以仅从
    actionPerformed
    调用
    myDialog.setVisible(true)
    ModalityType
    如果需要,setVisible应该包装在
    invokeLater()
    中,而不是创建新实例(
    newdialogz(this,true);

  • 放置在
    JDialog
    中的
    JButton
    将仅调用
    myDialog.setVisible(false)

  • 有人告诉我

    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    
    
        public class Mainz extends JFrame implements ActionListener{
            JButton showDialog = new JButton("show dialog");
    
            public Mainz() {
                setLayout(new FlowLayout());
                showDialog.addActionListener(this);
                add(showDialog);
                setVisible(true);   
            }
            @Override
            public void actionPerformed(ActionEvent e) {
                new Dialogz(this, false);
                setEnabled(false);
            }
    
            public static void main(String[]args){
                new Mainz();
        }
        }
        class Dialogz extends JDialog{
            JButton close = new JButton("close");
    
    
            public Dialogz(JFrame owner,boolean modal) {
                super(owner, modal);
    
                add(close);
                setLocationRelativeTo(owner);
                setVisible(true);
    
                close.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent ae){
                        closez();
                    }
                });
            } 
    
            void closez(){
                System.out.println("before ="+getModalityType());
                setModal(true);
                System.out.println("after ="+getModalityType());
                getOwner().setEnabled(true);
                Dialogz.this.dispose();
            }
        }
    

    谢谢你。。我的代码只是为了让它看起来简单。。(但我仍然觉得很难)我的对话框稍后将与数据库相关(可以更改对话框中的值)。。因此,我需要再次处理并创建新对话框。。你能给我关闭该对话框的代码并更改方法closez中的模式(从我的post代码)吗?再次创建这个JDialog一次,放置数据库更新所需的JComponents,将数据放入JDialog中的JComponents,显示对话框,让模式检查setModal(true/false)或setModalitypesthankz的类似方法。但我不能。老实说,我的主框架有很多按钮。。其中一个将显示另一个jdialog。确定我的问题jdialog(包含关闭问题的对话框)的ui。。我已经写了我的代码。(如此之多)如果我只尝试创建一次jdialog,我认为它会在我的情况下创建一个bug。。不过,也许我能处理这个错误。。把和数据库有关系的组件和读取、编码和重新思考放在一起。所以我不能。。也许可以,但需要更长的时间。我是否可以在每个用户单击按钮时创建一个新对话框?非常感谢您的回复
    ,但我不能。老实说,我的主框架有很多按钮(代码):-)呵呵,没问题,把所有这些
    JPanels
    放到
    CardLayout
    并在视图之间切换(调用
    JDialog.pack()
    如果你想将
    JDialog
    更改为
    JPanels维度,不要忘记
    close()
    中的所有
    结果集
    语句
    最后阻塞
    ,否则这些
    对象
    也会留在JVM内存中,永远不会被
    GC'ed
    我不能在我的情况下使用卡片布局t-t。。。另一方面,稍后我计划学习包含数据库值的3d。。然后把它放在我的问题对话框中。。管理对话框a中的值,对话框b中的视图。。因此,每次用户单击按钮时,我都需要创建一个新的jdialog~_~