Здесь есть пара вещей, на которые следует обратить внимание. Прежде всего, вы никогда не говорите своему ComboBox
, где найти данные, которые должны отображаться.
Это делается с помощью метода comboBoxx.setItems()
. Это легко сделать с помощью метода initialize()
контроллера.
Кроме того, вы заявили, что задали для свойства onAction
ComboBox
свой метод fillComboBox2()
. Это не правильно. Это приведет к тому, что метод fillComboBox2()
будет вызываться при каждом нажатии раскрывающегося списка для ComboBox
.
Вместо этого вы должны заполнить ComboBox
при загрузке сцены. Итак, удалите определение onAction
из вашего FXML
документа.
Наконец, было бы неплохо полностью изменить этот метод. В моем обновленном коде ниже вы увидите, что я изменил его на метод private
, который возвращает List<String>
. Мы можем использовать это List
для заполнения ComboBox
.
Теперь, когда сцена загружается, вызывается метод comboBoxx.setItems()
, и для его заполнения используется List<String>
из метода getData()
.
В приведенном ниже коде также есть несколько комментариев, которые помогут объяснить ход.
КОД
import javafx.collections.FXCollections;
import javafx.fxml.FXML;
import javafx.scene.control.ComboBox;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
public class FXMLController {
// If you ComboBox is going to display Strings, you should define that datatype here
@FXML
private ComboBox<String> comboBoxx;
@FXML
private void initialize() {
// Within this initialize method, you can initialize the data for the ComboBox. I have changed the
// method from fillComboBox2() to getData(), which returns a List of Strings.
// We need to set the ComboBox to use that list.
comboBoxx.setItems(FXCollections.observableArrayList(getData()));
}
/**
* Here we will define the method that builds the List used by the ComboBox
*/
private List<String> getData() {
String connectionUrl = "jdbc:sqlserver://localhost:1433;" + "databaseName=TestDB;integratedSecurity=true;";
// Define the data you will be returning, in this case, a List of Strings for the ComboBox
List<String> options = new ArrayList<>();
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection con = DriverManager.getConnection(connectionUrl);
String query = "select artikulli from product_table";
PreparedStatement statement = con.prepareStatement(query);
ResultSet set = statement.executeQuery();
while (set.next()) {
options.add(set.getString("artikulli"));
}
statement.close();
set.close();
// Return the List
return options;
} catch (ClassNotFoundException | SQLException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
}
}