【问题标题】:JavaFX: Populating a ComboBox with data from a MySQL Database, StringConverter breaking the comboboxJavaFX:使用 MySQL 数据库中的数据填充 ComboBox,StringConverter 打破组合框
【发布时间】:2017-01-25 04:13:02
【问题描述】:

我有一个 ComboBox,我想用数据库中的数据填充它。使用以下代码,ComboBox 中显示的数据是值的 ID,而不是 string 值。

(部分)Java 控制器代码:

@FXML
    ComboBox studentPicker;
@Override
    public void initialize(URL url, ResourceBundle rb) {
        String dbUsername = "root";
        String dbPassword = "x";
        String dbURL = "jdbc:mysql://localhost:3306/uia";
        try {
            Connection conn = DriverManager.getConnection(dbURL, dbUsername, dbPassword);
            data = FXCollections.observableArrayList();
            // Execute query and store result in a resultset
            ResultSet rs = conn.createStatement().executeQuery("SELECT username FROM user WHERE userrole='STUDENT';");
            while (rs.next()) {
                //get string from db,whichever way 
                data.add(new User(rs.getString("username")));
            }

        } catch (SQLException ex) {
            System.err.println("Error"+ex);
        }

        studentPicker.setItems(null);
        studentPicker.setItems(data);
    }

我尝试的StringConverter 是从How to import database data into combo box in javafx 提取的,但这导致ComboBox 出错。见下图:左图是应该的样子,右图是StringConverter加入代码后的样子。

studentPicker.setConverter(new StringConverter<User>() {

        @Override
        public String toString(User object) {
            return object.getName();
        }

        @Override
        public User fromString(String string) {
            // TODO Auto-generated method stub
            return null;
        }
    });

我想显示的是从数据库中收集的用户名,但会显示诸如“is20x.User@4b6ca8f7”之类的 ID。 非常感谢任何有关如何解决此问题的建议。

【问题讨论】:

  • 看起来您正在将new User("name") 添加到data 数组。这就是您收到"is20x.User@4b6ca8f7" 的原因。如果您的 User 类有 getName()getUsername() 方法,请改为调用它。所以像data.add(new User(rs.getString("username")).getUserName());

标签: java javafx combobox fxml


【解决方案1】:

从我的评论中回答。

您正在将new User("username") 添加到您的data 数组中,这就是为什么您会得到一个奇怪的字符串,它是那个特定User 的ID。

如果您的User 类有getUserName() 方法,请尝试改用data.add(new User(rs.getString("username")).getUserName());

这可能会破坏你正在尝试做的一切,因为我假设你使用data 更多只是在这里。最好创建另一个变量并将您的组合框字符串存储在其中。所以像

//Init same place data is
comboString = FXCollections.observableArrayList(); //Declared somewhere else
data.add(new User(rs.getString("username")));
comboString.add(rs.getString("username"));

【讨论】:

  • 谢谢!完美运行。
【解决方案2】:

我想分享我为自动设置 MySQL 数据库中的数据所做的工作。 (很简单)

        // first I execute the query that select name of department one by one
        resultSet = statement.executeQuery("Select name from department");

        while (resultSet.next()) {  // loop

           // Now add the comboBox addAll statement 
            comboBox.getItems().addAll(resultSet.getString("name")); 
       }

请注意,最后一行的“name”字段与 MySQL 表中列的名称拼写完全相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 2012-09-11
    • 2014-09-18
    相关资源
    最近更新 更多