成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaFX 8 下簡化自定義控件的外部調(diào)用以及流式布局示例

MartinHan / 2974人閱讀

摘要:故可采用自定義控件的方式簡化外部的代碼調(diào)用。自定義控件的設(shè)計版本之后,提供寫法,此時要求必須繼承自節(jié)點(diǎn)對象,使用加載時,必須調(diào)用方法。

「博客搬家」  原地址: 簡書  原發(fā)表時間: 2017-05-21

有一個項目,需要模擬數(shù)千臺設(shè)備的工作情況,這數(shù)千個設(shè)備分為若干組,每組 100 臺。故需要設(shè)計一款 GUI 程序,包含 100 個自定義控件,模擬一組設(shè)備的工作情況,通過 ListView 對設(shè)備組進(jìn)行選擇,即可成功模擬數(shù)千臺設(shè)備。

由于 Java 擁有豐富的第三方庫,便于項目的底層實(shí)現(xiàn),故基于最新的 Java GUI 框架「JavaFX 8」實(shí)現(xiàn)該 GUI 界面,該應(yīng)用程序需使用 100 個相同的自定義控件,故需要使用流面板 (FlowPane) 對這些自定義控件進(jìn)行有效布局。

最終實(shí)現(xiàn)效果如下圖所示:

FlowPane 布局面板中包含的自定義控件會在水平方向上按行連續(xù)地平鋪放置,并且會在邊界處自動換行,點(diǎn)擊左側(cè) ListView 中的 Item,右側(cè)的自定義控件組會顯示選定設(shè)備組的狀態(tài)信息。綜上,該設(shè)計可實(shí)現(xiàn)預(yù)定目標(biāo)。

1. Java FX 8 基本說明

可以使用這篇「JavaFX 8 教程」作為 JavaFX 8 的入門使用,擁有 GUI 設(shè)計經(jīng)驗(yàn)的開發(fā)人員均可快速入門 Java FX 8,

1.1 界面生成方式

Java FX 8 與大多數(shù)現(xiàn)代 GUI 開發(fā)相同,用戶界面有兩種創(chuàng)建方式:

XML文件定義

java代碼創(chuàng)建

本文為了更加清晰直觀,采用兩種界面布局方法相結(jié)合的方式。

1.2 問題說明

由于 Java FX 8 并不主流,遇到問題很難在中文網(wǎng)站上找到解決方法,故有許多坑需要填補(bǔ),所以本文遇到一些坑時不進(jìn)行說明,而是在另一篇文章中列出了這些坑的填補(bǔ)方法。

2. 界面根布局的設(shè)計

使用「Scene Builder」打開 FXML 布局文件,在如圖所示左下角,填入一個自定義 Class 作為控制器類,激活需要操作的控件,在右側(cè)「fx:id」處填入 Class 的 Field,下方填入事件處理方法,之后通過 View -> Show Sample Controller skeleton 可查看填入 Controller 中的代碼示例。

在程序的入口類中填入如下代碼:

public class Main extends Application {

    //入口方法已隱式實(shí)現(xiàn),故可刪除
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {

        primaryStage.setTitle("bitkyApp");
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("sample.fxml"));
        AnchorPane anchorPane = fxmlLoader.load();           //返回類型設(shè)置為布局文件根節(jié)點(diǎn)類型
        Controller controller = fxmlLoader.getController();  //可獲取該布局的 Controller 類

        BorderPane rootLayout = FXMLLoader.load(getClass().getResource("rootLayout.fxml"));
        rootLayout.setCenter(anchorPane);
        primaryStage.setScene(new Scene(rootLayout, 800, 650));
        primaryStage.show();
    }
}

該方法為教程中的方法,為了實(shí)現(xiàn) Controller 和外部的交互,將 FXML 布局文件和 Controller 均耦合在了外部類中,顯得較為繁瑣。故可采用自定義控件的方式簡化外部的代碼調(diào)用。

3. 自定義控件的設(shè)計
JavaFX 2 版本之后,F(xiàn)XML 提供  寫法,此時要求 Controller 必須繼承自 FXML 節(jié)點(diǎn)對象,使用 FXMLLoader 加載時,必須調(diào)用 setRoot() 方法。

不要在 FXML 中指定 Controller,通常情況下一個 FXML 可以對應(yīng)多個 Controller,為了靈活性,我們應(yīng)當(dāng)在 FXMLLoader 中指定 Controller。

根據(jù)具體實(shí)踐,可以采用如下方式:

Scene Builder 左下角的 Controller 面板中,勾選使用 fx:root 構(gòu)造,并且不應(yīng)該填入 Controller 類,如圖,此時 作為根節(jié)點(diǎn),:

此時在 FXML 文件中的代碼例如:


    
......

此時,Controller 類繼承根節(jié)點(diǎn)的類型,例如「TabPane」。可選實(shí)現(xiàn)「Initializable」接口進(jìn)行控件生成之后的初始化操作,代碼示例如下:

//Controller 類繼承 FXML 布局文件的根節(jié)點(diǎn)類型「TabPane」
public class DeviceView extends TabPane implements Initializable {

    public DeviceView() {
        loadFxml();
    }

    private void loadFxml() {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("device_view.fxml"));
        loader.setRoot(this);
        loader.setController(this);
        try {
            loader.load();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //該方法在構(gòu)造方法執(zhí)行完畢后執(zhí)行
    @Override
    public void initialize(URL location, ResourceBundle resources) {
    }
}

此時,在主布局對應(yīng)的 Controller 中,直接生成該類「DeviceView」的對象作為自定義控件,通過 FlowPane 控件的引用添加該對象為 FlowPane 的子控件,即可實(shí)現(xiàn)設(shè)計目的,具體代碼如下:

for (int i = 1; i <= 100; i++) {

    //在 FlowPane 中添加自定義控件「DeviceView」
    DeviceView deviceView = new DeviceView(i);
    deviceFlowPane.getChildren().add(deviceView);
    
    //使用觀察者模式添加子控件「DeviceView」的監(jiān)聽器
    deviceView.setListener((status -> {
        if (listener != null) listener.btnChanged(status);
    }));
}
4. 使用自定義控件的方式簡化主界面的外部調(diào)用代碼

綜上所述,最終實(shí)現(xiàn)的主界面代碼示例如下:

public class MainView extends BorderPane implements Initializable {

    private static MainView mainView;

    private MainView() throws IOException {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("rootLayout.fxml"));
        loader.setRoot(this);
        loader.setController(this);
        loader.load();
    }

    public static MainView getInstance() {
        if (mainView == null) {
            try {
                mainView = new MainView();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return mainView;
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {
    }
}
  

此段代碼使用了自定義控件的方式,并且使用了單例模式中的懶漢式方便外部調(diào)用,外部調(diào)用代碼如下:

public class MainLauncher extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
           startApp(primaryStage);
    }

    private void startApp(Stage primaryStage) {
        primaryStage.setTitle("設(shè)備模擬客戶端");
        primaryStage.setScene(new Scene(MainView.getInstance()));
        primaryStage.setMaximized(true);
        primaryStage.show();
    }
}

5. 參考資料

使用內(nèi)置的布局面板

JavaFX 8 教程「中文」

JavaFX 8 API Document

Gluon Scene Builder

JavaFX 創(chuàng)建自定義控件

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/68249.html

相關(guān)文章

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

    摘要:本文探討使用構(gòu)建集成的可執(zhí)行程序的方法,以及根節(jié)點(diǎn)問題。而使用后,可指導(dǎo)類作為根節(jié)點(diǎn),避免了嵌套的情況。文件設(shè)計如下文件同時指明了根節(jié)點(diǎn)的類型,資源文件對應(yīng)的設(shè)計如下此時可實(shí)現(xiàn)開始時,純代碼方式的自定義控件設(shè)計。 「博客搬家」 原地址: 簡書 原發(fā)表時間: 2017-05-22 上一篇文章探討了使用 IntelliJ IDEA 創(chuàng)建 JavaFX 工程,進(jìn)而開發(fā)了所需應(yīng)用程序。更...

    joywek 評論0 收藏0
  • JavaFX 學(xué)習(xí)筆記——窗口與控件

    摘要:創(chuàng)建窗口添加類為元素間空隙與主窗口創(chuàng)建過程相同,新建布局及控件,最后使用的方法顯示出來。設(shè)置主窗口中的按鈕事件,點(diǎn)擊按鈕后會顯示一個窗口。這時我們可以通過函數(shù)設(shè)置窗口關(guān)閉時觸發(fā)的事件在關(guān)閉窗口時,首先執(zhí)行這一事件處理函數(shù),再將窗口關(guān)閉。 前言 如今比較流行的桌面gui框架有WPF、WinForm、Qt、javafx等。其中WPF和WinForm目前還只能在運(yùn)行Winsows上。Qt(w...

    Pocher 評論0 收藏0
  • 國外程序員整理Java資源大全

    摘要:日期和時間處理日期和時間的函數(shù)庫。使用中可觀察序列,創(chuàng)建異步基于事件應(yīng)用程序的函數(shù)庫。為分布式系統(tǒng)提供延遲和容錯處理。發(fā)布使用本機(jī)格式分發(fā)應(yīng)用程序的工具。將程序資源和打包成和的本機(jī)文件。圖像處理用來幫助創(chuàng)建評估或操作圖形的函數(shù)庫。 好資源要分享原文 譯者 唐尤華 翻譯自 github akullpp 構(gòu)建 這里搜集了用來構(gòu)建應(yīng)用程序的工具。 Apache Maven:Mave...

    chengtao1633 評論0 收藏0
  • Java? 教程(匿名類)

    匿名類 匿名類可以使你代碼更簡潔,它們使你能夠同時聲明和實(shí)例化一個類,它們就像局部類,除了它們沒有名稱,如果你只需要使用局部類一次,請使用它們。 聲明匿名類 雖然局部類是類聲明,但匿名類是表達(dá)式,這意味著你在另一個表達(dá)式中定義該類,以下示例HelloWorldAnonymousClasses在局部變量frenchGreeting和spanishGreeting的初始化語句中使用匿名類,但使用局部類...

    xietao3 評論0 收藏0
  • 深入理解JAVA語言

    摘要:在那里,可以理解為指針。局部變量不能夠被訪問控制符及修飾都可以被修飾變量的傳遞與語言相似調(diào)用對象方法時要傳遞參數(shù)。內(nèi)部類內(nèi)部類是所在類的成員。大體上相當(dāng)于其他語言的匿名函數(shù)或函數(shù)指針。 1. 變量及其傳遞 基本類型變量(primitive type)和引用類型變量(reference type) 基本類型(primitive type):其值直接存于變量中。在這里 引用型(refer...

    PumpkinDylan 評論0 收藏0

發(fā)表評論

0條評論

MartinHan

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<