###前提・実現したいこと
別ウィンドウで入力された値を親ウィンドウ側のセルに表示
lastName.fxmに入力後→Okボタン→Person.fxmlの指定のセルの値変更
###該当のソースコード
Person.java
package sample; import javafx.beans.property.SimpleStringProperty; public class Person { private SimpleStringProperty firstName = new SimpleStringProperty(""); private SimpleStringProperty lastName = new SimpleStringProperty(""); private SimpleStringProperty email = new SimpleStringProperty(""); public Person() { this("", "", ""); } public Person(String firstName, String lastName, String email) { setFirstName(firstName); setLastName(lastName); setEmail(email); } public String getFirstName() { return firstName.get(); } public void setFirstName(String _firstName) { firstName.set(_firstName); } public String getLastName() { return lastName.get(); } public void setLastName(String _lastName) { lastName.set(_lastName); } public String getEmail() { return email.get(); } public void setEmail(String _email) { email.set(_email); } } ```Controller.java
package sample;
import javafx.collections.ListChangeListener;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.stage.Stage;
import javafx.util.Callback;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
public class Controller implements Initializable{
@FXML private TableView<Person> tableView; @FXML private TableColumn<Person,String> firstName; @FXML private TableColumn<Person,String> lastName; @FXML private TableColumn<Person,String> email; @Override public void initialize(URL location, ResourceBundle resources) { //単一セルの選択の有効化 tableView.getSelectionModel().setSelectionMode(SelectionMode.SINGLE); tableView.getSelectionModel().setCellSelectionEnabled(true); //セルの編集を許可する処理 tableView.setEditable(true); lastName.setEditable(true); Callback<TableColumn<Person,String>,TableCell<Person,String>> lastNameFactory = TextFieldTableCell.forTableColumn(); lastName.setCellFactory(lastNameFactory); //編集完了後の更新処理 lastName.setOnEditCommit((TableColumn.CellEditEvent<Person,String>event)->{ Person person = event.getTableView().getItems().get(event.getTablePosition().getRow()); person.setLastName(event.getNewValue()); }); //名前列のデータ行のセルの配色変更(sample.css) lastName.setCellFactory(TableColumn -> new TableCell<Person, String>(){ //セルに変更があった場合呼ばれるupdateItemメソッドを利用する public void updateItem(String item,boolean empty){ super.updateItem(item,empty); if(empty || item == null){ setText(null); setGraphic(null); }else{ setText(item); getStyleClass().add("tableCellClass"); } } }); //選択状態を検知するバインディングの設定 tableView.getSelectionModel().getSelectedCells().addListener((ListChangeListener.Change<? extends TablePosition> c) -> { //選択セルの取得処理 for (TablePosition pos : tableView.getSelectionModel().getSelectedCells()) { //選択行、列の取得 int row = pos.getRow(); int col = pos.getColumn(); //取得した行、列をセット ControllersCommon.setRow(row); ControllersCommon.setCol(col); //行、列の取得情報をもとにカラムの情報を取得 TableColumn<Person,String> tableColumn = pos.getTableColumn(); //選択行の取得 Person item = tableView.getItems().get(row); //選択行のカラムデータをdispLastNameとして取得 String dispLastName = tableColumn.getCellObservableValue(item).getValue(); //確認用println System.out.println( "選択セル(TableView)" + dispLastName); //dispLastNameを名前列にセット ControllersCommon.setLastName(String.valueOf(dispLastName)); } }); } //キーイベント処理(F3) 名前カラム選択時 @FXML public void onGetFanc(KeyEvent keyEvent) throws IOException { //選択されていた場合のキータイプイベントハンドラ処理 tableView.setOnKeyReleased((KeyEvent event) -> { //名前列が選択されてる場合の条件分岐 if(ControllersCommon.getCol() == 1) { if (event.getCode() == KeyCode.F3) { try { Stage stage = new Stage(); Parent root = FXMLLoader.load(getClass().getResource("lastName.fxml")); Scene scene = new Scene(root); stage.setScene(scene); stage.setTitle("名前入力画面"); stage.showAndWait(); } catch (IOException e) { e.printStackTrace(); } } } }); }
}
<?xml version="1.0" encoding="UTF-8"?> <?import java.net.URL?> <?import javafx.collections.FXCollections?> <?import javafx.geometry.Insets?> <?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.ColumnConstraints?> <?import javafx.scene.layout.GridPane?> <?import javafx.scene.layout.RowConstraints?> <?import sample.Person?> <GridPane alignment="center" hgap="10" vgap="10" xmlns="http://javafx.com/javafx/8.0.121" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller"> <padding> <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> </padding> <Label style="-fx-font:NORMAL 20 Tahoma;" text="アドレス帳" GridPane.columnIndex="0" GridPane.rowIndex="0"> </Label> <TableView fx:id="tableView" editable="true" onKeyPressed="#onGetFanc" GridPane.columnIndex="0" GridPane.rowIndex="1"> <columns> <!-- TableCollumクラスを利用して、データを表示する為の列を追加 --> <TableColumn text="名字" editable="true"> <!-- 列ごとにセル・ファクトリを指定して、データを列に関連付ける --> <cellValueFactory> <!-- PropertyValueFactoryクラスを使用することでセル・ファクトリは実装 --> <!-- Personクラスの対応するメソッドへの参照として表の列のプロパティを使用する --> <PropertyValueFactory property="firstName" /> </cellValueFactory> </TableColumn> <TableColumn fx:id="lastName" text="名前" editable="true"> <cellValueFactory> <PropertyValueFactory property="lastName" /> </cellValueFactory> </TableColumn> <TableColumn text="メールアドレス" editable="true"> <cellValueFactory> <PropertyValueFactory property="email"/> </cellValueFactory> </TableColumn> </columns> <items> <!-- データの行を定義して、そのデータを表の列に関連付ける --> <FXCollections fx:factory="observableArrayList"> <Person firstName="Jacob" lastName="aa" email="aaaa.aa@aaaa.aa"/> <Person firstName="Isabella" lastName="bb" email="bbbb.bb@bbbb.bb"/> <Person firstName="Ethan" lastName="cc" email="cccc.cc@cccc.cc"/> <Person firstName="Michael" lastName="dd" email="dddd.dd@dddd.dd"/> </FXCollections> </items> </TableView>person.fxml
1
<columnConstraints> <ColumnConstraints /> </columnConstraints> <rowConstraints> <RowConstraints /> <RowConstraints /> </rowConstraints> </GridPane><stylesheets> <URL value="@sample.css" /> </stylesheets>
###補足情報 TextInputDialogを利用した方が簡単という意見も聞いてるのですが、 オブジェクト思考を理解しながらのプログラム作成をしようと思っています。 効率等かなり悪いのは承知ですが、javaの勉強という観点で見て頂けると嬉しいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/28 08:11
2017/09/28 08:47 編集
2017/09/28 09:41