关于带有控制器和视图的 JButton 监听器

问题描述 投票:0回答:1

我正在用 Java 开发一个带有数据库的 Swing 应用程序。我得到了不同的

JButton
,它删除,添加或修改了
JTable
中的行。

我卡住了,因为我不知道在哪里可以管理我的动作侦听器。

我有一个名为

DaoClef
的类,我将在其中执行 SQL 语句,发送我的表模型等...

我看到我的所有按钮都已设置,但我不知道在我的控制器中该做什么。

现在我在视图中得到了这个:

    btnNew.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            // check for selected row first
            if (t.getSelectedRow() != -1) {
                // remove selected row from the model

                String sqlMaj = "DELETE FROM clefs WHERE IdClef = ?";
                try (PreparedStatement pst = Connect.getConnection().prepareStatement(sqlMaj) )
                {

                    pst.setInt(1, (int) t.getValueAt(t.getSelectedRow(), 0));   
                    pst.executeUpdate();
                    t.addNotify();
                } 
                catch (SQLException e)
                {
                }
            }
        }
    });

但是这样不好,因为SQL语句需要在controller中的一个方法中执行。

你能给我一些线索吗?

java swing model-view-controller jbutton actionlistener
1个回答
0
投票

从 MVC 的角度来看,这里的问题是模型和视图混合在一起。由于控制器应该充当两者之间的中介,因此它在这里没有任何作用。

View,向用户呈现 GUI(窗口、按钮、文本字段等),应该(理想情况下,稍后会详细介绍)在按下删除按钮时告诉 Controller 及其相应的 id。然后Controller应该将此信息传递给Model,后者将使用其连接和准备好的语句与数据库进行通信。


这里有一个关于 MVC 模式的很好的解释:

  1. 模型-视图-控制器:用户是与视图交互还是与控制器交互?

注意(或可能省略)关于 MVC 模式的不同看法存在一些争议,如不同答案所示here.

关于 MVC in Swing 的话题这里也有很好的回答:

  1. Java 和 GUI - 根据 MVC 模式,ActionListeners 属于哪里?

虽然给出的例子可能有点复杂,因为作者试图更严格地分离View和Controller。我会继续阅读评论,因为他们添加了进一步的说明。

我试图找到一个更简单的例子,但大多数都不包括动作监听器。这是一对夫妇:

  1. a) https://gist.github.com/Sammy30/7ebc606e7bb76cefac0f

    b)http://www.fredosaurus.com/notes-java/GUI/structure/40mvc.html

与链接的第一个示例不同,动作侦听器是从控制器添加的。它更简单,但缺点是 Controller 和 View 交织在一起,不允许轻松切换后者(即,不修改 Controller),这是 MVC 的优势之一


步骤是:

准备:

  1. 创建视图和模型(模型现在可以设置与数据库的连接)
  2. 控制器以视图和模型的实例作为属性创建
  3. Controller 通过在 View 中设置动作侦听器来准备好(或告诉 View 设置它们,在这种情况下,View 应该在事件发生时联系 Controller)

用法:

  1. 用户按下视图中的按钮
  2. Controller 通过它的动作侦听器注意到按钮被按下(或者 View 告诉 Controller 哪个按钮被按下了)
  3. Controller 决定如何处理事件。在这种情况下,告诉模型需要删除记录
  4. 模型接收订单并修改数据库,
  5. 返回一个值更新的行数
  6. 模型
  7. 关闭ResultSet、Statement和Connection
© www.soinside.com 2019 - 2024. All rights reserved.