JavaFX 학습의 예 7
10829 단어 checkboxJavaFXTextFiled편집 가능한 테이블
import java.lang.reflect.*;
import java.util.Arrays;
import java.util.logging.*;
import javafx.application.Application;
import javafx.beans.property.*;
import javafx.beans.value.*;
import javafx.collections.*;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.TableColumn.CellEditEvent;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.*;
import javafx.stage.Stage;
import javafx.util.Callback;
// click in the value column (a couple of times) to edit the value in the column.
// property editors are defined only for String and Boolean properties.
// change focus to something else to commit the edit.
public class TableViewPropertyEditor extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
final Person aPerson = new Person("Fred", true);
final Label currentObjectValue = new Label(aPerson.toString());
TableView<NamedProperty> table = new TableView();
table.setEditable(true);
table.setItems(createNamedProperties(aPerson));
TableColumn<NamedProperty, String> nameCol = new TableColumn("Name");
nameCol.setCellValueFactory(new PropertyValueFactory<NamedProperty, String>(
"name"));
TableColumn<NamedProperty, Object> valueCol = new TableColumn("Value");
valueCol.setCellValueFactory(new PropertyValueFactory<NamedProperty, Object>(
"value"));
valueCol.setCellFactory(new Callback<TableColumn<NamedProperty, Object>, TableCell<NamedProperty, Object>>() {
@Override
public TableCell<NamedProperty, Object> call(
TableColumn<NamedProperty, Object> param) {
return new EditingCell();
}
});
// pojo
valueCol.setOnEditCommit(new EventHandler<CellEditEvent<NamedProperty, Object>>() {
@Override
public void handle(CellEditEvent<NamedProperty, Object> t) {
int row = t.getTablePosition().getRow();
NamedProperty property = (NamedProperty) t.getTableView()
.getItems().get(row);
property.setValue(t.getNewValue());
currentObjectValue.setText(aPerson.toString());
}
});
table.getColumns().setAll(nameCol, valueCol);
table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
VBox layout = new VBox(10);
layout.setStyle("-fx-background-color: cornsilk; -fx-padding: 10;");
layout.getChildren().setAll(currentObjectValue, table);
VBox.setVgrow(table, Priority.ALWAYS);
stage.setScene(new Scene(layout, 650, 600));
stage.show();
}
private ObservableList<NamedProperty> createNamedProperties(Object object) {
ObservableList<NamedProperty> properties = FXCollections
.observableArrayList();
for (Method method : object.getClass().getMethods()) {
String name = method.getName();
Class type = method.getReturnType();
if (type.getName().endsWith("Property")) {
try {
properties.add(new NamedProperty(name, (Property) method
.invoke(object)));
} catch (IllegalAccessException ex) {
Logger.getLogger(TableViewPropertyEditor.class.getName())
.log(Level.SEVERE, null, ex);
} catch (InvocationTargetException ex) {
Logger.getLogger(TableViewPropertyEditor.class.getName())
.log(Level.SEVERE, null, ex);
} catch (IllegalArgumentException ex) {
Logger.getLogger(TableViewPropertyEditor.class.getName())
.log(Level.SEVERE, null, ex);
}
}
}
return properties;
}
public class NamedProperty {
public NamedProperty(String name, Property value) {
nameProperty.set(name);
valueProperty = value;
}
private StringProperty nameProperty = new SimpleStringProperty();
public StringProperty nameProperty() {
return nameProperty;
}
public StringProperty getName() {
return nameProperty;
}
public void setName(String name) {
nameProperty.set(name);
}
private Property valueProperty;
public Property valueProperty() {
return valueProperty;
}
public Object getValue() {
return valueProperty.getValue();
}
public void setValue(Object value) {
valueProperty.setValue(value);
}
}
public class Person {
private final SimpleStringProperty firstName;
private final SimpleBooleanProperty married;
private Person(String firstName, Boolean isMarried) {
this.firstName = new SimpleStringProperty(firstName);
this.married = new SimpleBooleanProperty(isMarried);
}
public SimpleStringProperty firstNameProperty() {
return firstName;
}
public SimpleBooleanProperty marriedProperty() {
return married;
}
public String getFirstName() {
return firstName.get();
}
public void setFirstName(String fName) {
firstName.set(fName);
}
public Boolean getMarried() {
return married.get();
}
public void setMarried(Boolean isMarried) {
married.set(isMarried);
}
@Override
public String toString() {
return firstName.getValue() + ": " + married.getValue();
}
}
class EditingCell extends TableCell<NamedProperty, Object> {
private TextField textField;
private CheckBox checkBox;
public EditingCell() {
}
@Override
public void startEdit() { // , Graphic
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() { // , Graphic, text
super.cancelEdit();
System.out.println("cancel");
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 (getIndex() < 2) {
NamedProperty property = getTableView().getItems().get(
getIndex());
System.out.println("property=" + property.getValue());
System.out.println("item=" + getItem());
}
if (empty) {
setText(null);
setGraphic(null);
} else {
if (isEditing()) {
if (getItem() instanceof Boolean) { // boolean checkbox
if (checkBox != null) {
checkBox.setSelected(getBoolean());
}
setText(null);
setGraphic(checkBox);
} else { // textFiled
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();
}
}
}
일반적으로 사용자 정의tablecell을 사용하여cell의 다양화를 실현하고 업데이트 Item을 다시 쓰며Graphic과Text 내용을 설정합니다.편집 기능을 실현하려면 startEdit와 cancelEdit 방법을 다시 쓸 수 있습니다. 편집이 필요할 때 필요한 node를 표시하고, 취소할 때 text만 표시합니다.
주의해야 할 점은colum을 실현해야 한다는 것이다.setOnEditCommit 메서드, pojo 값을 업데이트합니다.cell의 값은 포조 안의 get의 값에 대응하기 때문에 포조를 업데이트하지 않으면cell의 값은 변하지 않습니다.
예를 들어:value column의cell은Named Property에 대응하는 getValue입니다.메소드 업데이트 Item에서 매개 변수 item과 getItem () 메소드에서 가져온 대상은 getValue () 와 같습니다.
하지만 setOn Edit Commit 방법에 있는property를 주석해 놓으면setValue(t.getNewValue()); 그리고value값을 편집합니다. 논리적으로 getValue () 는 변하지 않았습니다. 페이지에 표시된 값은 변하지 않을 것입니다. 그러나 결과는 바뀌었습니다.업데이트 Item 방법에서 item과Named Property의 getValue를 출력했는데 달라졌습니다.이것은 나를 의심하게 했다.나는 마땅히 해야 한다고 생각했다. 이 두 값은 마땅히 같아야 한다.나는 그 줄의 기록이 보이지 않을 때까지 창을 축소해서 다시 불러오려고 했다. (table는 다시 불러올 것이다.)다시 출력하면, 페이지에 표시된 값이 다시 돌아와, 두 개의 인쇄가 똑같아진다.Item과 getItem () 의 값은 항상 Pojo의 get 방법에서 나온 것입니다.
코드에서 checkBox와textField의 초점집중 속성을 감청하여 수정된 값을 전달하는 것을 볼 수 있다.
commitEdit(textField.getText()); //
바로 commitEdit 방법을 통해 item의 값을 수정했습니다.그리고 cancel에서 item의 값을 가져옵니다. 이것은 최신입니다. (여기서 item과 get 방법의 값이 왜 다른지 알 수 있습니다.)사실 이렇게 할 필요도 없어요. 바로 cancel 안에textField예요.getText 또는 checkBox.isSelected에서 최신 값을 가져옵니다.
이해가 안 되는 점 댓글로 남겨주세요.
여기javafx에서 공부하는 중국어 사이트가 있는데, 나는 내용을 모두 그 위에 잃어버렸다.
http://www.jfxee.com/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
useRef() Hook을 사용하여 React Js에서 버튼이 있는 모든 확인란을 어떻게 선택/선택 취소합니까?useRef() Hook을 사용하여 React Js에서 버튼이 있는 모든 확인란을 어떻게 선택/선택 취소합니까? 이 게시물에서는 모든 확인란을 선택/선택 취소하는 방법에 대해 알아봅니다. useRef() 반응 후크 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.