読者です 読者をやめる 読者になる 読者になる

JavaFX Mavenサンプル

Java

JavaFXMaven 基本的なアーキタイプを探していて、

GitHub - javafx-maven-plugin/javafx-basic-archetype: A Maven archetype for generating a basic JavaFX starter project.

というのを見つけたので、ここに紹介されたとおり mvn コマンドを以下のように実行して

mvn archetype:generate -DarchetypeGroupId=com.zenjava -DarchetypeArtifactId=javafx-basic-archetype

作成した fxml を JavaFX Scene Builder 2.0 で開こうとすると、

java.io.IOException: javafx.fxml.LoadException: 
   C:/work/sample/src/main/resources/fxml/hello.fxml

at com.oracle.javafx.scenebuilder.kit.fxom.FXOMLoader.load(FXOMLoader.java:92)
at com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument.<init>(FXOMDocument.java:80)

     :
... 22 more
Caused by: java.lang.ClassNotFoundException: org.tbee.javafx.scene.layout.fxml.MigPane

とエラーなる。つまり標準SDKで配布されてない Pane がデザインコンテナとして使われており

fxml から、

import org.tbee.javafx.scene.layout.fxml.MigPane

の記述を削除して、別の Pane で書き直す。

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<Pane id="rootPane" prefHeight="207.0" prefWidth="322.0" styleClass="main-panel" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="yip.fxtest.HelloController">
   <children>

       <Label layoutX="25.0" layoutY="45.0" text="First Name:" /> <TextField fx:id="firstNameField" layoutX="112.0" layoutY="73.0" prefColumnCount="30" prefHeight="23.0" prefWidth="201.0" />
       <Label layoutX="25.0" layoutY="77.0" text="Last Name:" />	<TextField fx:id="lastNameField" layoutX="112.0" layoutY="42.0" prefColumnCount="30" prefHeight="23.0" prefWidth="201.0"  />

       <Button layoutX="191.0" layoutY="104.0" onAction="#sayHello" text="Say Hello" />

       <Label fx:id="messageLabel" layoutX="25.0" layoutY="145.0" prefHeight="36.0" prefWidth="274.0" styleClass="hello-message" />
   </children>

</Pane>


pom.xml も以下のように書き直す。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>yip.fxtest</groupId>
<artifactId>fxtest1</artifactId>
<packaging>jar</packaging>
<version>1.0</version>

<properties>
	<slf4j.version>1.7.12</slf4j.version>
	<log4j.version>1.2.17</log4j.version>
</properties>

<dependencies>

	<!-- MigLayout -->
	<dependency>
		<groupId>com.miglayout</groupId>
		<artifactId>miglayout-javafx</artifactId>
		<version>5.0</version>
	</dependency>

	<!-- Apache Commons -->
	<dependency>
		<groupId>commons-lang</groupId>
		<artifactId>commons-lang</artifactId>
		<version>2.6</version>
	</dependency>

	<!-- Logging  -->
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-api</artifactId>
		<version>${slf4j.version}</version>
	</dependency>
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>jcl-over-slf4j</artifactId>
		<version>${slf4j.version}</version>
	</dependency>
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-log4j12</artifactId>
		<version>${slf4j.version}</version>
	</dependency>
	<dependency>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
		<version>${log4j.version}</version>
	</dependency>

</dependencies>

<build>
	<finalName>fxtest1</finalName>
	<plugins>
		<plugin>
			<groupId>com.zenjava</groupId>
			<artifactId>javafx-maven-plugin</artifactId>
			<version>8.8.3</version>
			<configuration>
				<mainClass>yip.fxtest.MainApp</mainClass>
			</configuration>
		</plugin>

		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<configuration>
				<source>1.8</source>
				<target>1.8</target>
			</configuration>
		</plugin>
	</plugins>
</build>

</project>

実行すると以下の画面で、基本的なテキスト入力→ボタンアクション→入力結果を表示という基本的なコードなので
満足する初期段階のソースコードなんだが、標準でない Pane の使用で躓かせてくれる。。

f:id:posturan:20170304141910j:plain