Получить значение строки в попытке другого метода

#java #mysql #swing #actionlistener

#java #mysql #качать #actionlistener

Вопрос:

Итак, эта программа получает значение 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. Передайте значение конструктору btn_listener и сохраните его в поле этого класса.

2. В соглашениях об именовании Java имена классов начинаются с заглавной буквы и используют camelCase без подчеркивания. Пример: BtnListener.

3. @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); } } }

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

Ответ №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. каждое слово в имени класса должно начинаться с символа верхнего регистра