Заполнение поля со списком - PullRequest
0 голосов
/ 29 августа 2018

Я хочу создать ComboBox, который заполняется данными из базы данных, но он не работает. Сценарий в порядке, я сделал fxid: comboBoxx и onAction: fillComboBox2 и его запуск, но у меня нет никаких данных, просто blank.I не знаю, в чем проблема, я попробовал все, что я знаю.

public class FXMLController implements Initializable {

    @FXML       
    private ComboBox comboBoxx;

    final ObservableList options = FXCollections.observableArrayList();



  public void initialize(URL url, ResourceBundle rb) {

  }

  public void fillComboBox2() {
    String connectionUrl = "jdbc:sqlserver://localhost:1433;" + "databaseName=TestDB;integratedSecurity=true;";
    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();

    } catch(ClassNotFoundException | SQLException ex) {
         Logger.getLogger(JavaFXExample.class.getName()).log(Level.SEVERE, null, ex);
    }
  }
}

1 Ответ

0 голосов
/ 30 августа 2018

Здесь есть пара вещей, на которые следует обратить внимание. Прежде всего, вы никогда не говорите своему 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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...