Итак, эта программа получает значение car_number из базы данных "getReprt" method и дает имя кнопке как значение из базы данных. Кроме того, мне нужно получить это значение рядом с обработчиком действий 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);
        }
    }
}
-1
Drop 5 Дек 2020 в 13:29

2 ответа

Лучший ответ

Напишите свой слушатель кнопок следующим образом:

    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, вы должны использовать carNumber, BtnListener и так далее.

1
tgdavies 5 Дек 2020 в 20:32
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. каждое слово в имени класса должно начинаться с символа верхнего регистра
0
camickr 5 Дек 2020 в 16:12