有没有更好的方法来连接两个JPanels?

时间:2014-04-06 17:03:23

标签: java swing netbeans jframe jpanel

NetBeans Project and Source Code of a minimal example

是否有更好的方法可以将JFrameJPanel从另一个类别连接起来,而不是将JPanel的字段设为公开?

我正在编写一个程序,其中会有一个选项按钮,当按下该按钮时,自定义JOptionPane.showOptionDialog会在其中显示一个JPanel,其中包含特定选项用户想要的。

当用户按下JOptionPane.OK_OPTION按钮时,程序会关闭OptionDialog内的JPanel并返回JFrame。然后我需要在JPanel中输入的任何内容在JFrame类中使用。我只是通过制作JPanel公共文本字段来做到这一点,但我觉得这是一种廉价的做法,特别是因为NetBeans不会让我这样做,除非我在记事本中打开来源

如果JOptionPane.OK_OPTION只是将Jpanel的字段保存在文件中,然后我可以在JFrame类中单独检索它们,我也完全可以了

那么有更好的方法吗?

JFrame动作监听器:

private void goSettingsActionPerformed(java.awt.event.ActionEvent evt) {                                           
        Settings settings = new Settings();
        int result = JOptionPane.showOptionDialog(null,
                settings,
                "Settings",
                JOptionPane.OK_CANCEL_OPTION,
                JOptionPane.INFORMATION_MESSAGE,
                null,
                new String[]{"Save", "Cancel"},
                "default");
        if (result == JOptionPane.OK_OPTION) {
            username = settings.jTextField1.getText();
            usernameInputedLabel.setText(username);
        }
    }

1 个答案:

答案 0 :(得分:1)

您的问题是一般问题的具体示例:两个对象如何通信?

  • 如您所知,您对使用公共领域的考虑是错误的。
  • 您提到将数据保存到文件中,但是没有过度杀戮,并且当更简单的解决方案可用时,不会增加不必要的时间和资源开销吗?
  • 如果不是Swing GUI,最好使用您使用的相同技术:公共方法,包括getter和setter方法(如果需要)。

如,

private void goSettingsActionPerformed(java.awt.event.ActionEvent evt) {                                           
    Settings settings = new Settings();
    int result = JOptionPane.showOptionDialog(null,
            settings,
            "Settings",
            JOptionPane.OK_CANCEL_OPTION,
            JOptionPane.INFORMATION_MESSAGE,
            null,
            new String[]{"Save", "Cancel"},
            "default");
    if (result == JOptionPane.OK_OPTION) {

        // **** give your Settings class this method:
        username = settings.getUserName(); 
        usernameInputedLabel.setText(username);
    }
}

修改
您在评论中说明:

  

我本来会使用getter和setter,但是从我读过的书籍以及我经常阅读的论坛中我知道,普遍的共识是,得到吸气剂和制定者甚至比公共领域更糟糕。

对不起,但那是一场嘘声。请考虑您的代码与我的代码。在我上面的代码中,我建议使用一种方法,例如:

// in declarations:
// don't name this jTextField1
private JTextField userNameField = new JTextField();

// public getter method
public String getUserName() {
   return jTextField1.getText(); // this should be named userNameField
}

鉴于您的建议是将JTextField公开,将其完全暴露给所有人。哪个风险更大?这可能允许调用代码在不知情的情况下更改Settings对象的状态?