CSVやXMLから読み込んだ情報をTableViewに入れて表示させ、新規追加を行ったらその情報を表に反映させ、保存ボタンを押したときにXMLで出力させるというプログラムを作成しています。ファイルの読み込みと表の反映、新規追加などを無事実装させることができ、保存ボタンに関する処理を作成していたのですが、TableView内の情報からXMLのための要素を抜き出す方法が調べてみても考えてみても分からず、何かいい方法があれば教えていただきたいです。
出力のために作った簡易的なものですが、イメージとして一応コードを載せておきます。
Data
1package test_fxmls.testa; 2 3import javafx.beans.property.SimpleStringProperty; 4 5public class Data { 6 7 private SimpleStringProperty name; 8 private SimpleStringProperty age; 9 private SimpleStringProperty til; 10 11 public Data(String name, String age, String til) { 12 this.name = new SimpleStringProperty(name); 13 this.age = new SimpleStringProperty(age); 14 this.til = new SimpleStringProperty(til); 15 } 16 17 public void setName(String name) { 18 this.name.set(name); 19 } 20 public String getName() { 21 return name.get(); 22 } 23 24 public void setAge(String age) { 25 this.age.set(age); 26 } 27 public String getAge() { 28 return age.get(); 29 } 30 31 public void setTil(String til) { 32 this.til.set(til); 33 } 34 public String getTil() { 35 return til.get(); 36 } 37 38 @Override 39 public String toString() { 40 return "name: " + name.get() + " - " + "age: " + age.get()+ "til: "+ til.get(); 41 } 42 43} 44
AppMainController
1package test_fxmls.testa; 2 3import java.io.IOException; 4import java.net.URL; 5import java.util.ResourceBundle; 6 7import javafx.collections.FXCollections; 8import javafx.collections.ObservableList; 9import javafx.event.ActionEvent; 10import javafx.fxml.FXML; 11import javafx.fxml.FXMLLoader; 12import javafx.fxml.Initializable; 13import javafx.scene.Parent; 14import javafx.scene.Scene; 15import javafx.scene.control.TableColumn; 16import javafx.scene.control.TableView; 17import javafx.scene.control.cell.PropertyValueFactory; 18import javafx.stage.Modality; 19import javafx.stage.Stage; 20 21 22public class AppMainController implements Initializable { 23 24 @FXML 25 private TableView<Data> tvData; 26 @FXML 27 private TableColumn<Data, String> colName; 28 @FXML 29 private TableColumn<Data, String> colAge; 30 @FXML 31 private TableColumn<Data, String> colTil; 32 33 private ObservableList<Data> tvObservableList = FXCollections.observableArrayList(); 34 35 @FXML 36 void onOpenDialog(ActionEvent event) throws IOException { 37 FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("AddPersonDialog.fxml")); 38 Parent parent = fxmlLoader.load(); 39 AddPersonDialogController dialogController = fxmlLoader.<AddPersonDialogController>getController(); 40 dialogController.setAppMainObservableList(tvObservableList); 41 Scene scene = new Scene(parent); 42 Stage stage = new Stage(); 43 stage.initModality(Modality.APPLICATION_MODAL); 44 stage.setScene(scene); 45 stage.showAndWait(); 46 } 47 48 @Override 49 public void initialize(URL location, ResourceBundle resources) { 50 Data Dt = new Data("太郎", "89", "キッチンペーパー"); 51 colName.setCellValueFactory(new PropertyValueFactory<>("name")); 52 colAge.setCellValueFactory(new PropertyValueFactory<>("age")); 53 colTil.setCellValueFactory(new PropertyValueFactory<>("til")); 54 tvObservableList.add(Dt); 55 tvData.setItems(tvObservableList); 56 } 57 58 59}
AppMain
1package test_fxmls.testa; 2 3import javafx.application.Application; 4import javafx.fxml.FXMLLoader; 5import javafx.scene.Parent; 6import javafx.scene.Scene; 7import javafx.stage.Stage; 8 9public class AppMain extends Application { 10 11 @Override 12 public void start(Stage primaryStage) throws Exception { 13 Parent root = FXMLLoader.load(getClass().getResource("AppMain.fxml")); 14 Scene scene = new Scene(root, 500, 500); 15 primaryStage.setScene(scene); 16 primaryStage.show(); 17 } 18 19 public static void main(String[] args) { 20 launch(args); 21 } 22 23}
AddPersonDialog
1package test_fxmls.testa; 2 3import javafx.collections.ObservableList; 4import javafx.event.ActionEvent; 5import javafx.fxml.FXML; 6import javafx.scene.Node; 7import javafx.scene.control.Button; 8import javafx.scene.control.TextField; 9import javafx.stage.Stage; 10 11public class AddPersonDialogController { 12 13 @FXML 14 private TextField tfName; 15 16 @FXML 17 private TextField tfAge; 18 19 @FXML 20 private TextField tfTil; 21 22 @FXML 23 private Button btn_add; 24 25 private ObservableList<Data> appMainObservableList; 26 27 @FXML 28 void btnAddPersonClicked(ActionEvent event) { 29 System.out.println("btnAddPersonClicked"); 30 String name = tfName.getText().trim(); 31 String age = tfAge.getText().trim(); 32 String til = tfTil.getText().trim(); 33 34 Data data = new Data(name, age, til); 35 appMainObservableList.add(data); 36 37 closeStage(event); 38 39 } 40 41 @FXML 42 void btnSavePersonClicked(ActionEvent event) { 43 44// DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 45// DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 46// File file = new File("test1.xml"); 47// 48// Document doc = docBuilder.newDocument(); 49// Element rootElement = doc.createElement("roots"); 50// doc.appendChild(rootElement); 51// 52// Element root = doc.createElement("familia"); 53// rootElement.appendChild(root); 54// 55// Element name = doc.createElement("Name"); 56// name.appendChild(doc.createTextNode(); 57// root.appendChild(name); 58// 59// Element age = doc.createElement("Age"); 60// age.appendChild(doc.createTextNode(); 61// root.appendChild(age); 62// 63// Element tile = doc.createElement("Tile"); 64// tile.appendChild(doc.createTextNode(); 65// root.appendChild(tile); 66 } 67 68 public void setAppMainObservableList(ObservableList<Data> tvObservableList) { 69 this.appMainObservableList = tvObservableList; 70 71 } 72 73 private void closeStage(ActionEvent event) { 74 Node source = (Node) event.getSource(); 75 Stage stage = (Stage) source.getScene().getWindow(); 76 stage.close(); 77 } 78 79} 80
以下FXML
AppPersonDialog
1<?xml version="1.0" encoding="UTF-8"?> 2 3<?import javafx.scene.control.Button?> 4<?import javafx.scene.control.Label?> 5<?import javafx.scene.control.TextField?> 6<?import javafx.scene.layout.AnchorPane?> 7<?import javafx.scene.layout.HBox?> 8<?import javafx.scene.layout.VBox?> 9 10 11<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="142.0" prefWidth="387.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="test_fxmls.testa.AddPersonDialogController"> 12 <children> 13 <AnchorPane prefHeight="147.0" prefWidth="387.0"> 14 <children> 15 <HBox alignment="CENTER" layoutX="33.0" layoutY="82.0" prefHeight="43.0" prefWidth="321.0"> 16 <children> 17 <TextField fx:id="tfName" prefHeight="25.0" prefWidth="95.0" /> 18 <TextField fx:id="tfAge" prefHeight="25.0" prefWidth="104.0" /> 19 <TextField fx:id="tfTil" prefHeight="25.0" prefWidth="95.0" /> 20 </children> 21 </HBox> 22 <Label layoutX="49.0" layoutY="73.0" text="名前" /> 23 <Label layoutX="246.0" layoutY="73.0" text="トイレットペーパー" /> 24 <Label layoutX="143.0" layoutY="73.0" text="年齢" /> 25 <Button fx:id="btn_add" layoutX="155.0" layoutY="22.0" mnemonicParsing="false" onAction="#btnAddPersonClicked" prefHeight="25.0" prefWidth="77.0" text="追加" /> 26 </children> 27 </AnchorPane> 28 </children> 29</VBox> 30
AppMain
1<?xml version="1.0" encoding="UTF-8"?> 2 3<?import javafx.scene.control.Button?> 4<?import javafx.scene.control.TableColumn?> 5<?import javafx.scene.control.TableView?> 6<?import javafx.scene.layout.AnchorPane?> 7<?import javafx.scene.layout.HBox?> 8<?import javafx.scene.layout.VBox?> 9 10<AnchorPane maxHeight="400.0" minHeight="400.0" minWidth="500.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="test_fxmls.testa.AppMainController"> 11 <children> 12 <VBox alignment="CENTER" layoutX="91.0" layoutY="85.0" spacing="10.0" AnchorPane.bottomAnchor="30.0" AnchorPane.leftAnchor="30.0" AnchorPane.rightAnchor="30.0" AnchorPane.topAnchor="30.0"> 13 <children> 14 <HBox alignment="CENTER" prefHeight="66.0" prefWidth="221.0" spacing="50.0"> 15 <children> 16 <Button mnemonicParsing="false" onAction="#onOpenDialog" prefHeight="25.0" prefWidth="83.0" text="保存" /> 17 <Button mnemonicParsing="false" onAction="#onOpenDialog" prefHeight="25.0" prefWidth="83.0" text="追加" /> 18 </children> 19 </HBox> 20 <TableView fx:id="tvData" prefHeight="300.0" prefWidth="400.0"> 21 <columns> 22 <TableColumn fx:id="colName" prefWidth="75.0" text="名前" /> 23 <TableColumn fx:id="colAge" prefWidth="75.0" text="年齢" /> 24 <TableColumn fx:id="colTil" prefWidth="75.0" text="好きなトイレットペーパー" /> 25 </columns> 26 <columnResizePolicy> 27 <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" /> 28 </columnResizePolicy> 29 </TableView> 30 </children> 31 </VBox> 32 </children> 33</AnchorPane> 34
この「保存」を押したときに今現在表示されているTableView内の名前、年齢、トイレットペーパーを要素ごとに情報取得させる方法を知りたいです。長々と申し訳ありません。