2015-05-29 1 views
-1

Я использовал этот код, чтобы поместить ComboBoxCell в таблицу под названием «ComboTable». Данные первых двух колонок задаются подключением к базе данных ниже этого кода.Получить значение ComboBoxTableCell

ComboTable.setEditable(true); 
     col1.setCellValueFactory(new PropertyValueFactory<model, String>("rCol1")); 
     col2.setCellValueFactory(new PropertyValueFactory<model, String>("rCol2")); 
     col3.setCellValueFactory(new PropertyValueFactory<model, String>("rCol3")); 
     col3.setCellFactory(ComboBoxTableCell.forTableColumn(cbValues)); 

     // ChangeListener 
     ComboTable.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Object>() { 
     @Override 
     public void changed (ObservableValue<?> oValue, Object oldValue, Object newValue) { 
      tableIndexProperty.set(tableData.indexOf(newValue)); 
      tableIndex = (tableData.indexOf(newValue)); 
      System.out.println("Index:\t" + tableIndex); 
      System.out.println(col3.getCellData(tableIndex)); 
     }}); 

Так что теперь я хочу получить значение после установки значения в таблице с помощью прослушивателя изменений. Я думал, что этот код дает мне значение после того, как я выбрал значение для comboboxtablecell:

System.out.println(col3.getCellData(tableIndex)); 

Где моя ошибка в этой части, если моя программа или это неправильный путь, чтобы получить значение?

Кстати, вот выход моей программы:

*** Loaded Oracle-Driver *** 
*** Connected with Database *** 
Index of Databaserow: 1 
Daten1: one   Daten2: two 
Index of Databaserow: 2 
Daten1: tree   Daten2: four 

*** Database data saved to Observable List named 'data' *** 
*** Table Items setted *** 

Я нажал на строк таблицы здесь -> ChangeListener:

Index: 1 
null 
Index: 0 
null 
Index: 1 
null 
Index: 0 
null 

Модель:

package model; 

import controller.main_controller.ComboValues; 
import javafx.beans.property.ObjectProperty; 
import javafx.beans.property.SimpleObjectProperty; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.property.StringProperty; 

public class model { 

    private StringProperty rCol1 = new SimpleStringProperty(); 
    private StringProperty rCol2 = new SimpleStringProperty(); 
    private ObjectProperty<ComboValues> rCol3 = new SimpleObjectProperty<>(); 


    public model(String sCol1, String sCol2, ComboValues sCol3) { 
     setCol1(sCol1); 
     setCol2(sCol2); 
     setComboValues(sCol3); 
    } 

    public final StringProperty col1Property() { 
     return this.rCol1; 
    } 

    public final String setCol1() { 
     return this.col1Property().get(); 
    } 

    public final void setCol1(final String col1) { 
     this.col1Property().set(col1); 
    } 

    public final StringProperty col2Property() { 
     return this.rCol2; 
    } 

    public final String setCol2() { 
     return this.col2Property().get(); 
    } 

    public final void setCol2(final String col2) { 
     this.col1Property().set(col2); 
    } 

    public final ObjectProperty<ComboValues> combovaluesProperty() { 
     return this.rCol3; 
    } 

    public final ComboValues getComboValues() { 
     return this.combovaluesProperty().get(); 
    } 

    public final void setComboValues(final ComboValues rCol3) { 
     this.combovaluesProperty().set(rCol3); 
    } 

} 
+0

ли вы установить '' cellValueFactory' для col3'? Вы действительно должны просто получить значение от модели; если у вас есть правильная настройка, модель автоматически обновится, когда пользователь совершит редактирование с помощью поля со списком. –

+0

нет, его не входит в модель. Как я могу включить его там? – lukas22497

+0

Просто создайте свойство для него в модели так же, как у вас есть свойства для других столбцов ... Трудно ответить, не зная, что вы пытаетесь сделать здесь. –

ответ

1

Проблема заключается в том, что вы не установили для этого столбца cellValueFactory, поэтому никаких данных, связанных с ним, не существует. Таким образом, когда вы вызываете getCellData(...), который ищет значение ячейки, он (конечно) возвращает null. Просто установите cellValueFactory на свой столбец, который отображает в модель так же, как и для столбцов, используя значение по умолчанию cellFactory.

Вот пример, используя стандартную контактную таблицу из учебников Oracle:

import java.util.Arrays; 

import javafx.application.Application; 
import javafx.beans.property.ObjectProperty; 
import javafx.beans.property.SimpleObjectProperty; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.property.StringProperty; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.scene.Scene; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.control.cell.ComboBoxTableCell; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 

public class TableViewWithComboColumn extends Application { 

    public enum Category { Friends, Family, Work, Other } 

    @Override 
    public void start(Stage primaryStage) { 
     TableView<Person> table = new TableView<>(); 
     table.setEditable(true); 

     TableColumn<Person, String> firstNameCol = new TableColumn<>("First name"); 
     TableColumn<Person, String> lastNameCol = new TableColumn<>("Last name"); 
     TableColumn<Person, String> emailCol = new TableColumn<>("Email"); 
     TableColumn<Person, Category> categoryCol = new TableColumn<>("Category"); 


     firstNameCol.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty()); 
     // or firstNameCol.setCellValueFactory(new PropertyValueFactory<>("firstName")); etc 

     lastNameCol.setCellValueFactory(cellData -> cellData.getValue().lastNameProperty()); 
     emailCol.setCellValueFactory(cellData -> cellData.getValue().emailProperty()); 

     categoryCol.setCellValueFactory(cellData -> cellData.getValue().categoryProperty()); 
     categoryCol.setCellFactory(ComboBoxTableCell.forTableColumn(Category.values())); 

     ObservableList<Person> tableData = createData(); 
     table.setItems(tableData); 

     table.getSelectionModel().selectedItemProperty().addListener((obs, oldSelectedPerson, newSelectedPerson) -> { 
      int tableIndex = tableData.indexOf(newSelectedPerson) ; 
      System.out.println("Index:\t" + tableIndex); 
      System.out.println(categoryCol.getCellData(tableIndex)); 
      // better: just get the data from the model: 
      System.out.println(newSelectedPerson.getCategory()); 
     }); 

     table.getColumns().addAll(Arrays.asList(
      firstNameCol, lastNameCol, emailCol, categoryCol 
     )); 

     primaryStage.setScene(new Scene(new BorderPane(table), 800, 600)); 
     primaryStage.show(); 

    } 

    private ObservableList<Person> createData() { 
     return FXCollections.observableArrayList(
      new Person("Jacob", "Smith", "[email protected]", Category.Family), 
      new Person("Isabella", "Johnson", "[email protected]", Category.Friends), 
      new Person("Ethan", "Williams", "[email protected]", Category.Work), 
      new Person("Emma", "Jones", "[email protected]", Category.Work), 
      new Person("Michael", "Brown", "[email protected]", Category.Other) 
     ); 
    } 

    public static class Person { 

     private final StringProperty firstName = new SimpleStringProperty(); 
     private final StringProperty lastName = new SimpleStringProperty(); 
     private final StringProperty email = new SimpleStringProperty() ; 
     private final ObjectProperty<Category> category = new SimpleObjectProperty<>(); 

     public Person(String firstName, String lastName, String email, Category category) { 
      setFirstName(firstName); 
      setLastName(lastName); 
      setEmail(email); 
      setCategory(category); 
     } 

     public final StringProperty firstNameProperty() { 
      return this.firstName; 
     } 

     public final String getFirstName() { 
      return this.firstNameProperty().get(); 
     } 

     public final void setFirstName(final String firstName) { 
      this.firstNameProperty().set(firstName); 
     } 

     public final StringProperty lastNameProperty() { 
      return this.lastName; 
     } 

     public final String getLastName() { 
      return this.lastNameProperty().get(); 
     } 

     public final void setLastName(final String lastName) { 
      this.lastNameProperty().set(lastName); 
     } 

     public final StringProperty emailProperty() { 
      return this.email; 
     } 

     public final String getEmail() { 
      return this.emailProperty().get(); 
     } 

     public final void setEmail(final String email) { 
      this.emailProperty().set(email); 
     } 

     public final ObjectProperty<Category> categoryProperty() { 
      return this.category; 
     } 

     public final Category getCategory() { 
      return this.categoryProperty().get(); 
     } 

     public final void setCategory(final Category category) { 
      this.categoryProperty().set(category); 
     } 


    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

Я создал свойство в своей таблице и изменил основной код на col3.setCellValue .... я отредактировал в моем первом сообщении. Но я не понял, как это работает с объектом в таблице. И я не понимаю, как есть «newSelectedPerson» в ChangeListener. – lukas22497

+0

Я отредактировал свой ChangeListener на ваш, я хочу получить значение с помощью «лучшего» способа «ComboTable.getSelectionModel(). SelectedItemProperty(). AddListener ((obs, oldValue, newValue) -> { int tableIndex = tableData.indexOf (newValue); System.out.println ("Index: \ t" + tableIndex); // System.out.println (col3. getCellData (tableIndex)) // лучше: просто введите данные из модели: System.out.println ("Value: \ t" + newValue.getRCol3()); }); 'Но вывод говорит : 'Значение: \t null Индекс: \t 0' – lukas22497