#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», поскольку:
- имена классов должны быть описательными
- каждое слово в имени класса должно начинаться с символа верхнего регистра