如何解决 Java Swing 中的组合框问题?

问题描述 投票:0回答:1

正如标题所说,我无法填充我的组合框。

好吧,我正在为一家足球俱乐部制作一个程序,用于管理赛事和球员。 我的想法是,我有一个 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”为空

这是可以理解的,因为一开始它是空的,所以我无法进行比较。

你能帮我解决这个问题吗?

当我更改第一个组合框的选定项目时,我希望它重新加载第二个组合框

java sqlite swing combobox
1个回答
0
投票

我很确定...

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()])));
    }
}

可能会产生更理想的结果。

© www.soinside.com 2019 - 2024. All rights reserved.