13 衚ãã¥ãŒ
ãã®ç« ã§ã¯ã衚ã®è¿œå ã衚ãžã®ããŒã¿ã®ç§»å ¥ã衚å ã®è¡ã®ç·šéãªã©ãJavaFXã¢ããªã±ãŒã·ã§ã³å ã§ã®è¡šã®åºæ¬çãªæäœæ¹æ³ãåŠç¿ããŸãã
JavaFX SDK APIã§ã¯ã衚圢åŒã§ããŒã¿ã衚ãããã®ã¯ã©ã¹ãããã€ãçšæãããŠããŸãã JavaFXã¢ããªã±ãŒã·ã§ã³ã§ã®è¡šã®äœæã«æãéèŠãªã¯ã©ã¹ã¯TableViewãTableColumnãããã³TableCellã§ãã 衚ã«ã¯ããŒã¿ã»ã¢ãã«ãå®è£
ããã»ã«ã»ãã¡ã¯ããªãé©çšããããšã«ãã£ãŠããŒã¿ãç§»å
¥ã§ããŸãã
衚ã¯ã©ã¹ã¯ãããŒã¿ãåã§ãœãŒãããå¿ èŠã«å¿ããŠåã®ãµã€ãºã倿Žãããã«ãã€ã³ã®æ©èœãåããŠããŸãã
å³13-1ã«ãã¢ãã¬ã¹åž³ã®é£çµ¡å æ å ±ã衚ãäžè¬çãªè¡šã瀺ããŸãã
衚ã®äœæ
äŸ13-1ã®ã³ãŒãã»ãã©ã°ã¡ã³ãã§ã¯ã3ã€ã®åã®ãã空ã®è¡šãäœæãããããã¢ããªã±ãŒã·ã§ã³ã»ã·ãŒã³ã«è¿œå ããŸãã
äŸ13-1 衚ã®è¿œå
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
public class TableViewSample extends Application {
private final TableView table = new TableView();
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
Scene scene = new Scene(new Group());
stage.setTitle("Table View Sample");
stage.setWidth(300);
stage.setHeight(500);
final Label label = new Label("Address Book");
label.setFont(new Font("Arial", 20));
table.setEditable(true);
TableColumn firstNameCol = new TableColumn("First Name");
TableColumn lastNameCol = new TableColumn("Last Name");
TableColumn emailCol = new TableColumn("Email");
table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().addAll(label, table);
((Group) scene.getRoot()).getChildren().addAll(vbox);
stage.setScene(scene);
stage.show();
}
}
衚ã®ã³ã³ãããŒã«ã¯TableViewã¯ã©ã¹ãã€ã³ã¹ã¿ã³ã¹åããŠäœæãããŸãã äŸ13-1ã§ã¯ãVBoxã¬ã€ã¢ãŠãã»ã³ã³ããã«è¿œå ãããŠããŸãããã¢ããªã±ãŒã·ã§ã³ã»ã·ãŒã³ã«çŽæ¥è¿œå ããããšãã§ããŸãã
äŸ13-1ã§ã¯ãé£çµ¡å
ã®å§åãããã³é»åã¡ãŒã«ã»ã¢ãã¬ã¹ã®æ
å ±ãã¢ãã¬ã¹åž³ã«æ ŒçŽãã3ã€ã®åãå®çŸ©ããŸãã åã¯TableColumnã¯ã©ã¹ã䜿çšããŠäœæãããŸãã
TableViewã¯ã©ã¹ã®getColumnsã¡ãœããã¯ãäºåã«äœæããåã衚ã«è¿œå ããŸãã ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã®ã¡ãœããã䜿çšããŠåãåçã«è¿œå ãŸãã¯åé€ã§ããŸãã
ãã®ã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ãã€ã«ãšå®è£ ã«ãã£ãŠãå³13-2ã«ç€ºãåºåãåŸãããŸãã
setVisibleã¡ãœãããã³ãŒã«ãããšãåã®è¡šç€ºã管çã§ããŸãã ããšãã°ãã¢ããªã±ãŒã·ã§ã³ã®ããžãã¯ã§ãŠãŒã¶ãŒã®é»åã¡ãŒã«ã»ã¢ãã¬ã¹ãé衚瀺ã«ããå¿
èŠãããå Žåããã®ã¿ã¹ã¯ã¯emailCol.setVisible(false)ã§å®è£
ã§ããŸãã
ããŒã¿ã®æ§é ãããã«è€éã«è¡šçŸããå¿ èŠãããå Žåã¯ããã¹ããããåãäœæã§ããŸãã
ããšãã°ãã¢ãã¬ã¹åž³ã®é£çµ¡å
ã«é»åã¡ãŒã«ã»ã¢ã«ãŠã³ãã2ã€ãããšä»®å®ããŸãã ãã®å Žåããã©ã€ããªé»åã¡ãŒã«ã»ã¢ãã¬ã¹ãšã»ã«ã³ããªé»åã¡ãŒã«ã»ã¢ãã¬ã¹ã®2ã€ã®åã衚瀺ããå¿
èŠããããŸãã äŸ13-2ã«ç€ºãããã«ã2ã€ã®ãµãåãäœæããemailColã«getColumnsã¡ãœãããã³ãŒã«ããŸãã
äŸ13-2 ãã¹ããããåã®äœæ
TableColumn firstEmailCol = new TableColumn("Primary");
TableColumn secondEmailCol = new TableColumn("Secondary");
emailCol.getColumns().addAll(firstEmailCol, secondEmailCol);
ãããã®è¡ãäŸ13-1ã«è¿œå ããã¢ããªã±ãŒã·ã§ã³ã»ã³ãŒããã³ã³ãã€ã«ããŠå®è¡ãããšã衚ãå³13-3ã«ç€ºãããã«è¡šç€ºãããŸãã
衚ã¯ã¢ããªã±ãŒã·ã§ã³ã«è¿œå ãããŸãããããŒã¿ãå®çŸ©ãããŠããªããããæšæºã®ãã£ãã·ã§ã³è¡šå
ã®ã³ã³ãã³ããªãã衚瀺ãããŸãã ãã®ãã£ãã·ã§ã³ã®ãããã«ãsetPlaceholderã¡ãœããã䜿çšãããšã空ã®è¡šã«Nodeãªããžã§ã¯ãã衚瀺ããããæå®ã§ããŸãã
ããŒã¿ã»ã¢ãã«ã®å®çŸ©
JavaFXã¢ããªã±ãŒã·ã§ã³ã§è¡šãäœæããå Žåã¯ãããŒã¿ã»ã¢ãã«ãå®çŸ©ããã¡ãœãããšãã£ãŒã«ããæäŸããŠè¡šã䜿çšã§ããããã«ããã¯ã©ã¹ãå®è£
ããããšããèŠãããŸãã äŸ13-3ã§ã¯ãPersonã¯ã©ã¹ãäœæããŠã¢ãã¬ã¹åž³ã«ããŒã¿ãå®çŸ©ããŸãã
äŸ13-3 Personã¯ã©ã¹ã®äœæ
public static class Person {
private final SimpleStringProperty firstName;
private final SimpleStringProperty lastName;
private final SimpleStringProperty email;
private Person(String fName, String lName, String email) {
this.firstName = new SimpleStringProperty(fName);
this.lastName = new SimpleStringProperty(lName);
this.email = new SimpleStringProperty(email);
}
public String getFirstName() {
return firstName.get();
}
public void setFirstName(String fName) {
firstName.set(fName);
}
public String getLastName() {
return lastName.get();
}
public void setLastName(String fName) {
lastName.set(fName);
}
public String getEmail() {
return email.get();
}
public void setEmail(String fName) {
email.set(fName);
}
}
firstNameãlastNameãããã³emailæååããããã£ãäœæãããç¹å®ã®ããŒã¿èŠçŽ ã®åç
§ãå¯èœã«ãªããŸãã
ãŸããgetã¡ãœãããšsetã¡ãœãããããããã®ããŒã¿èŠçŽ ã«æå®ãããŸãã ãã®ãããgetFirstNameã¡ãœãããfirstNameããããã£ã®å€ãè¿ããsetFirstNameã¡ãœããããã®ããããã£ã®å€ãæå®ããŸãã
Personã¯ã©ã¹ã§ããŒã¿ã»ã¢ãã«ãèšè¿°ãããŠããå ŽåãObservableListé
åãäœæãã衚ã«è¡šç€ºããå¿
èŠã®ããããŒã¿åã®æ°ãå®çŸ©ã§ããŸãã äŸ13-4ã«ç€ºãã³ãŒãã»ãã©ã°ã¡ã³ãã¯ããã®ã¿ã¹ã¯ãå®è£
ããŠããŸãã
äŸ13-4 ç£èŠå¯èœãªãªã¹ãã®è¡šããŒã¿ã®å®çŸ©
final ObservableList<Person> data = FXCollections.observableArrayList(
new Person("Jacob", "Smith", "jacob.smith@example.com"),
new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
new Person("Ethan", "Williams", "ethan.williams@example.com"),
new Person("Emma", "Jones", "emma.jones@example.com"),
new Person("Michael", "Brown", "michael.brown@example.com")
);
次ã®ã¹ãããã§ã¯ãããŒã¿ã衚ã®åã«é¢é£ä»ããŸãã ããã¯äŸ13-5ã«ç€ºãããã«ãããããã®ããŒã¿èŠçŽ ã«å®çŸ©ããããããã£ãä»ããŠå®è¡ã§ããŸãã
äŸ13-5 åãžã®ããŒã¿ã»ããããã£ã®èšå®
firstNameCol.setCellValueFactory(
new PropertyValueFactory<>("firstName")
);
lastNameCol.setCellValueFactory(
new PropertyValueFactory<>("lastName")
);
emailCol.setCellValueFactory(
new PropertyValueFactory<>("email")
);
setCellValueFactoryã¡ãœããã¯ããããã®åã®ã»ã«ã»ãã¡ã¯ããªãæå®ããŸãã ã»ã«ã»ãã¡ã¯ããªã¯ã衚åã®firstNameãlastNameãããã³emailããããã£ãPersonã¯ã©ã¹ã®å¯Ÿå¿ããã¡ãœãããžã®åç
§ãšããŠäœ¿çšããPropertyValueFactoryã¯ã©ã¹ã䜿çšããŠå®è£
ãããŸãã
ããŒã¿ã»ã¢ãã«ãå®çŸ©ãããããŒã¿ã远å ãããŠåã«é¢é£ä»ãããããšãTableViewã¯ã©ã¹ã®setItemsã¡ãœãããtable.setItems(data)ã䜿çšããŠããŒã¿ã衚ã«è¿œå ã§ããŸãã
ObservableListãªããžã§ã¯ãã«ãã£ãŠãã®èŠçŽ ã«å¯Ÿãã倿Žã®è¿œè·¡ãæå¹ã«ãªããããTableViewã³ã³ãã³ãã¯ããŒã¿å€æŽã«å¿ããŠèªåçã«æŽæ°ãããŸãã
äŸ13-6ã«ç€ºãã¢ããªã±ãŒã·ã§ã³ã»ã³ãŒãã確èªããŸãã
äŸ13-6 衚ã®äœæããã³è¡šãžã®ããŒã¿ã®è¿œå
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
public class TableViewSample extends Application {
private final TableView<Person> table = new TableView<>();
private final ObservableList<Person> data =
FXCollections.observableArrayList(
new Person("Jacob", "Smith", "jacob.smith@example.com"),
new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
new Person("Ethan", "Williams", "ethan.williams@example.com"),
new Person("Emma", "Jones", "emma.jones@example.com"),
new Person("Michael", "Brown", "michael.brown@example.com")
);
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
Scene scene = new Scene(new Group());
stage.setTitle("Table View Sample");
stage.setWidth(450);
stage.setHeight(500);
final Label label = new Label("Address Book");
label.setFont(new Font("Arial", 20));
table.setEditable(true);
TableColumn firstNameCol = new TableColumn("First Name");
firstNameCol.setMinWidth(100);
firstNameCol.setCellValueFactory(
new PropertyValueFactory<>("firstName"));
TableColumn lastNameCol = new TableColumn("Last Name");
lastNameCol.setMinWidth(100);
lastNameCol.setCellValueFactory(
new PropertyValueFactory<>("lastName"));
TableColumn emailCol = new TableColumn("Email");
emailCol.setMinWidth(200);
emailCol.setCellValueFactory(
new PropertyValueFactory<>("email"));
table.setItems(data);
table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().addAll(label, table);
((Group) scene.getRoot()).getChildren().addAll(vbox);
stage.setScene(scene);
stage.show();
}
public static class Person {
private final SimpleStringProperty firstName;
private final SimpleStringProperty lastName;
private final SimpleStringProperty email;
private Person(String fName, String lName, String email) {
this.firstName = new SimpleStringProperty(fName);
this.lastName = new SimpleStringProperty(lName);
this.email = new SimpleStringProperty(email);
}
public String getFirstName() {
return firstName.get();
}
public void setFirstName(String fName) {
firstName.set(fName);
}
public String getLastName() {
return lastName.get();
}
public void setLastName(String fName) {
lastName.set(fName);
}
public String getEmail() {
return email.get();
}
public void setEmail(String fName) {
email.set(fName);
}
}
}
ãã®ã¢ããªã±ãŒã·ã§ã³ã»ã³ãŒããã³ã³ãã€ã«ããŠå®è¡ãããšãå³13-4ã«ç€ºã衚ã衚瀺ãããŸãã
æ°èŠåã®è¿œå
å³13-4ã®è¡šã«ã¯ã5ã€ã®ããŒã¿è¡ããããŸãããããã¯å€æŽã§ããŸããã
ããã¹ãã»ãã£ãŒã«ãã䜿çšãããšãæ°ããå€ããFirst NameãããLast Nameããããã³ãEmailãåã«å ¥åã§ããŸãã Text Fieldã³ã³ãããŒã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã§ã®ãŠãŒã¶ãŒã®ããã¹ãå ¥ååå ¥ããæå¹ã«ããŸãã äŸ13-7ã§ã¯ã3ã€ã®ããã¹ãã»ãã£ãŒã«ããäœæããåãã£ãŒã«ãã®ããã³ããã»ããã¹ããå®çŸ©ãããAddããã¿ã³ãäœæããŸãã
äŸ13-7 ããã¹ãã»ãã£ãŒã«ãã䜿çšãã衚ãžã®æ°èŠé ç®ã®å ¥å
final TextField addFirstName = new TextField();
addFirstName.setPromptText("First Name");
addFirstName.setMaxWidth(firstNameCol.getPrefWidth());
final TextField addLastName = new TextField();
addLastName.setMaxWidth(lastNameCol.getPrefWidth());
addLastName.setPromptText("Last Name");
final TextField addEmail = new TextField();
addEmail.setMaxWidth(emailCol.getPrefWidth());
addEmail.setPromptText("Email");
final Button addButton = new Button("Add");
addButton.setOnAction((ActionEvent e) -> {
data.add(new Person(
addFirstName.getText(),
addLastName.getText(),
addEmail.getText()
));
addFirstName.clear();
addLastName.clear();
addEmail.clear();
});
ãŠãŒã¶ãŒããAddããã¿ã³ãã¯ãªãã¯ãããšãããã¹ãã»ãã£ãŒã«ãã«å
¥åããå€ãPersonã³ã³ã¹ãã©ã¯ã¿ã«çµã¿èŸŒãŸããdataç£èŠå¯èœãªã¹ãã«è¿œå ãããŸãã ãã®ãããé£çµ¡å
æ
å ±ã®ããæ°èŠãšã³ããªã衚ã«è¡šç€ºãããŸãã
äŸ13-8ã«ç€ºãã¢ããªã±ãŒã·ã§ã³ã»ã³ãŒãã確èªããŸãã
äŸ13-8 æ°èŠé ç®ãå ¥åããããã¹ãã»ãã£ãŒã«ãã®ãã衚
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
public class TableViewSample extends Application {
private final TableView<Person> table = new TableView<>();
private final ObservableList<Person> data =
FXCollections.observableArrayList(
new Person("Jacob", "Smith", "jacob.smith@example.com"),
new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
new Person("Ethan", "Williams", "ethan.williams@example.com"),
new Person("Emma", "Jones", "emma.jones@example.com"),
new Person("Michael", "Brown", "michael.brown@example.com"));
final HBox hb = new HBox();
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
Scene scene = new Scene(new Group());
stage.setTitle("Table View Sample");
stage.setWidth(450);
stage.setHeight(550);
final Label label = new Label("Address Book");
label.setFont(new Font("Arial", 20));
table.setEditable(true);
TableColumn firstNameCol = new TableColumn("First Name");
firstNameCol.setMinWidth(100);
firstNameCol.setCellValueFactory(
new PropertyValueFactory<>("firstName"));
TableColumn lastNameCol = new TableColumn("Last Name");
lastNameCol.setMinWidth(100);
lastNameCol.setCellValueFactory(
new PropertyValueFactory<>("lastName"));
TableColumn emailCol = new TableColumn("Email");
emailCol.setMinWidth(200);
emailCol.setCellValueFactory(
new PropertyValueFactory<>("email"));
table.setItems(data);
table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
final TextField addFirstName = new TextField();
addFirstName.setPromptText("First Name");
addFirstName.setMaxWidth(firstNameCol.getPrefWidth());
final TextField addLastName = new TextField();
addLastName.setMaxWidth(lastNameCol.getPrefWidth());
addLastName.setPromptText("Last Name");
final TextField addEmail = new TextField();
addEmail.setMaxWidth(emailCol.getPrefWidth());
addEmail.setPromptText("Email");
final Button addButton = new Button("Add");
addButton.setOnAction((ActionEvent e) -> {
data.add(new Person(
addFirstName.getText(),
addLastName.getText(),
addEmail.getText()));
addFirstName.clear();
addLastName.clear();
addEmail.clear();
});
hb.getChildren().addAll(addFirstName, addLastName, addEmail, addButton);
hb.setSpacing(3);
final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().addAll(label, table, hb);
((Group) scene.getRoot()).getChildren().addAll(vbox);
stage.setScene(scene);
stage.show();
}
public static class Person {
private final SimpleStringProperty firstName;
private final SimpleStringProperty lastName;
private final SimpleStringProperty email;
private Person(String fName, String lName, String email) {
this.firstName = new SimpleStringProperty(fName);
this.lastName = new SimpleStringProperty(lName);
this.email = new SimpleStringProperty(email);
}
public String getFirstName() {
return firstName.get();
}
public void setFirstName(String fName) {
firstName.set(fName);
}
public String getLastName() {
return lastName.get();
}
public void setLastName(String fName) {
lastName.set(fName);
}
public String getEmail() {
return email.get();
}
public void setEmail(String fName) {
email.set(fName);
}
}
}
ãã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãé»åã¡ãŒã«ã»ã¢ãã¬ã¹ãæ£ãããªã圢åŒã§å ¥åãããŠããªãããªã©ã確èªãããã£ã«ã¿ã¯æäŸãããŸããã ãã®ãããªæ©èœã¯ãç¬èªã«ã¢ããªã±ãŒã·ã§ã³ãéçºããéã«æå®ã§ããŸãã
ãã®æç¹ã®å®è£ ã§ã¯ã空ã®å€ãå ¥åãããŠããªããã«ã€ããŠã確èªããŸããã å€ãæäŸãããŠããªãå Žåã¯ããAddããã¿ã³ãã¯ãªãã¯ãããšè¡šã«ç©ºã®åãæ¿å ¥ãããŸãã
å³13-5ã¯ãŠãŒã¶ãŒãæ°èŠããŒã¿è¡ã远å ããæ¹æ³ã瀺ããŠããŸãã
å³13-5 ã¢ãã¬ã¹åž³ãžã®é£çµ¡å æ å ±ã®è¿œå

ãå³13-5 ã¢ãã¬ã¹åž³ãžã®é£çµ¡å æ å ±ã®è¿œå ãã®èª¬æ
å³13-6ã«ããAddããã¿ã³ãã¯ãªãã¯ããåŸã®è¡šã瀺ããŸãã Emma Whiteã®é£çµ¡å ã®è©³çްã衚ã«è¡šç€ºãããŸãã
å³13-6 æ°ãã«è¿œå ããããšã³ããª

ãå³13-6 æ°ãã«è¿œå ããããšã³ããªãã®èª¬æ
åããŒã¿ã®ãœãŒã
TableViewã¯ã©ã¹ã¯åã®ããŒã¿ããœãŒããããã«ãã€ã³ã®æ©èœãæäŸããŸãã ãŠãŒã¶ãŒã¯åããããŒãã¯ãªãã¯ããŠããŒã¿ã®é åºã倿Žã§ããŸãã æåã®ã¯ãªãã¯ã§ãœãŒãé åºãæé ã2åç®ã®ã¯ãªãã¯ã§éé ã3åç®ã®ã¯ãªãã¯ã§ãœãŒããç¡å¹ã«ãªããŸãã ããã©ã«ãã§ã¯ããœãŒãã¯é©çšãããŠããŸããã
ãŠãŒã¶ãŒã¯è¡šå ã®è€æ°ã®åããœãŒãã§ãããœãŒãæäœã§ã®ååã®åªå 床ãæå®ã§ããŸãã è€æ°ã®åããœãŒãããã«ã¯ã[Shift]ããŒãæŒããªããããœãŒãããããããã®åã®ããããŒãã¯ãªãã¯ããŸãã
å³13-7ã§ã¯ãåã«æé ã®ãœãŒãé åºãé©çšãããŠããŸãããå§ã¯éé ã§ãœãŒããããŠããŸãã æåã®åã2çªç®ã®åããåªå ãããŸãã
ã¢ããªã±ãŒã·ã§ã³éçºè
ã¯ãsetSortTypeã¡ãœãããé©çšããŠãã¢ããªã±ãŒã·ã§ã³å
ã®ããããã®åã«ãœãŒãã®ããªãã¡ã¬ã³ã¹ãèšå®ã§ããŸãã æé ã¿ã€ããšéé ã¿ã€ãã®ã©ã¡ããæå®ã§ããŸãã ããšãã°ã次ã®ã³ãŒãè¡ã§ã¯ãemailColåã®ãœãŒããæé ã¿ã€ãã«èšå®ããŸããemailCol.setSortType(TableColumn.SortType.DESCENDING);
ãŸããTableColumnã€ã³ã¹ã¿ã³ã¹ãTableView.sortOrderç£èŠå¯èœãªã¹ãã«è¿œå ããŸãã¯ãªã¹ãããåé€ããŠããœãŒãããåãæå®ã§ããŸãã ãã®ãªã¹ãã®åã®é åºã¯ããœãŒãã®åªå
床ã衚ããŸã(ããšãã°ããŒãé
ç®ã¯æåã®é
ç®ããåªå
ãããŸã)ã
ããŒã¿ã®ãœãŒããçŠæ¢ããã«ã¯ããã®åã«setSortable(false)ã¡ãœãããã³ãŒã«ããŸãã
衚å ã®ããŒã¿ã®ç·šé
TableViewã¯ã©ã¹ã¯è¡šåœ¢åŒããŒã¿ã衚瀺ããã ãã§ãªãããã®ç·šéãå¯èœã«ããŸãã setEditableã¡ãœããã䜿çšããŠã衚ã®ã³ã³ãã³ãã®ç·šéãæå¹ã«ããŸãã
setCellFactoryã¡ãœããã䜿çšãããšãTextFieldTableCellã¯ã©ã¹ã«ãã£ãŠè¡šã»ã«ãããã¹ãã»ãã£ãŒã«ããšããŠå®è£
ã§ããŸãã setOnEditCommitã¡ãœããã¯ç·šéãåŠçããæŽæ°ããå€ã該åœãã衚ã®ã»ã«ã«å²ãåœãŠãŸãã äŸ13-9ã§ã¯ããFirst NameãããLast Nameãããã³ãEmailãåã§ã®ã»ã«ç·šéãåŠçãããã®ãããªã¡ãœããã®å²åœãŠæ¹æ³ã瀺ããŸãã
äŸ13-9 ã»ã«ç·šéã®å®è£
firstNameCol.setCellFactory(TextFieldTableCell.<Person>forTableColumn());
firstNameCol.setOnEditCommit(
(CellEditEvent<Person, String> t) -> {
((Person) t.getTableView().getItems().get(
t.getTablePosition().getRow())
).setFirstName(t.getNewValue());
});
lastNameCol.setCellFactory(TextFieldTableCell.<Person>forTableColumn());
lastNameCol.setOnEditCommit(
(CellEditEvent<Person, String> t) -> {
((Person) t.getTableView().getItems().get(
t.getTablePosition().getRow())
).setLastName(t.getNewValue());
});
emailCol.setCellFactory(TextFieldTableCell.<Person>forTableColumn());
emailCol.setOnEditCommit(
(CellEditEvent<Person, String> t) -> {
((Person) t.getTableView().getItems().get(
t.getTablePosition().getRow())
).setEmail(t.getNewValue());
});
äŸ13-10ã«ã¢ããªã±ãŒã·ã§ã³ã®å®å šãªã³ãŒãã瀺ããŸãã
äŸ13-10 ã»ã«ç·šéãæå¹ãªTableViewSample
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellEditEvent;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
public class TableViewSample extends Application {
private final TableView<Person> table = new TableView<>();
private final ObservableList<Person> data =
FXCollections.observableArrayList(
new Person("Jacob", "Smith", "jacob.smith@example.com"),
new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
new Person("Ethan", "Williams", "ethan.williams@example.com"),
new Person("Emma", "Jones", "emma.jones@example.com"),
new Person("Michael", "Brown", "michael.brown@example.com"));
final HBox hb = new HBox();
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
Scene scene = new Scene(new Group());
stage.setTitle("Table View Sample");
stage.setWidth(450);
stage.setHeight(550);
final Label label = new Label("Address Book");
label.setFont(new Font("Arial", 20));
table.setEditable(true);
TableColumn<Person, String> firstNameCol =
new TableColumn<>("First Name");
firstNameCol.setMinWidth(100);
firstNameCol.setCellValueFactory(
new PropertyValueFactory<>("firstName"));
firstNameCol.setCellFactory(TextFieldTableCell.<Person>forTableColumn());
firstNameCol.setOnEditCommit(
(CellEditEvent<Person, String> t) -> {
((Person) t.getTableView().getItems().get(
t.getTablePosition().getRow())
).setFirstName(t.getNewValue());
});
TableColumn<Person, String> lastNameCol =
new TableColumn<>("Last Name");
lastNameCol.setMinWidth(100);
lastNameCol.setCellValueFactory(
new PropertyValueFactory<>("lastName"));
lastNameCol.setCellFactory(TextFieldTableCell.<Person>forTableColumn());
lastNameCol.setOnEditCommit(
(CellEditEvent<Person, String> t) -> {
((Person) t.getTableView().getItems().get(
t.getTablePosition().getRow())
).setLastName(t.getNewValue());
});
TableColumn<Person, String> emailCol = new TableColumn<>("Email");
emailCol.setMinWidth(200);
emailCol.setCellValueFactory(
new PropertyValueFactory<>("email"));
emailCol.setCellFactory(TextFieldTableCell.<Person>forTableColumn());
emailCol.setOnEditCommit(
(CellEditEvent<Person, String> t) -> {
((Person) t.getTableView().getItems().get(
t.getTablePosition().getRow())
).setEmail(t.getNewValue());
});
table.setItems(data);
table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
final TextField addFirstName = new TextField();
addFirstName.setPromptText("First Name");
addFirstName.setMaxWidth(firstNameCol.getPrefWidth());
final TextField addLastName = new TextField();
addLastName.setMaxWidth(lastNameCol.getPrefWidth());
addLastName.setPromptText("Last Name");
final TextField addEmail = new TextField();
addEmail.setMaxWidth(emailCol.getPrefWidth());
addEmail.setPromptText("Email");
final Button addButton = new Button("Add");
addButton.setOnAction((ActionEvent e) -> {
data.add(new Person(
addFirstName.getText(),
addLastName.getText(),
addEmail.getText()));
addFirstName.clear();
addLastName.clear();
addEmail.clear();
});
hb.getChildren().addAll(addFirstName, addLastName, addEmail, addButton);
hb.setSpacing(3);
final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().addAll(label, table, hb);
((Group) scene.getRoot()).getChildren().addAll(vbox);
stage.setScene(scene);
stage.show();
}
public static class Person {
private final SimpleStringProperty firstName;
private final SimpleStringProperty lastName;
private final SimpleStringProperty email;
private Person(String fName, String lName, String email) {
this.firstName = new SimpleStringProperty(fName);
this.lastName = new SimpleStringProperty(lName);
this.email = new SimpleStringProperty(email);
}
public String getFirstName() {
return firstName.get();
}
public void setFirstName(String fName) {
firstName.set(fName);
}
public String getLastName() {
return lastName.get();
}
public void setLastName(String fName) {
lastName.set(fName);
}
public String getEmail() {
return email.get();
}
public void setEmail(String fName) {
email.set(fName);
}
}
}
å³13-8ã§ã¯ããŠãŒã¶ãŒã¯Michael Brownã®å§ãç·šéããŠããŸãã 衚ã®ã»ã«ãç·šéããã«ã¯ããŠãŒã¶ãŒã¯æ°ããå€ãã»ã«ã«å
¥åãã[Enter]ããŒãæŒããŸãã [Enter]ããŒãæŒããŸã§ã»ã«ã¯å€æŽãããŸããã ãã®åäœã¯TextFieldã¯ã©ã¹ã®å®è£
ã«ãã£ãŠæ±ºãŸããŸãã
TextFieldã³ã³ãããŒã«ã®ããã©ã«ãå®è£
ã§ã¯ãç·šéãã³ãããããã«ã¯ããŠãŒã¶ãŒã[Enter]ããŒãæŒãå¿
èŠããããŸãã TextFieldã®åäœã¯ãäºæ³ããããŠãŒã¶ãŒæäœæ§ã«åŸãããã©ãŒã«ã¹ã®å€æŽæã«ç·šéãã³ãããããããã«åå®çŸ©ã§ããŸãã ãã®ãããªä»£æ¿ã®åäœãå®è£
ãããããã³ãŒãã倿ŽããŠã¿ãŸãã
äŸ13-11 ã»ã«ç·šéã®ä»£æ¿ãœãªã¥ãŒã·ã§ã³
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellEditEvent;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.util.Callback;
public class TableViewSample extends Application {
private final TableView<Person> table = new TableView<>();
private final ObservableList<Person> data =
FXCollections.observableArrayList(
new Person("Jacob", "Smith", "jacob.smith@example.com"),
new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
new Person("Ethan", "Williams", "ethan.williams@example.com"),
new Person("Emma", "Jones", "emma.jones@example.com"),
new Person("Michael", "Brown", "michael.brown@example.com"));
final HBox hb = new HBox();
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
Scene scene = new Scene(new Group());
stage.setTitle("Table View Sample");
stage.setWidth(450);
stage.setHeight(550);
final Label label = new Label("Address Book");
label.setFont(new Font("Arial", 20));
table.setEditable(true);
Callback<TableColumn<Person, String>,
TableCell<Person, String>> cellFactory
= (TableColumn<Person, String> p) -> new EditingCell();
TableColumn<Person, String> firstNameCol =
new TableColumn<>("First Name");
TableColumn<Person, String> lastNameCol =
new TableColumn<>("Last Name");
TableColumn<Person, String> emailCol =
new TableColumn<>("Email");
firstNameCol.setMinWidth(100);
firstNameCol.setCellValueFactory(
new PropertyValueFactory<>("firstName"));
firstNameCol.setCellFactory(cellFactory);
firstNameCol.setOnEditCommit(
(CellEditEvent<Person, String> t) -> {
((Person) t.getTableView().getItems().get(
t.getTablePosition().getRow())
).setFirstName(t.getNewValue());
});
lastNameCol.setMinWidth(100);
lastNameCol.setCellValueFactory(
new PropertyValueFactory<>("lastName"));
lastNameCol.setCellFactory(cellFactory);
lastNameCol.setOnEditCommit(
(CellEditEvent<Person, String> t) -> {
((Person) t.getTableView().getItems().get(
t.getTablePosition().getRow())
).setLastName(t.getNewValue());
});
emailCol.setMinWidth(200);
emailCol.setCellValueFactory(
new PropertyValueFactory<>("email"));
emailCol.setCellFactory(cellFactory);
emailCol.setOnEditCommit(
(CellEditEvent<Person, String> t) -> {
((Person) t.getTableView().getItems().get(
t.getTablePosition().getRow())
).setEmail(t.getNewValue());
});
table.setItems(data);
table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
final TextField addFirstName = new TextField();
addFirstName.setPromptText("First Name");
addFirstName.setMaxWidth(firstNameCol.getPrefWidth());
final TextField addLastName = new TextField();
addLastName.setMaxWidth(lastNameCol.getPrefWidth());
addLastName.setPromptText("Last Name");
final TextField addEmail = new TextField();
addEmail.setMaxWidth(emailCol.getPrefWidth());
addEmail.setPromptText("Email");
final Button addButton = new Button("Add");
addButton.setOnAction((ActionEvent e) -> {
data.add(new Person(
addFirstName.getText(),
addLastName.getText(),
addEmail.getText()));
addFirstName.clear();
addLastName.clear();
addEmail.clear();
});
hb.getChildren().addAll(addFirstName, addLastName, addEmail, addButton);
hb.setSpacing(3);
final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().addAll(label, table, hb);
((Group) scene.getRoot()).getChildren().addAll(vbox);
stage.setScene(scene);
stage.show();
}
public static class Person {
private final SimpleStringProperty firstName;
private final SimpleStringProperty lastName;
private final SimpleStringProperty email;
private Person(String fName, String lName, String email) {
this.firstName = new SimpleStringProperty(fName);
this.lastName = new SimpleStringProperty(lName);
this.email = new SimpleStringProperty(email);
}
public String getFirstName() {
return firstName.get();
}
public void setFirstName(String fName) {
firstName.set(fName);
}
public String getLastName() {
return lastName.get();
}
public void setLastName(String fName) {
lastName.set(fName);
}
public String getEmail() {
return email.get();
}
public void setEmail(String fName) {
email.set(fName);
}
}
class EditingCell extends TableCell<Person, String> {
private TextField textField;
public EditingCell() {
}
@Override
public void startEdit() {
if (!isEmpty()) {
super.startEdit();
createTextField();
setText(null);
setGraphic(textField);
textField.selectAll();
}
}
@Override
public void cancelEdit() {
super.cancelEdit();
setText((String) getItem());
setGraphic(null);
}
@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
setGraphic(null);
} else {
if (isEditing()) {
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(
(ObservableValue<? extends Boolean> arg0,
Boolean arg1, Boolean arg2) -> {
if (!arg2) {
commitEdit(textField.getText());
}
});
}
private String getString() {
return getItem() == null ? "" : getItem().toString();
}
}
}
TextFieldTableCellã®å®è£
ã«ãã£ãŠãŠãŒã¶ãŒæäœæ§ãåäžãããããå°æ¥ã®ãªãªãŒã¹ã§ã¯ãã®ã¢ãããŒãã¯äžèŠã«ãªãå¯èœæ§ããããŸãã
衚ãžã®ãããã»ããŒã¿ã®è¿œå
MapããŒã¿ã衚ã«è¿œå ã§ããŸãã äŸ13-12ã«ç€ºãããã«ãMapValueFactoryã¯ã©ã¹ã䜿çšããŠè¡šã«åŠçIDã®ãããã衚瀺ããŸãã
äŸ13-12 衚ãžã®ãããã»ããŒã¿ã®è¿œå
import java.util.HashMap;
import java.util.Map;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.MapValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.util.Callback;
import javafx.util.StringConverter;
public class TableViewSample extends Application {
public static final String Column1MapKey = "A";
public static final String Column2MapKey = "B";
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
Scene scene = new Scene(new Group());
stage.setTitle("Table View Sample");
stage.setWidth(300);
stage.setHeight(500);
final Label label = new Label("Student IDs");
label.setFont(new Font("Arial", 20));
TableColumn<Map, String> firstDataColumn = new TableColumn<>("Class A");
TableColumn<Map, String> secondDataColumn = new TableColumn<>("Class B");
firstDataColumn.setCellValueFactory(new MapValueFactory(Column1MapKey));
firstDataColumn.setMinWidth(130);
secondDataColumn.setCellValueFactory(new MapValueFactory(Column2MapKey));
secondDataColumn.setMinWidth(130);
TableView tableView = new TableView<>(generateDataInMap());
tableView.setEditable(true);
tableView.getSelectionModel().setCellSelectionEnabled(true);
tableView.getColumns().setAll(firstDataColumn, secondDataColumn);
Callback<TableColumn<Map, String>, TableCell<Map, String>>
cellFactoryForMap = (TableColumn<Map, String> p) ->
new TextFieldTableCell(new StringConverter() {
@Override
public String toString(Object t) {
return t.toString();
}
@Override
public Object fromString(String string) {
return string;
}
});
firstDataColumn.setCellFactory(cellFactoryForMap);
secondDataColumn.setCellFactory(cellFactoryForMap);
final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().addAll(label, tableView);
((Group) scene.getRoot()).getChildren().addAll(vbox);
stage.setScene(scene);
stage.show();
}
private ObservableList<Map> generateDataInMap() {
int max = 10;
ObservableList<Map> allData = FXCollections.observableArrayList();
for (int i = 1; i < max; i++) {
Map<String, String> dataRow = new HashMap<>();
String value1 = "A" + i;
String value2 = "B" + i;
dataRow.put(Column1MapKey, value1);
dataRow.put(Column2MapKey, value2);
allData.add(dataRow);
}
return allData;
}
}
MapValueFactoryã¯ã©ã¹ã¯ãç¹ã«è¡šã®åã®ã»ã«ã»ãã¡ã¯ããªå
ã§ã®äœ¿çšãæå³ããŠèšèšãããŠããCallbackã€ã³ã¿ãã§ãŒã¹ãå®è£
ããŸãã äŸ13-12ã§ã¯ãdataRowã®ããã·ã¥ã»ããããTableViewãªããžã§ã¯ãã®åäžè¡ã衚ããŸãã ãããã«ã¯2ã€ã®StringããŒãColumn1MapKeyããã³Column2MapKeyãããã該åœããå€ãæåã®åãš2çªç®ã®åã«ãããããŸãã 衚ã®åã«å¯ŸããŠã³ãŒã«ãããsetCellValueFactoryã¡ãœããããç¹å®ã®ããŒãšäžèŽããããŒã¿ãåã«ç§»å
¥ãããããæåã®åã«ã¯ãAãããŒã«å¯Ÿå¿ããå€ãå«ãŸãã2çªç®ã®åã«ã¯ãBãããŒã«å¯Ÿå¿ããå€ãå«ãŸããŸãã
ãã®ã¢ããªã±ãŒã·ã§ã³ãã³ã³ãã€ã«ããŠå®è¡ãããšãå³13-9ã«ç€ºãåºåãåŸãããŸãã
å³13-9 ãããã»ããŒã¿ã®ãã衚ãã¥ãŒ

ãå³13-9 ãããã»ããŒã¿ã®ãã衚ãã¥ãŒãã®èª¬æ
TreeTableViewã¯JavaFXã®è¡šããŒã¿ã»ã³ã³ãããŒã«ãããã«æ¡åŒµãããã®ã§ãã ãã®UIã³ã³ãããŒã«ã®è©³çްã¯ããããªãŒè¡šãã¥ãŒãã®ç« ãåç
§ããŠãã ããã
é¢é£APIããã¥ã¡ã³ã







