国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

MartinHan / 2933人閱讀

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

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

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

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

最終實現效果如下圖所示:

FlowPane 布局面板中包含的自定義控件會在水平方向上按行連續地平鋪放置,并且會在邊界處自動換行,點擊左側 ListView 中的 Item,右側的自定義控件組會顯示選定設備組的狀態信息。綜上,該設計可實現預定目標。

1. Java FX 8 基本說明

可以使用這篇「JavaFX 8 教程」作為 JavaFX 8 的入門使用,擁有 GUI 設計經驗的開發人員均可快速入門 Java FX 8,

1.1 界面生成方式

Java FX 8 與大多數現代 GUI 開發相同,用戶界面有兩種創建方式:

XML文件定義

java代碼創建

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

1.2 問題說明

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

2. 界面根布局的設計

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

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

public class Main extends Application {

    //入口方法已隱式實現,故可刪除
    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();           //返回類型設置為布局文件根節點類型
        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();
    }
}

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

3. 自定義控件的設計
JavaFX 2 版本之后,FXML 提供  寫法,此時要求 Controller 必須繼承自 FXML 節點對象,使用 FXMLLoader 加載時,必須調用 setRoot() 方法。

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

根據具體實踐,可以采用如下方式:

Scene Builder 左下角的 Controller 面板中,勾選使用 fx:root 構造,并且不應該填入 Controller 類,如圖,此時 作為根節點,:

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


    
......

此時,Controller 類繼承根節點的類型,例如「TabPane」。可選實現「Initializable」接口進行控件生成之后的初始化操作,代碼示例如下:

//Controller 類繼承 FXML 布局文件的根節點類型「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();
        }
    }

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

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

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

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

綜上所述,最終實現的主界面代碼示例如下:

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) {
    }
}
  

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

public class MainLauncher extends Application {

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

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

5. 參考資料

使用內置的布局面板

JavaFX 8 教程「中文」

JavaFX 8 API Document

Gluon Scene Builder

JavaFX 創建自定義控件

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68249.html

相關文章

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

    摘要:本文探討使用構建集成的可執行程序的方法,以及根節點問題。而使用后,可指導類作為根節點,避免了嵌套的情況。文件設計如下文件同時指明了根節點的類型,資源文件對應的設計如下此時可實現開始時,純代碼方式的自定義控件設計。 「博客搬家」 原地址: 簡書 原發表時間: 2017-05-22 上一篇文章探討了使用 IntelliJ IDEA 創建 JavaFX 工程,進而開發了所需應用程序。更...

    joywek 評論0 收藏0
  • JavaFX 學習筆記——窗口與控件

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

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

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

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

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

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

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

    PumpkinDylan 評論0 收藏0

發表評論

0條評論

MartinHan

|高級講師

TA的文章

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