【问题标题】:How to open a jdialog from a jframe如何从 jframe 打开 jdialog
【发布时间】:2015-08-03 13:41:38
【问题描述】:

JFrame按钮打开jdialog:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:

打开对话框的JDialog方法:

        public void run() {
            AddClient dialog = new AddClient(new javax.swing.JFrame(), true);
            dialog.addWindowListener(new java.awt.event.WindowAdapter() {
                @Override
                public void windowClosing(java.awt.event.WindowEvent e) {
                    System.exit(0);
                }
            });
            dialog.setVisible(true);

我的 JDialog 类名为 AddClient,我的 JFrame 类名为 MainWindow。它们所在的包名为 my.javaapp

我将如何继续这样做?我对java很陌生,到目前为止一直在使用python并使用netbeans进入java swing gui builder,我计划观看教程并阅读java文档以了解更多关于java的信息,但我想首先能够打开此 jdialog。

在问这个问题之前,我搜索了很多,并且我阅读了其他被要求或多或少解决同样问题的问题,但我仍然无法解决我的问题,所以我问了。

解决方案:

从你要弹出的 gui 所在的类中删除 main 函数,例如

public static void main(String args[]) {

    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(NewJDialog1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(NewJDialog1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(NewJDialog1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(NewJDialog1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /* Create and display the dialog */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            NewJDialog1 dialog = new NewJDialog1(new javax.swing.JFrame(), true);
            dialog.addWindowListener(new java.awt.event.WindowAdapter() {
                @Override
                public void windowClosing(java.awt.event.WindowEvent e) {
                    System.exit(0);
                }
            });
            dialog.setVisible(true);
        }
    });
}

在删除之前,复制这一行:

NewJDialog1 dialog = new NewJDialog1(new javax.swing.JFrame(), true);

在按下后右键单击要弹出此窗口的按钮,事件>动作>执行的动作。像这样粘贴它:

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {

NewJDialog1 dialog = new NewJDialog1(new javax.swing.JFrame(), true); 

dialog.setVisible(true);

}

记得添加最后一行,这就是显示对话框的内容。

【问题讨论】:

  • “使用 netbeans 进入 java swing gui builder” 这就是“失去所有希望”的地方。暂时放弃 automagic IDE,学习如何编写 1) Java 和 2) GUI。
  • “我阅读了其他问题,他们或多或少地解决了同样的问题” 还有哪些问题(链接到最接近的三个)?他们为什么不帮忙?
  • 我知道我会得到第一条评论作为答案,哈哈,你是对的。我会开始的,我只是想从我想要的点开始学习,而不是从一开始,我只是想从那里继续学习我需要的东西..我仍然会这样做..我'将为该对话框编写后端进程代码,当它完成后,我对 java 的了解更多,所以我会回来从该主窗口打开对话框。无论如何,谢谢!
  • 我会编辑这个问题并解释解决方案,一旦我学会了如何去做以及为什么我之前不能让它工作,这样这个问题就不会浪费了..

标签: java swing netbeans


【解决方案1】:

JDialog 上的构造函数接受父对象。但是您使用新的 JFrame 对象。这是错误(逻辑错误)。

AddClient dialog = new AddClient(MainWindow.this);

如果你想要模态对话框,调用

dialog.setModal(true);

并设置默认关闭操作。

dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);

不需要使用线。

Ps: 英语不好见谅

编辑: 这是对话框中退出代码的简单示例

public class AddClient extends JDialog {
    public static final int ID_OK = 1;
    public static final int ID_CANCEL = 0;

    private int exitCode = ID_CANCEL;

    public AddClient(Frame owner) {
        super(owner);
        createGUI();
    }

    public AddClient(Dialog owner) {
        super(owner);
        createGUI();
    }

    private void createGUI() {
        setPreferredSize(new Dimension(600, 400));
        setTitle(getClass().getSimpleName());

        pack();
        setLocationRelativeTo(getParent());
    }

    @Override
    public void dispose() {
        super.dispose();
    }

    public int doModal() {
        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        setModal(true);
        setVisible(true);

        return exitCode;
    }
}

主窗口

public class MainWindow extends JFrame {

    public MainWindow() throws HeadlessException {
        super();
        createGUI();
    }

    private void createGUI() {
        setExtendedState(JFrame.MAXIMIZED_BOTH);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setTitle(getClass().getSimpleName());

        JButton addClientButton = new JButton("Add client");
        addClientButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        AddClient dialog = new AddClient(MainWindow.this);
                        if(dialog.doModal() == AddClient.ID_OK) {

                        }
                    }
                });
            }
        });

        JToolBar toolBar = new JToolBar();
        toolBar.add(addClientButton);

        add(toolBar, BorderLayout.PAGE_START);
    }

    @Override
    public void dispose() {
        super.dispose();
    }
}

【讨论】:

    【解决方案2】:

    如果你有它包含在线程中,你需要在这个线程上调用 start(), 如果你有 Runnable,你需要用 Thread 类把它括起来,然后调用 start()。

    在 Runnable 和 Thread 上,你也可以调用 run(),但它会在当前 Thread 中运行。

    这是你的情况吗,因为我在你的代码中看到了 run() 方法的一部分?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多