JAVAFX ListView - Можно ли скрыть идентификатор «столбец», или я должен использовать один столбец TableView? - PullRequest
0 голосов
/ 14 октября 2018

В MS Access «ListBox» может скрывать первый «столбец» 2-столбца ResultSet - он отлично подходит для скрытия «идентификаторов», которые легко доступны, когда пользователь выбирает элемент из списка.

Если возможно, я хочу сделать то же самое в JavaFX с ListView, чтобы я мог заполнить второй ListView на основе выбора из первого ListView.

Это - то, как я заполняю ListView: menuList1.setItems(MenuUtilities.getDivisions()); из

public static ObservableList getDivisions() {

    ObservableList divisionListRow = FXCollections.observableArrayList();
    try {
        Connection conn;
        conn = Connect_db.getConnection();
        String query = "SELECT ID, Division FROM tbl_ref_employee_divisions";
        PreparedStatement prestate = conn.prepareStatement(query);
        ResultSet divsResult = prestate.executeQuery();
        while (divsResult.next()) {

            for (int i = 1; i <= divsResult.getMetaData().getColumnCount(); i++) {
                divisionListRow.add(divsResult.getString(i));
            }
        }
        prestate.close();
        divsResult.close();
        conn.close();

    } catch (SQLException ex) {
        ex.printStackTrace();
    }
    return divisionListRow;
}

отображение списка: см. Изображение вывода представления списка

Изизображение у меня создается впечатление, что listView не может отформатировать массив.Если так, лучше ли я использовать один столбец TableView?И если да, то как мне отобразить один строковый столбец из ObservableList и получить доступ к целочисленному идентификатору выбранного элемента в коде.

большое спасибо

1 Ответ

0 голосов
/ 14 октября 2018

Вы получаете доступ к ResultSet таким образом, что для каждой строки вы добавляете элемент для каждого из столбцов.Вам необходимо добавить по одному элементу для каждой строки, которую вы хотите отобразить в ListView, т.е. в этом случае по одному элементу в строке в ResultSet.

, поскольку вы хотите, чтобы ID былчтобы получить доступ, вы должны создать пользовательский тип, содержащий значения для обеих строк (или использовать существующий класс, например Pair), и использовать cellFactory для выбора данных для отображения.

public class EmployeeDivision {
    private final long id; // or maybe String/int as type?
    private final String name;

    public EmployeeDivision (long id, String name) {
        this.id = id;
        this.name = name;
    }

    /* getters */

}
ListView<EmployeeDivision> menuList1;
menuList1.setCellFactory(lv -> new ListCell<EmployeeDivision>() {
    @Override
    protected void updateItem(EmployeeDivision item, boolean empty) {
        super.updateItem(item, empty);
        setText(empty || item == null ? "" : item.getName());
    }
});
while (divsResult.next()) {
    divisionListRow.add(new EmployeeDivision(divsResult.getLong(1), divsResult.getString(2)));
}

Это позволяет вам получить доступ к идентификатору выбранного элемента следующим образом:

EmployeeDivision selectedItem = menuList1.getSelectionModel().getSelectedItem();
if (selectedItem != null) {
    System.out.println("id = " + selectedItem.getId());
} else {
    System.out.println("no item selected");
}

Кстати: я рекомендую указывать параметры типа, если у вас нет веской причины использовать необработанный тип,Это позволяет компилятору выполнять некоторые проверки, которые могут привести к проблемам, которые трудно обнаружить, если использовался необработанный тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...