【问题标题】:Get value of string in try other method在尝试其他方法中获取字符串的值
【发布时间】:2020-12-05 10:29:44
【问题描述】:

因此,此程序从数据库 "getReprt" method 中获取值 car_number,并将名称作为来自 db 的值赋予按钮。此外,接下来我需要获取此值,以便为每个按钮的动作侦听器btn_listener 获取它自己的值。但是这个代码,我只得到最后一个数据值,每个按钮都是一样的。如何给每个 actionlistener 情况不同的值? 我做错了什么?

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;

public class Car2q {
    private Connection con;
    private ResultSet rs;
    static JTextArea textArea = new JTextArea();
    static login frame = new login();
    static JScrollPane scrollPane = new JScrollPane();
    static JSplitPane splitPane = new JSplitPane();
    static JPanel panel_left = new JPanel();
    static JPanel panel_right = new JPanel();

    static class login extends JFrame {

        public static void main(String[] args) throws Exception {
            final Car2q c2q = new Car2q();
            c2q.getReport();

            frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
            frame.pack();
            frame.setVisible(true);
            frame.setSize(550, 300);
            frame.setVisible(true);
            frame.add(splitPane);
            splitPane.setSize(550, 300);
            splitPane.setLeftComponent(scrollPane);
            splitPane.setLeftComponent(panel_left);
            splitPane.setRightComponent(panel_right);
            panel_left.setLayout(new GridLayout(0, 1, 5, 5));
            panel_right.setLayout(new GridLayout(0, 2, 5, 5));
        }
    }

    public Car2q() {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            con = DriverManager.getConnection("");
            con.createStatement();
        }
        catch (Exception e) {
            System.out.println("Error: " + e);
        }
    }

    public String getReport() {
        String car_number = null;
        String report = null;
        List car_number_list = new ArrayList<>();
        try {
            PreparedStatement st = null;
            String query2 = "select * FROM car_register";
            st = con.prepareStatement(query2);
            rs = st.executeQuery();
            while (rs.next()) {
                car_number = rs.getString("car_number");
                String gotit = rs.getString("car_number");
                JButton btn = new JButton(gotit);
                btn.setSize(100, 100);
                panel_left.add(btn);
                ActionListener actionListener = new btn_listener();
                btn.addActionListener(actionListener);
            }
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
        return car_number;
    }

    public class btn_listener implements ActionListener {
        public void actionPerformed(ActionEvent arg0) {
            Car2q c2q = new Car2q();
            String car = c2q.getReport();
            System.out.println(car);
        }
    }
}

【问题讨论】:

  • 将值传递给 btn_listener 构造函数并将其存储在该类的字段中。
  • Java 命名约定的类名以大写字母开头,并且使用不带下划线的 CamelCase。示例:BtnListener。
  • @tgdavies 我是 Java 新手,你能说得更具体点吗?)你说的类似public class btn_listener implements ActionListener { public btn_listener(){ try { public void actionPerformed(ActionEvent arg0) { Car2q c2q = new Car2q(); String car = c2q.getReport(); System.out.println(car); } } }

标签: java mysql swing actionlistener


【解决方案1】:

这样写你的按钮监听器:

    public class btn_listener implements ActionListener {
        private final String car_number;

        public bin_listener(String car_number) {
            this.car_number = car_number;
        }
        public void actionPerformed(ActionEvent arg0) {
            System.out.println(car_number);
        }
    }

然后在您的循环中创建 ActionListener:

    ActionListener actionListener = new btn_listener(car_number);

当然要成为惯用的 Java,您应该使用 carNumberBtnListener 等等。

【讨论】:

    【解决方案2】:
    car_number = rs.getString("car_number");
    String gotit = rs.getString("car_number");
    JButton btn = new JButton(gotit);
    

    您不需要两个包含相同值的变量。您只需将车号设置为按钮的文本即可。

    那么你ActionListener中的代码就变成了:

    public void actionPerformed(ActionEvent e)
    {
        JButton button = (JButton)e.getSource();
        System.out.println( button.getText() );
    }
    

    ActionListener 现在是通用的,可以由您的所有按钮共享。

    所以你的代码变成了:

            ActionListener buttonListener = new CarButtonListener();
    
            while (rs.next()) {
                //car_number = rs.getString("car_number");
                String gotit = rs.getString("car_number");
                JButton btn = new JButton(gotit);
                btn.setSize(100, 100);
                panel_left.add(btn);
                //ActionListener actionListener = new btn_listener();
                //btn.addActionListener(actionListener);
                btn.addActionListener(buttonListener);
            }
    

    这可以让您的代码更高效并使用更少的内存,因为您只需要一个监听器实例。

    请注意,我将您的“btn_listener”类重命名为“CarButtonListener”,因为:

    1. 类名应该是描述性的
    2. 类名中的每个单词都应以大写字符开头

    【讨论】:

      猜你喜欢
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      • 2012-12-13
      • 1970-01-01
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多