JavaFXでFXMLなしでTableViewを実装する方法
JavaFXはコントロールのデザインをFXLMファイルに表現するのが一般的で、FXLMを生成するSceneBuilderという便利なツールもあります。
しかし、実際やってみて思ったのは最初のデザインの時は早く仕上がるもののデバッグ時に問題が起きると原因を見つけるのに難儀するという点です。FXML−Java間の不具合はコンパイル時にはわからず実行エラーとなり、実行エラーを読み取るのがコンパイルエラーよりも時間がかかるからです。トータルコストはFXML利用のほうが大きいんじゃないかなと最近思い始めています。(プロじゃないからわからんけど…)
なので、今後はFXMLなしで実装していくことにしました。今回は以前書いた以下のTableViewをFXMLなしで実装したものを書き留めます。
出来上がったのはこちらです。
まずデータクラス(Member.class)です。
public class Member { private String name; private int age; private String address; public Member(String name, int age, String address){ this.name = name; this.age = age; this.address = address; } public String getName(){ return name; } public int getAge(){ return age; } public String getAddress(){ return address; } public void setName(String name){ this.name = name; } public void setAge(int age){ this.age = age; } public void setAddress(String address){ this.address = address; } }
次にメインクラス(TableViewTest.java)。データクラスとの接続部分は実行エラーになりますがコントロールの配置などはコンパイルエラーが出るので問題箇所を容易に特定できてストレス低めでした。
import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.control.cell.*; import javafx.collections.*; import javafx.scene.layout.BorderPane; import javafx.stage.Stage; import javafx.scene.text.Font; public class TableViewTest extends Application{ public static void main(String[] args){ launch(args); } @Override public void start(Stage stage) throws Exception{ BorderPane pane = this.setComponents(); Scene scene = new Scene(pane,800,600); stage.setScene(scene); stage.show(); } private BorderPane setComponents(){ Button btn = new Button("Button"); ToolBar toolBar = new ToolBar(btn); TableView<Member> table = new TableView<Member>(); ObservableList<Member> data = FXCollections.observableArrayList( new Member("山田太郎", 48, "東京都千代田区"), new Member("渡辺花子", 52, "北海道札幌市"), new Member("池田隆", 27, "大阪府大坂市"), new Member("鈴木一郎", 32, "福岡県北九州市") ); table.itemsProperty().setValue(data); TableColumn<Member, String> nameColumn = new TableColumn<>("名前"); TableColumn<Member, String> ageColumn = new TableColumn<>("年齢"); TableColumn<Member, String> addressColumn = new TableColumn<>("出身地"); nameColumn.setCellValueFactory(new PropertyValueFactory<Member, String>("name")); ageColumn.setCellValueFactory(new PropertyValueFactory<Member, String>("age")); addressColumn.setCellValueFactory(new PropertyValueFactory<Member, String>("address")); table.getColumns().addAll(nameColumn, ageColumn, addressColumn); BorderPane pane = new BorderPane(); pane.setTop(toolBar); pane.setCenter(table); return pane; } }
スポンサーリンク