【问题标题】:Binding a Actionlistener (button) to Resultset.next将 Actionlistener(按钮)绑定到 Resultset.next
【发布时间】:2017-02-21 22:52:45
【问题描述】:

我需要制作一个从 mysql 数据库中询问数据的程序来显示它。 (在完整的程序中,它还需要能够创建、更改和删除行,但我已经坚持显示)。 我这样做的方法是与 jdbc 建立连接。 然后执行查询并将其放入结果集中。 然后使用 if 语句通过 resultset.next 和一堆 parsestring 和 settext 方法获取第一行信息。

下一步是下一个和上一个按钮,用于滚动结果集并显示信息。

我的计划是在 actionlistener 中放置一个 rs.next() 并使用新字符串重做文本字段上的所有 setTexts,但我尝试了 100 种不同的感觉,但我一直以一种方式或另一个。

有人还建议我应该尝试将 actionlistener 设置为将 1 添加到变量中。然后将其余代码放在一个类中,我可以用方法调用它,但我不知道如何制作这样的方法。

任何帮助都会令人惊叹。我现在只写了几个星期的代码,我感觉自己有点不知所措。因此,如果还有其他我做错的事情,请告诉我。干杯

代码

package duo.opdracht.info.pagina;

import javax.swing.*;
import java.awt.event.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.*;

public class DUOOpdrachtInfoPagina extends JFrame {

  public static void main(String[] args) {
    JFrame frame = new DUOOpdrachtInfoPagina();
    frame.setSize(1000, 750);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setTitle("Optredens");
    frame.setContentPane(new Paneel());
    frame.setVisible(true);

  }
}

class Paneel extends JPanel {

  private JButton volgendeKnop, vorigeKnop;
  private JTextField bandArtiestVak, starttijdVak, eindtijdVak, podiumVak;
  private JLabel bandArtiestLabel, starttijdLabel, eindtijdLabel, podiumLabel;

  public Paneel() {
    setLayout(null);

    volgendeKnop = new JButton("Volgende");
    volgendeKnop.addActionListener(new ButtonHandler());
    vorigeKnop = new JButton("Vorige");

    bandArtiestVak = new JTextField(20);
    starttijdVak = new JTextField(20);
    eindtijdVak = new JTextField(20);
    podiumVak = new JTextField(20);

    bandArtiestLabel = new JLabel("Artiest / Band: ");
    starttijdLabel = new JLabel("Starttijd: ");
    eindtijdLabel = new JLabel("Eindtijd: ");
    podiumLabel = new JLabel("Podium: ");

    volgendeKnop.setBounds(850, 600, 100, 25);
    vorigeKnop.setBounds(50, 600, 100, 25);
    bandArtiestVak.setBounds(200, 100, 300, 25);
    starttijdVak.setBounds(200, 130, 300, 25);
    eindtijdVak.setBounds(200, 160, 300, 25);
    podiumVak.setBounds(200, 190, 300, 25);
    bandArtiestLabel.setBounds(100, 100, 300, 25);
    starttijdLabel.setBounds(100, 130, 300, 25);
    eindtijdLabel.setBounds(100, 160, 300, 25);
    podiumLabel.setBounds(100, 190, 300, 25);

    bandArtiestVak.setEditable(false);
    starttijdVak.setEditable(false);
    eindtijdVak.setEditable(false);
    podiumVak.setEditable(false);

    add(volgendeKnop);
    add(vorigeKnop);
    add(bandArtiestVak);
    add(starttijdVak);
    add(eindtijdVak);
    add(podiumVak);
    add(bandArtiestLabel);
    add(starttijdLabel);
    add(eindtijdLabel);
    add(podiumLabel);

    // create our mysql database connection
    try {
      Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/DUO_1", "duo1", "duo1");

      Statement stmt = null;
      String query
              = "SELECT BandArtiestNaam, Starttijd, Eindtijd, Podiumnaam FROM optreden";

      stmt = conn.createStatement(
              ResultSet.TYPE_SCROLL_INSENSITIVE,
              ResultSet.CONCUR_READ_ONLY);

      ResultSet rs = stmt.executeQuery(query);
      if (rs.next()) {
        String naam = rs.getString(1);
        String stijd = rs.getString(2);
        String etijd = rs.getString(3);
        String pnaam = rs.getString(4);

        bandArtiestVak.setText(naam);
        starttijdVak.setText(stijd);
        eindtijdVak.setText(etijd);
        podiumVak.setText(pnaam);

      }
    } catch (SQLException e) {
      System.out.println(e);
    }
  }

  class ButtonHandler implements ActionListener {

    public void actionPerformed(ActionEvent e) {

    }
  }
}

【问题讨论】:

  • “任何帮助都会令人惊叹。” 就像一个具体的问题一样......
  • @AndrewThompson 是的,我很抱歉,也许我应该换个说法。我添加这句话是为了表明即使是最轻微的提示、技巧、窍门或研究资源都会有所帮助,因此人们不会觉得有必要为我编写整个程序。我只需要一些大方向。

标签: java swing jdbc actionlistener resultset


【解决方案1】:

将您的问题分解为不同的关注点,您不应该有一个类可以在您的应用程序中完成所有事情。你会发现,就像现在一样,当你遇到问题时,很难追查到,比你想象的要难得多。让我们先把这个问题分解成可管理的块,这就是编程的全部内容。

  • 查看 - 您的实际 Swing 面板与其他面板,这应该只有一堆面板和按钮,没有任何 sql 代码,并且没有任何(或非常查看)侦听器,绝对是风景。
  • Dao(数据访问对象)——这个类有你所有的 SQL 代码,它唯一做的就是执行 CRUD 操作。它可能会做一些其他的事情来将结果集更改为更有意义的东西,将结果集包含到此类中可能是一个好主意,因为这是 dao 的关注点。通常人们使用休眠之类的东西而不是编写 SQL 代码,但您可以随意做,但我鼓励您检查一下。
  • Controller - 这将是您的 View 和您的 Dao 之间的链接。它将把这两个作为其构造函数中的参数。控制器会将动作侦听器添加到视图中所需的任何位置,从视图中获取任何输入,并使用相应的输入参数调用 Dao,并根据需要将其返回给视图。

这是一种称为 MVC 的设计模式 -(模型视图控制器)针对不同的应用程序桌面/Web 等存在不同的变体。这将允许您将每个关注点分离到相关组件中,并测试每个关注点是否正常工作,以及问题出在哪里。您将能够测试,例如 Dao,而无需创建视图和添加侦听器。听起来你正在学习,所以我强烈建议你学习这种设计模式。你会发现你无法用你当前的设计做一个实质性的应用程序,因为问题变得越来越难以追踪,而且新功能越来越难以添加。

还有一些东西,你真的应该把整个结果集转换成更有意义的东西,它已经加载了。每次需要新行时使用 rs.next 将意味着您无法关闭结果集,并且您可能会收到所有这些资源警告。否则检查休眠。刚开始学习Java编程的时候就很喜欢这个网站,建议你去看看https://www.caveofprogramming.com/java-design-patterns/mvc-example.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 2014-06-01
    • 2011-06-11
    相关资源
    最近更新 更多