【问题标题】:how to close jdialog from a button?如何从按钮关闭jdialog?
【发布时间】:2012-11-08 12:26:30
【问题描述】:

我有一个 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");

        }
    }

非常感谢您的任何帮助

【问题讨论】:

    标签: java swing modal-dialog jdialog


    【解决方案1】:

    创建实例后可以更改对话框的模式吗?

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

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

    在这种情况下,您拨打setVisibledispose() 并不重要


    • 只创建一次JDialog

    • 将其创建为局部变量

    • 更改myDialog.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);,然后更改toolbar 中的button(带有X)也隐藏JDialog

    • 那么如果需要,您也可以只从actionPerformed 调用myDialog.setVisible(true)ModalityType,setVisible 应该包含在invokeLater() 中,而不是创建一个新实例 (new Dialogz(this, true);)

    • 放在JDialog 中的JButton 只会被调用myDialog.setVisible(false)

    • example corresponding with your logics

    【讨论】:

    • 谢谢之前..我的代码只是为了让它看起来简单..(但我仍然觉得很难)我的对话框稍后将与数据库相关(可以更改我对话框中的值)..所以我需要再次处理并创建新对话框..你能给我关闭该对话框的代码并更改方法closez中的模式(来自我的帖子代码)
    • 再次只创建一次此 JDialog,将所需的 JComponents 放入数据库更新,将数据放入 JDialog 中的 JComponents,显示对话框,用于检查 setModal(true/false) 的模态或 setModalityTypes 的类似方法
    • 谢谢。但我不能。老实说,我的主框架有很多按钮.. 其中一个会显示另一个 jdialog。确定我的问题 jdialog 的 ui(包含关闭问题的对话框).. 我已经编写了我的代码。 (这么多)如果我只尝试创建一次jdialog,我认为它会在我的情况下创建一个错误.. 但是也许我可以处理这个错误.. 将与数据库有关系的组件与读取、编码和思考相同从头再来。所以我不能..也许可以,但需要更长的时间。我可以通过每个用户单击按钮创建一个新对话框来做到这一点吗?非常感谢您的回复
    • but i can't. truthfully my main frame have many button :-) 呵呵呵呵没问题,把所有这些JPanelsCardLayout 并在视图之间切换(如果你想改变/适合JDialog,请致电JDialog.pack()JPanels Dimension)、important info, you have to calculating with OutOfMemory,别忘了把close()所有ResultsetStatement放在finally block中,否则这些Object也会留在JVM内存中,永远不会是GC'ed
    • 我不能在我的情况下使用卡片布局 T-T ...另一方面,稍后我计划学习包含数据库值的 3d..然后将其放入我的问题对话框中..管理对话框a中的值,对话框b中的视图..所以每次用户单击按钮时我都需要创建一个新的jdialog.. ~_~
    【解决方案2】:

    有人告诉我..

    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();
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      相关资源
      最近更新 更多