gpt4 book ai didi

tableview - JavaFX TableView 一列中的多个组件

转载 作者:行者123 更新时间:2023-12-04 23:05:18 28 4
gpt4 key购买 nike

我正在使用 JavaFx 2.2。我遇到了一个问题,我无法在 TableView 列中放置不同的组件。例如我有两列

1) 回答

2) 答案类型

如果 AnswerType 包含“Multiple Choice”,则 Answer Column 中的相应单元格应显示 ComboBox,否则应显示 TextField。

我在下面有一个代码示例,但它显示 ComboBox 或 TextField,但不能同时显示在同一列的不同单元格中。

import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Callback;
import javafx.scene.control.cell.ComboBoxTableCell;

public class TableCellWithMultipleComponent extends Application {

@SuppressWarnings("rawtypes")
TableColumn answerTypeCol;
@SuppressWarnings("rawtypes")
TableColumn answerCol;
ObservableList<String> namesChoiceList;

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

@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public void start(final Stage primaryStage) {
primaryStage.setTitle("Table Cell With Multiple Components");

TableView<Person> table = new TableView<Person>();
table.setEditable(true);
final ObservableList<Person> data =
FXCollections.observableArrayList(
new Person("A", "Multiple Choice"),
new Person("JOHN", "Free Text"),
new Person("123", "Free Text"),
new Person("D", "Multiple Choice")
);

GridPane gridpane = new GridPane();
gridpane.setPadding(new Insets(5));
gridpane.setHgap(5);
gridpane.setVgap(5);


namesChoiceList = FXCollections.observableArrayList("A", "B", "C", "D", "INVALID_ANSWER", "NO_ANSWER");

answerCol = new TableColumn();
answerCol.setText("Answers");
answerCol.setMinWidth(210);
answerCol.setEditable(true);
answerCol.setCellValueFactory(new PropertyValueFactory("answers"));


answerCol.setCellFactory( new Callback<TableColumn<String, String>, TableCell<String, String>>() {
@Override
public TableCell<String, String> call(TableColumn<String, String> arg0) {
return new anyMethod();
}
});



answerTypeCol = new TableColumn();
answerTypeCol.setText("Answers Type");
answerTypeCol.setMinWidth(210);
answerTypeCol.setEditable(true);
answerTypeCol.setCellValueFactory(new PropertyValueFactory("answersType"));



table.setItems(data);
table.getColumns().addAll(answerCol, answerTypeCol);

StackPane root = new StackPane();

Scene scene =new Scene(root, 500, 550);

gridpane.add(table, 1, 5,1,20 );


root.getChildren().addAll(gridpane);
primaryStage.setScene(scene);
primaryStage.show();

}


private class anyMethod extends TableCell <String, String>{


@SuppressWarnings("unchecked")
@Override
protected void updateItem(String item, boolean arg1) {
super.updateItem(item, arg1);

answerCol.setCellFactory(ComboBoxTableCell.<String, String>forTableColumn(namesChoiceList));

/**** I have to execute this commented code so that if the column cell has text "Multiple Choice" then
* it displays the comboBox otherwise it displays the text field in the Table View cell

if (item.equalsIgnoreCase("Multiple Choice")){
answerCol.setCellFactory(ComboBoxTableCell.<String, String>forTableColumn(namesChoiceList));
}
else{
//answerCol.setCellFactory(TextFieldTableCell.<String>forTableColumn());
}
****/
}

}


public static class Person {
private final SimpleStringProperty answers;
private final SimpleStringProperty answersType;


private Person(String answers, String answersType) {
this.answers = new SimpleStringProperty(answers);
this.answersType = new SimpleStringProperty(answersType);
}

public String getAnswers() {
return answers.get();
}
public void setAnswers(String answers) {
this.answers.set(answers);
}

public String getAnswersType() {
return answersType.get();
}
public void setAnswersType(String answersType) {
this.answersType.set(answersType);
}
}



}

最佳答案

下面是 EditingCell 的示例,它根据单元格的支持字段(字符串或 bool 值)表示的数据类型在单元格(文本编辑字段或复选框)中呈现不同的控件。 Complete executable code is available as a gist .

对于您的特定示例,除了查询 String => TextField 或 ObservableList => 组合框的类型之外,使用相同的概念。此外,对于您的特定示例,ChoiceBox 可能是比 ComboBox 更易于使用的控件。

class EditingCell extends TableCell<NamedProperty, Object> {
private TextField textField;
private CheckBox checkBox;
public EditingCell() {}

@Override public void startEdit() {
if (!isEmpty()) {
super.startEdit();

if (getItem() instanceof Boolean) {
createCheckBox();
setText(null);
setGraphic(checkBox);
} else {
createTextField();
setText(null);
setGraphic(textField);
textField.selectAll();
}
}
}

@Override public void cancelEdit() {
super.cancelEdit();

if (getItem() instanceof Boolean) {
setText(getItem().toString());
} else {
setText((String) getItem());
}
setGraphic(null);
}

@Override public void updateItem(Object item, boolean empty) {
super.updateItem(item, empty);

if (empty) {
setText(null);
setGraphic(null);
} else {
if (isEditing()) {
if (getItem() instanceof Boolean) {
if (checkBox != null) {
checkBox.setSelected(getBoolean());
}
setText(null);
setGraphic(checkBox);
} else {
if (textField != null) {
textField.setText(getString());
}
setText(null);
setGraphic(textField);
}
} else {
setText(getString());
setGraphic(null);
}
}
}

private void createTextField() {
textField = new TextField(getString());
textField.setMinWidth(this.getWidth() - this.getGraphicTextGap()* 2);
textField.focusedProperty().addListener(new ChangeListener<Boolean>() {
@Override public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
if (!newValue) {
commitEdit(textField.getText());
}
}
});
}

private void createCheckBox() {
checkBox = new CheckBox();
checkBox.setSelected(getBoolean());
checkBox.setMinWidth(this.getWidth() - this.getGraphicTextGap()* 2);
checkBox.focusedProperty().addListener(new ChangeListener<Boolean>() {
@Override public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
if (!newValue) {
commitEdit(checkBox.isSelected());
}
}
});
}

private String getString() {
return getItem() == null ? "" : getItem().toString();
}

private Boolean getBoolean() {
return getItem() == null ? false : (Boolean) getItem();
}
}

关于tableview - JavaFX TableView 一列中的多个组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13853621/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com