正如标题所说,我无法填充我的组合框。
好吧,我正在为一家足球俱乐部制作一个程序,用于管理赛事和球员。 我的想法是,我有一个 SQLite 数据库和一个带有 2 个组合框的 Java Swing 程序,一个用于类型(玩家或事件),另一个用于(玩家或事件名称)。当类型组合框选定的项目更改时,它应该重新加载第二个组合框中的所有项目,即建立数据库连接并获取所有玩家或所有事件名称。
这是我的代码
javax.swing.*;
import java.awt.*;
import java.sql.*;
import java.text.MessageFormat;
public class MainWindow extends JFrame {
private JPanel window;
private JComboBox<String> comboBox2;
private JButton deleteButton;
private JComboBox<String> type = new JComboBox<>(new String[] {"Spieler", "Events"});
private JButton addButton;
private JButton changeButton;
String selected = (String) type.getSelectedItem();
Util util = new Util();
MainWindow() throws SQLException{
setConfigurations();
reloadSelection(selected);
type.addActionListener(e -> {
try {reloadSelection((selected));}
catch (SQLException ex) {throw new RuntimeException(ex);}
});
addButton.addActionListener(e -> System.out.println("not yet implemented"));
deleteButton.addActionListener(e -> System.out.println("not yet implemented"));
changeButton.addActionListener(e -> System.out.println("not yet implemented"));
}
private void reloadSelection(String selected) throws SQLException {
Connection c = util.getConnection();
Statement stmt = c.createStatement();
String[] arr = new String[0];
String query;
System.out.println(selected);
if(selected.equals("Spieler")) {
query = "SELECT firstName, lastName FROM Players;";
ResultSet rs = stmt.executeQuery(query);
while(rs.next()) {
String name = rs.getString("firstName") + rs.getString("lastName");
arr = name.split("\n");
}
}
/*else if(selected.equals("Events")) {
query = "SELECT eventName FROM Events;";
} */
comboBox2.setModel(new DefaultComboBoxModel<>(arr));
util.closeConnection(c);
}
private void setConfigurations() {
setContentPane(window);
setName("LineUp");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(350, 175);
setMaximumSize(new Dimension(350, 175));
setMinimumSize(new Dimension(350, 175));
}
}
它还说我用
覆盖代码private JComboBox<String> type = new JComboBox<>(new String[] {"Spieler", "Events"});
但是当我将减速放入配置函数中时,它输出:
线程“main”中出现异常java.lang.NullPointerException:无法调用“String.equals(Object)”,因为“selected”为空
这是可以理解的,因为一开始它是空的,所以我无法进行比较。
你能帮我解决这个问题吗?
当我更改第一个组合框的选定项目时,我希望它重新加载第二个组合框
我很确定...
String name = rs.getString("firstName") + rs.getString("lastName");
arr = name.split("\n");
永远不会做你想做的事。除了
name
不太可能包含 \n
之外,您还可以在每次迭代中为 arr
分配一个新值,因此最多只能得到最后一行。
相反,我建议使用某种
List
来代替。 List
有一个 toArray
方法,您可以使用该方法将结果提供给 DefaultComboBoxModel
。
我还建议查看 try-with-resources 和 使用准备好的语句(作为最佳实践的考虑)。
类似...
private void reloadSelection(String selected) throws SQLException {
if ("Spieler".equals(selected)) {
List<String> rows = new ArrayList<>(32);
try (Connection c = util.getConnection();
PreparedStatement stmt = c.prepareStatement("SELECT firstName, lastName FROM Players");
ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
String name = rs.getString("firstName") + " " + rs.getString("lastName");
rows.add(name.trim());
}
}
comboBox2.setModel(new DefaultComboBoxModel<>(rows.toArray(new String[rows.size()])));
}
}
可能会产生更理想的结果。