「譯」Maven 集成 JavaFX 8 以及 <fx:root> 問題探討

上一篇文章探討了使用 IntelliJ IDEA 創(chuàng)建 JavaFX 工程砚哆,進而開發(fā)了所需應(yīng)用程序勉失。更實際的情況是需要使用 Maven, Gradle 等進行項目的構(gòu)建羞海。本文探討使用 Maven 構(gòu)建集成 JavaFX 8 的可執(zhí)行程序的方法这吻,以及 <fx:root> 根節(jié)點問題琳轿。

1. Maven 構(gòu)建的程序未集成 FXML 布局文件

使用 Maven 直接構(gòu)建态鳖,在 compile 階段, .class 文件均被復(fù)制到 target/classes/ 目錄转培,而對于 .FXML 文件,則分如下情況:

  1. simple.fxml 文件位于 src/main/resources/ 目錄中浆竭,在 compile 階段浸须,simple.fxml 會按照層級復(fù)制到 target/classes/ 目錄中,執(zhí)行:
getClass().getClassLoader().getResource("simple.fxml")
getClass().getResource("/simple.fxml")
  1. 為了方便使用邦泄,simple.fxml 文件位于其 Controller 的同級目錄中删窒,此時在 compile 階段,simple.fxml 會被忽略掉虎韵,Maven 不會復(fù)制位于 src 目錄下的任何資源文件易稠,故需要采取其他策略,通過搜索 StackOverflow 發(fā)現(xiàn)了解決方法如下:

pom.xml 文件中添加如下 resource 插件即可解決問題:

<build>
    ...
    <resources>
        <resource>
            <filtering>false</filtering>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.fxml</include>
            </includes>             
        </resource>
    <resources>
    ...
</build>

此時所有的 .fxml 文件均會被完整復(fù)制到 src 下的同級目錄包蓝。

使用 Maven 構(gòu)建可執(zhí)行 Jar 可使用通用方法驶社,具體參考:鏡像1鏡像2

可執(zhí)行 Jar 構(gòu)建完畢后测萎,在 Windows 平臺下可以直接雙擊執(zhí)行亡电。

2. FXML 文件中,「fx:root」根節(jié)點問題探討

為了更加方便靈活地使用自定義控件硅瞧,更方便的集成 Controller 和 FXML 資源文件份乒,以下內(nèi)容對 StackOverflow 的一則回復(fù)進行翻譯修改:

假設(shè)想要設(shè)計一個自定義控件:HBox 中包含 TextFieldButton,不使用 FXML 文件時腕唧,自定義控件設(shè)計如下:

public class MyComponent extends HBox {
    private TextField textField ;
    private Button button ;

    public MyComponent() {
        textField = new TextField();
        button = new Button();
        this.getChildren().addAll(textField, button);
    }
}

此時可對該自定義控件方便地設(shè)計邏輯代碼或辖。

若使用 FXML 文件時,如:

<HBox>
    <TextField fx:id="textField"/>
    <Button fx:id="button" />
</HBox>

此時 HBox 的 Controller 定義如下:

public class MyComponent extends HBox {

    @FXML
    private TextField textField ;

    @FXML
    private Button button ;

    public MyComponent() {
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("MyComponent.fxml"));
            loader.setController(this);
            HBox hbox = loader.load();
            this.getChildren().add(hbox);
        } catch (IOException exc) {
            // handle exception
        }
    }
}

此時該自定義控件為一個 HBox 包裹一個 HBox枣接,子 HBox 才包含 TextFieldButton颂暇,所以無法實現(xiàn)開始時,純代碼方式的自定義控件設(shè)計但惶。

而使用 <fx:root> 后耳鸯,可指導(dǎo) Controller 類作為「根節(jié)點」湿蛔,避免了 HBox 嵌套 HBox 的情況。

FXML 文件設(shè)計如下:

<fx:root type="javafx.scene.layout.HBox">
    <TextField fx:id="textField" />
    <Button fx:id="button" />
</fx:root>

FXML 文件同時指明了根節(jié)點的類型县爬,資源文件對應(yīng)的 Controller 設(shè)計如下:

public class MyComponent extends HBox {

    @FXML 
    private TextField textField ;

    @FXML
    private Button button ;

    public MyComponent() {
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("MyComponent.fxml"));
            loader.setController(this);
            loader.setRoot(this);
            loader.load();
        } catch (IOException exc) {
            // handle exception
        }
    }
}

此時可實現(xiàn)開始時阳啥,純代碼方式的自定義控件設(shè)計。

3. 參考資料

  1. JavaFX and Maven: NullPointerException: Location is required

  2. How to understand and use <fx:root>, in JavaFX

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末财喳,一起剝皮案震驚了整個濱河市察迟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纲缓,老刑警劉巖卷拘,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喊废,死亡現(xiàn)場離奇詭異祝高,居然都是意外死亡,警方通過查閱死者的電腦和手機污筷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門工闺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瓣蛀,你說我怎么就攤上這事陆蟆。” “怎么了惋增?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵叠殷,是天一觀的道長。 經(jīng)常有香客問我诈皿,道長林束,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任稽亏,我火速辦了婚禮壶冒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘截歉。我一直安慰自己胖腾,他們只是感情好,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布瘪松。 她就那樣靜靜地躺著咸作,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宵睦。 梳的紋絲不亂的頭發(fā)上记罚,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天,我揣著相機與錄音状飞,去河邊找鬼毫胜。 笑死书斜,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的酵使。 我是一名探鬼主播荐吉,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼口渔!你這毒婦竟也來了样屠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤缺脉,失蹤者是張志新(化名)和其女友劉穎痪欲,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體攻礼,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡业踢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了礁扮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片知举。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖太伊,靈堂內(nèi)的尸體忽然破棺而出雇锡,到底是詐尸還是另有隱情,我是刑警寧澤僚焦,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布锰提,位于F島的核電站,受9級特大地震影響芳悲,放射性物質(zhì)發(fā)生泄漏立肘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一芭概、第九天 我趴在偏房一處隱蔽的房頂上張望赛不。 院中可真熱鬧,春花似錦罢洲、人聲如沸踢故。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽殿较。三九已至,卻和暖如春桩蓉,著一層夾襖步出監(jiān)牢的瞬間淋纲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工院究, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留洽瞬,地道東北人本涕。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像伙窃,于是被迫代替她去往敵國和親菩颖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理为障,服務(wù)發(fā)現(xiàn)晦闰,斷路器,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,771評論 25 707
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,773評論 6 342
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫鳍怨、插件呻右、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,064評論 4 62
  • 3月11日下午2點,由華嚴書院養(yǎng)正班義工老師鞋喇、耘心學(xué)堂田老師策劃并主持的華嚴書院樂音樹下“萊雅琴?古琴”公益音樂會...
    耘心學(xué)堂閱讀 572評論 0 0