2015-04-04 45 views

回答

12

如何從JAR導入組件到SceneBuilder

你可以把你的組件在一個罐子裏,並將其導入到SceneBuilder。您不需要爲組件創建FXML文件,以將其添加到SceneBuilder庫面板。

查看JavaFX用戶指南的Adding Custom Components to the Library部分。

要從JAR或FXML文件導入自定義GUI組件:

  1. 選擇導入JAR/FXML從庫面板中的菜單文件命令,或者 拖動JAR或FXML文件直接從系統的本機文件 管理器(資源管理器或Finder)中將其放入庫面板中

  2. 在打開對話框窗口中,導航到您要導入的JAR或FXML 文件的位置。顯示類似於Figure 8-4中所示的 的導入對話框。檢查JAR文件的內容爲 ,並確定爲 合適的自定義組件的所有Java類都顯示在對話窗口中。對FXML文件的內容進行解析,以確保添加的組件 有效並且是獨立的。

  3. 從「導入」對話框窗口中,選擇或取消選擇要導入的項目列表 中的項目。

  4. 點擊導入組件。導入的項目被添加到庫面板的自定義 部分。他們可以立即使用它們 圖書館堅持場景生成器重新啓動

注後,也SceneBuilder還支持基於FXML組件,而不僅僅是直代碼組件的進口。此答案僅討論僅導入不包含FXML的代碼組件。

樣品進口組合使用

這裏是我使用以上概述的方法導入到SceneBuilder定製搜索場分量。

search sample

頂部搜索面板是在場景生成器設計窗格,上下求索麪板使用場景生成器預覽功能,尋找幸福的結果。

樣品SceneBuilder生成的代碼

這是由SceneBuilder基於這裏包含的設計產生的FXML文件。請注意,這只是我用SceneBuilder創建的測試場景,用於測試已導入的組件 - 它不是組件導入過程本身的一部分。

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

<?import javafx.scene.text.*?> 
<?import org.jewelsea.*?> 
<?import javafx.geometry.*?> 
<?import javafx.scene.control.*?> 
<?import java.lang.*?> 
<?import javafx.scene.layout.*?> 


<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" spacing="10.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"> 
    <children> 
     <Label text="Search Field Import Test"> 
     <font> 
      <Font size="16.0" /> 
     </font> 
     </Label> 
     <SearchField /> 
    </children> 
    <padding> 
     <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> 
    </padding> 
</VBox> 

樣品(導入的)組件代碼

爲其導入的搜索框的代碼是:

package org.jewelsea; 

import javafx.geometry.Insets; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.control.TextField; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.StackPane; 
import javafx.scene.layout.VBox; 

public class SearchField extends StackPane { 
    private final TextField textField; 
    private final Button searchButton; 
    private final Label searchResults; 

    public SearchField() { 
     textField = new TextField(); 
     textField.setPromptText(
       "Search Text" 
     ); 

     searchButton = new Button("Search"); 

     searchResults = new Label(); 

     VBox layout = new VBox(
       20, 
       new HBox(
         10, 
         textField, 
         searchButton 
       ), 
       searchResults 
     ); 
     layout.setPadding(new Insets(10)); 

     searchButton.setOnAction(event -> 
       searchResults.setText(
         "Search result for " + textField.getText() 
       ) 
     ); 

     getChildren().setAll(
       layout 
     ); 
    } 
} 

元器件的先決

爲了該過程工作,有幾件事情需要確保:

  1. 您的組件類擴展了Node。
  2. 你的組件類有一個沒有參數的構造函數。
  3. 您的組件類和無參數構造函數是公共的。
  4. 您的組件類位於一個包中(例如org.jewelsea) - 它不能包含任何包。
  5. 您的組件類打包在已導入到SceneBuilder中的JAR文件中,如上所述。

故障排除

如果您在導入JAR,你已經嘗試了JAR導入後,您可以使用下面介紹的JAR分析功能,以幫助排除故障(這可能有助於或可能只是提供問題一些神祕的信息讓你更加困惑)。

jar file analysis

+0

感謝您的回答。我沒有將eclipse項目導出到jar文件中。但場景構建器沒有檢測到任何組件?該java文件需要任何額外的信息?或遵循一個結構? – ben 2015-04-04 10:05:43

+1

哦,我的上帝!感謝所有這些!我喜歡它 !真的感謝 !我會重做我的組件:D謝謝 – ben 2015-04-04 21:13:02

相關問題