JavaFXでデスクトップアプリケーションを作成するための基本のまとめ。
目次
アプリケーション本体
app1クラスを作成する。
このプロジェクトの場合、パッケージ名がdemoなので、一行目を追加する。
package com.example.demo;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import java.io.IOException;
public class app1 extends Application{
@Override
public void start(Stage stage) throws IOException{
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
stage.setTitle("title");
stage.setScene(new Scene(root,500,300));
stage.show();
}
}コントローラ
ボタンクリックなどの動作を記述したい場合は、コントローラを使用する。
コントローラーとFXMLの連動
FXMLインスタンスのonActionプロパティに、”#+メソッド名”を指定した後、Controller.javaにて対応するメソッドを実装する。
FXML
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.collections.*?>
<?import java.lang.String?>
<GridPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="com.example.demo.Controller"
vgap="10" hgap="10"
alignment="center">
<TextField fx:id="field1" GridPane.rowIndex="0"/>
<Button GridPane.rowIndex="1" text="Label1" onAction="#onClickLabel1"/>
</GridPane>Controller.java
package com.example.demo;
import javafx.fxml.FXML;
import javafx.scene.control.TextField;
public class Controller {
@FXML
private TextField field1;
public void onClickLabel1(){
System.out.println(field1.getText()+”Entered." );
}
}

この例では、ボタンクリック時にテキストフィールドに入力した文字がターミナルに出力される。
複数のボタンの配置とコントローラーでの管理
二つのボタンを配置して、一つのコントローラでアクションを制御する。
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.collections.*?>
<?import java.lang.String?>
<GridPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="com.example.demo.Controller"
vgap="10" hgap="10"
alignment="center">
<TextField fx:id="field1" GridPane.rowIndex="0"/>
<Button fx:id="button1" GridPane.rowIndex="1" text="Button1" onAction="#onClickButton"/>
<Button fx:id="button2" GridPane.rowIndex="2" text="Button2" onAction="#onClickButton"/>
</GridPane>FXMLでは2つのボタンと一つのテキストフィールドを定義する。
package com.example.demo;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
public class Controller {
@FXML
private TextField field1;
@FXML
private Button button1;
@FXML
private Button button2;
public void onClickButton(ActionEvent e){
if (e.getSource().equals(button1)){
System.out.println("Button1 clicked");
System.out.println("Text = " + field1.getText());
}else if (e.getSource().equals(button2)) {
System.out.println("Button2 clicked");
System.out.println("Text = " + field1.getText());
}
System.out.println("---------------------------");
}
}
OnClickハンドラ
特定の条件下でボタンを有効化、無効化できる。
テキストフィールドに、onKeyReleasedプロパティを追加。
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.collections.*?>
<?import java.lang.String?>
<GridPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="com.example.demo.Controller"
vgap="10" hgap="10"
alignment="center">
<TextField fx:id="field1" GridPane.rowIndex="0"
onKeyReleased="#keyReleaseHandler"/>
<Button fx:id="button1" GridPane.rowIndex="1" text="Button1" onAction="#onClickButton"/>
</GridPane>コントローラーに制御メソッドとイニシャライザを追加。イニシャライザは名前を正確に書かないといけない。
package com.example.demo;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
public class Controller {
@FXML
private TextField field1;
@FXML
private Button button1;
@FXML
public void initialize(){
button1.setDisable(true);
}
@FXML
public void onClickButton(ActionEvent e){
System.out.println("Button1 clicked");
System.out.println("Text = " + field1.getText());
}
@FXML
public void keyReleaseHandler(){
String text = field1.getText();
boolean disabled = text.isEmpty() || text.trim().isEmpty();
button1.setDisable(disabled);
}
}
テキストが入力されていない場合は、クリックが無効化されている。
FXML
マークアップ形式で、パーツの配置などを記述していく。
GridPane
格子状に決められた規格に沿ってパーツを配置することができる。
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<GridPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="com.example.demo.controller1"
vgap="10" hgap="10"
alignment="center">
<Button text="Button1" GridPane.rowIndex="0" GridPane.columnIndex="0"/>
<Button text="Button2" GridPane.rowIndex="0" GridPane.columnIndex="1"/>
<Button text="Button3" GridPane.rowIndex="1" GridPane.columnIndex="0"/>
<Button text="Button4" GridPane.rowIndex="1" GridPane.columnIndex="1"/>
</GridPane>
RadioButton
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<GridPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="com.example.demo.controller1"
vgap="10" hgap="10"
alignment="center">
<RadioButton GridPane.rowIndex="0" GridPane.columnIndex="0" text="option1"></RadioButton>
<RadioButton GridPane.rowIndex="1" GridPane.columnIndex="0" text="option2"></RadioButton>
<RadioButton GridPane.rowIndex="2" GridPane.columnIndex="0" text="option3"></RadioButton>
</GridPane>
以下のようにトグルグループを定義することで、同時選択を避けることもできる。
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<GridPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="com.example.demo.controller1"
vgap="10" hgap="10"
alignment="center">
<fx:define>
<ToggleGroup fx:id="toggleGroup1"/>
</fx:define>
<RadioButton GridPane.rowIndex="0" GridPane.columnIndex="0" text="option1" toggleGroup="$toggleGroup1"></RadioButton>
<RadioButton GridPane.rowIndex="1" GridPane.columnIndex="0" text="option2" toggleGroup="$toggleGroup1"></RadioButton>
<RadioButton GridPane.rowIndex="2" GridPane.columnIndex="0" text="option3" toggleGroup="$toggleGroup1"></RadioButton>
</GridPane>
チェックボックス
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<GridPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="com.example.demo.controller1"
vgap="10" hgap="10"
alignment="center">
<CheckBox text="Checkbox1" GridPane.rowIndex="0"></CheckBox>
</GridPane>
テキストフィールド、パスワードフィールド
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.collections.*?>
<?import java.lang.String?>
<GridPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="com.example.demo.controller1"
vgap="10" hgap="10"
alignment="center">
<TextField GridPane.rowIndex="1" />
<PasswordField GridPane.rowIndex="2" />
</GridPane>
ComboBox
選択肢を提示するときに便利。
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.collections.*?>
<?import java.lang.String?>
<GridPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="com.example.demo.controller1"
vgap="10" hgap="10"
alignment="center">
<ComboBox GridPane.rowIndex="2" GridPane.columnSpan="1">
<items>
<FXCollections fx:factory="observableArrayList" >
<String fx:value = "Option 1"/>
<String fx:value = "Option 2"/>
<String fx:value = "Option 3"/>
<String fx:value = "Option 4"/>
<String fx:value = "Option 5"/>
</FXCollections>
</items>
<value>
<String fx:value="default"/>
</value>
</ComboBox>
</GridPane>
ChoiseBox
ComboBoxとほぼ同じ。
選んだものにチェックマークが入るかどうかの違い。
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.collections.*?>
<?import java.lang.String?>
<GridPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="com.example.demo.controller1"
vgap="10" hgap="10"
alignment="center">
<ChoiceBox GridPane.rowIndex="2" GridPane.columnSpan="1">
<items>
<FXCollections fx:factory="observableArrayList" >
<String fx:value = "Option 1"/>
<String fx:value = "Option 2"/>
<String fx:value = "Option 3"/>
<String fx:value = "Option 4"/>
<String fx:value = "Option 5"/>
</FXCollections>
</items>
<value>
<String fx:value="default"/>
</value>
</ChoiceBox>
</GridPane>
SlideBar
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.collections.*?>
<?import java.lang.String?>
<GridPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="com.example.demo.controller1"
vgap="10" hgap="10"
alignment="center">
<Slider GridPane.rowIndex="0" GridPane.columnSpan="8" min ="0" max = "100"
showTickLabels="true"
showTickMarks="true"
snapToTicks="true"
/>
</GridPane>
Spinner
細かい選択などに向いているよう。デフォルト値の設定も可能。
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.collections.*?>
<?import java.lang.String?>
<GridPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="com.example.demo.controller1"
vgap="10" hgap="10"
alignment="center">
<Spinner GridPane.rowIndex="0" min ="0" max ="100"
editable = "true"
initialValue="50"/>
</GridPane>
ColorPicker
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.collections.*?>
<?import java.lang.String?>
<GridPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="com.example.demo.controller1"
vgap="10" hgap="10"
alignment="center">
<ColorPicker GridPane.rowIndex="0"/>
</GridPane>
DatePicker
日付を選択できる。
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.collections.*?>
<?import java.lang.String?>
<GridPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="com.example.demo.controller1"
vgap="10" hgap="10"
alignment="center">
<DatePicker GridPane.rowIndex="0"/>
</GridPane>
