如何从javafx中的表视图列中获取选择框中所选项的值

时间:2014-03-31 17:12:42

标签: javafx

如何从下表中的choce框中获取所选选项的值。 column3有13个选择框节点使用以下代码填充。我想获取所选项目。

final ObservableList LogLevelList=FXCollections.observableArrayList("FATAL", "ERROR", "WARN", "INFO", "INOUT", "DEBUG");
column3.setCellFactory(new Callback<TableColumn<Feature,String>,TableCell<Feature,String>>(){
@Override
public TableCell<Feature,String> call(TableColumn<Feature,String> param) { 
TableCell<Feature,String> cell = new TableCell<Feature,String>(){
@Override
public void updateItem(String item, boolean empty) {
System.out.println("Inside UpdateItem");
ChoiceBox choice = new ChoiceBox(LogLevelList); 
choice.getSelectionModel().select(LogLevelList.indexOf(item));
//SETTING ALL THE GRAPHICS COMPONENT FOR CELL
setGraphic(choice);
}
}; 
return cell;
} 
});

2 个答案:

答案 0 :(得分:1)

预定义的ChoiceBoxTableCell是否能满足您的需求?

column3.setCellFactory(ChoiceBoxTableCell.forTableColumn(logLevelList));

看看这是否有帮助:

import java.util.stream.Collectors;
import java.util.stream.IntStream;

import javafx.application.Application;
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.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.ChoiceBoxTableCell;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class TableChoiceBoxTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        final TableView<Feature> table = new TableView<>();
        table.setEditable(true);
        final TableColumn<Feature, String> nameCol = new TableColumn<>("Name");
        nameCol.setCellValueFactory(new PropertyValueFactory<>("name"));
        final TableColumn<Feature, String> logLevelCol = new TableColumn<>("Log level");
        logLevelCol.setCellValueFactory(new PropertyValueFactory<>("logLevel"));
        logLevelCol.setPrefWidth(150);

        final ObservableList<String> logLevelList = FXCollections.observableArrayList("FATAL", "ERROR", "WARN", "INFO", "INOUT", "DEBUG");
        logLevelCol.setCellFactory(ChoiceBoxTableCell.forTableColumn(logLevelList));

        table.getColumns().addAll(nameCol, logLevelCol);

        table.getItems().setAll(
            IntStream.rangeClosed(1, 20)
                .mapToObj(i -> new Feature("Item "+i, "FATAL")) 
                .collect(Collectors.toList())
            );

        Button showDataButton = new Button("Dump data");
        showDataButton.setOnAction(event -> table.getItems().forEach(System.out::println));

        BorderPane root = new BorderPane();
        root.setCenter(table);
        root.setBottom(showDataButton);

        Scene scene = new Scene(root, 400, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static class Feature {
        private final StringProperty name ;
        private final StringProperty logLevel ;

        public Feature(String name, String logLevel) {
            this.name = new SimpleStringProperty(this, "name", name);
            this.logLevel = new SimpleStringProperty(this, "logLevel", logLevel);
        }

        public StringProperty nameProperty() {
            return name ;
        }
        public final String getName() {
            return name.get();
        }
        public final void setName(String name) {
            this.name.set(name);
        }

        public StringProperty logLevelProperty() {
            return logLevel ;
        }
        public final String getLogLevel() {
            return logLevel.get();
        }
        public final void setLogLevel(String logLevel) {
            this.logLevel.set(logLevel);
        }

        @Override
        public String toString() {
            return getName() + ": " + getLogLevel();
        }
    }

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

提供的ChoiceBoxTableCell会为您更新相关项的属性,因此从不需要从ChoiceBox获取值;您可以从模型对象中获取值。

答案 1 :(得分:1)

我认为您的代码存在错误。您不希望在该列的每个单元格中显示您的选择框(即清空行的单元格),此外您还应该调用超类函数。

现在,要获取ChoiceBox的选定值,而不是仅显示带有值的选项框,您必须将它们保存在某些ArrayList或Map或最佳选项中,以保存在功能类中。这样你最终可以使用

@Override
public void updateItem(String item, boolean empty) {
    super.updateItem(item,empty);
    if(item != null){
        ChoiceBox choice = new ChoiceBox(LogLevelList); 
        choice.getSelectionModel().select(LogLevelList.indexOf(item));
        choice.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() {
            @Override
            public void changed(ObservableValue<? extends String> ov, String t, String t1) {
                 //either use   : myMap.put(getIndex(),t1); 
                 //or       : item.setChoice(t1);
            }
        });
        //SETTING ALL THE GRAPHICS COMPONENT FOR CELL
        setGraphic(choice);
    }
}

另外,对于TableView中的ChoiceBox演示,有一篇博文:http://blog.ngopal.com.np/2011/10/01/tableview-cell-modifiy-in-javafx/