【问题标题】:Making a program using a GUI and MySQL database使用 GUI 和 MySQL 数据库制作程序
【发布时间】:2015-08-28 20:53:49
【问题描述】:

我有一个关于我正在开发的程序的问题。它是一个用于 MqSQL db 的数据库管理器,用 Java 编写。所以我有以下程序结构。

所以我有一个扩展JFrame的主类,它是接口的主框架,像这样(删除了与讨论无关的不必要代码):

public class MainInterface extends JFrame {

   public MainInterface {
       ................
    MainInterface.setLayout(new FlowLayout());
    MainInterface.setVisible(true);

    TopToolbar toolbar;
    try {
         toolbar = new TopToolbar();
         MainInterface.add(toolbar);
         ResultsPanel Results = new ResultsPanel();
         MainInterface.add(Results);

    } catch (IOException e) {
        e.printStackTrace();
    }
  }

TopToolbar 和 ResultsPanel 是扩展 JPanel 的另外 2 个类,TopToolbar 类有一个 JToolBar,其中添加了按钮(向前移动、向后移动、添加条目)

 public class TopToolbar extends JPanel implements ActionListener {  

 TopToolBar()
 {
  //constructor in which i was adding button to the toolbar, not relevat
 }

 } 

 public void actionPerformed(ActionEvent e) {

     String cmd = e.getActionCommand();

     if (MoveFirst.equals(cmd)){
         try {
            DatabaseAccess disp = new DatabaseAccess();
            disp.getResults();
            int id = disp.return_id();

            System.out.println(id);

        } catch (//exceptions) {

            e1.printStackTrace();
        }
     }

这是下一个按钮的 ActionListener 事件,它应该触发读取 db 中的下一个条目

DatabaseAccess 是另一个初始化数据库连接的类,它有以下两个方法:

public void getResults() throws SQLException {

    Connection con = (Connection) DriverManager.getConnection(URL, user, "")
    sql = (Statement) con.createStatement();
    result_set = sql.executeQuery("select * from persons");

    while (result_set.next()) {

    id = result_set.getInt(1);
    name = result_set.getString(2);

    }       

}

public int return_id(){
    return id;

}

return_ID 方法返回(并且确实有效)ID(数据库中的第一个键,显然会为数据库中的其余条目添加方法)。 现在我想在最终的 JPanel 中显示 ID,即名为 ResultsSet 的那个(在 GridLayout 中只有 3 个 JLabels 和 3 个 TextFields 用于 ID、名称等)。

由于 dababase 类的创建(以及随后读取 db 并返回结果的方法)是在 TopToolBar Jpanel 内的 ActionPerformed 方法内完成的,因此我无法从 MainInterface JFrame 访问它,然后使用类似

  ResultsPanel DispResults = new ResultsPanel();
  add(DispResults);
  DispResults.setID(id_Value)

其中 setID 将是 ResultsPanel 中的一个方法,它使用 JTextBox setText 来设置文本。

Hoope,我已经尽可能清楚地解释了我的问题。

【问题讨论】:

  • 变量名不应以大写字符开头。您的一些变量是正确的,而有些则不是。如果您希望人们花时间阅读您的代码,请保持一致!
  • 哎呀,不知道。我还在学习。我会尽快纠正他们。感谢您的提示。
  • 由于 duffymo 有评论,您应该避免从 JFrame 扩展,除了将您锁定在一个用例中,使其无法以其他方式重用您的 UI,您没有添加框架的任何新功能。查看5 Reasons to Use Composition over Inheritance in Java and OOP 作为起点了解更多详情
  • “我有一个问题” 太好了!你的问题是什么?如果这些词中隐藏着一个实际的问题,你能加一个“吗?”到最后了吗?如果不是,请考虑一个实际问题(不是要求edit it into the question,并确保添加“?”。

标签: java mysql eclipse swing user-interface


【解决方案1】:

我不同意你的几个选择。

你不应该扩展 JFrame。创建一个 JPanel 并把它交给一个 JFrame 来显示。

我会将数据库交互与 Swing UI 分离。将它们自己创建为基于接口的 POJO,无需 UI。让它们测试、编写并完美运行。

一旦数据库交互完美,将该对象的实例提供给控制应用程序的类。给它一个纯文本界面来驱动数据库操作。

一旦控制器完美地服从了每一个文本命令,使用你完全测试过的数据库组件,然后让它创建你的 JPanel 的一个实例并将它提供给一个 JFrame。它将对其控制器所有者进行与您的文本 UI 已成功执行相同的调用。

计算机科学就是关于分解的。您可以通过将大问题分解为小问题来解决它们。

如果您想看看您的应用可能是什么样子的一个很好的示例,请下载SQL Squirrel

【讨论】:

  • 不知道如何,除了指出子类无法覆盖或扩展现有行为。它知道继承并不总是必要的——组合通常是更好的选择。在这种情况下。
  • 不仅仅是意见,但我不在乎你或 OP 是否接受它。我不必证明分解是解决问题的好方法。
  • 请向我们提供您的证明,以便我们了解它是如何完成的。还是你只是发表评论而不把自己放在外面?
  • 我不确定你要什么证明?您已经发表了关于不做某事的大胆声明,这是我同意的事情,并且作为经验开发人员,请理解,但是 OP 没有这样的好处。您提到了组合而不是继承,这绝对是一个很棒的观点,仅此一项就足以增加您的评论的分量,这将进一步支持您解耦代码的建议。如果您不想,那就不要,我只是认为它会将一个很好的答案变成一个很好的答案,仅此而已
  • 仅供参考:我删除它们是因为它们会增加噪音,我不想弄乱 cmets,因为很明显您对一些友好的反馈不感兴趣,再次抱歉打扰您跨度>
猜你喜欢
  • 2013-04-11
  • 2020-10-30
  • 1970-01-01
  • 2023-04-06
  • 2021-12-09
  • 1970-01-01
  • 2014-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多