java - 有没有更好的方法来连接两个 JPanel?

标签 java swing netbeans jframe jpanel

NetBeans Project and Source Code of a minimal example

除了将 JPanel 的字段公开之外,是否有更好的方法将 JFrame 与另一个类的 JPanel 连接起来?

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

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

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

那么有没有更好的方法来做到这一点?

JFrame Action 监听器:

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

最佳答案

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

  • 您考虑使用您所知道的公共(public)字段是错误的。
  • 您提到将数据保存到文件中,但这不是多余的吗?当有更简单的解决方案可用时,这不会增加不必要的时间和资源开销吗?
  • 最好使用与不是 Swing GUI 时使用的技术相同的技术:公共(public)方法,包括 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);
    }
}
<小时/>

编辑
您在评论中指出:

I would have used getters and setters but from the books that I've read and the forums that I frequent I know that the general consensus is that having getters and setters is even worse than public fields.

抱歉,但那是废话。请考虑您的代码与我的代码。在上面的代码中,我建议给 vng Settings 一个方法,例如:

// 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 对象的状态?

关于java - 有没有更好的方法来连接两个 JPanel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22897145/

相关文章:

java - 使用 TableModelListener 从数据库检索数据到 JTable(JTable 中有 JCheckbox)时出错

java - JFrame 中的绘画不起作用 (Java)

Java FXScene Builder 加载到 NetBeans 中并引发错误

android - 命令窗口中无法识别 adb?

Java程序将birt报告导出到excel

java - RxJava : onBackpressureBlock() strange behavior

java - 在java swing中浏览html文件

java - 在染色体上设置基因限制

java - JTextPane - 具有两种样式的短语

netbeans - 如何在 Netbeans 中在 Windows 和 UNIX 换行符之间切换?