2015-04-04 17 views
6

Tôi mới sử dụng javaFX. Tôi tạo ra một hộp Tìm kiếm tùy chỉnh (mở rộng TextField) trong java, rà soát hình ảnh:Làm thế nào để tạo một tệp FXML cho một thành phần mới đã được tạo trong java hơn là thêm nó vào trình tạo cảnh?

enter image description here

Tôi đã thử nghiệm nó với một lớp thử nghiệm và nó làm việc.

Tôi muốn biết bây giờ nếu có thể tạo tệp FXML của nó hơn là thêm thành phần này vào trình tạo cảnh không? làm thế nào để làm nó ? Cảm ơn trước.

Trả lời

12

Làm thế nào để nhập khẩu một phần từ một JAR vào SceneBuilder

Bạn có thể đặt thành phần của bạn trong một Jar và nhập nó vào SceneBuilder. Bạn không cần tạo một tệp FXML cho thành phần của mình để thêm nó vào Bảng điều khiển Thư viện SceneBuilder.

Xem phần Adding Custom Components to the Library của hướng dẫn sử dụng JavaFX.

Để nhập các thành phần GUI tùy chỉnh từ một JAR hoặc FXML file:

  1. Chọn nhập JAR/FXML lệnh tập tin từ menu Library panel, hoặc kéo JAR hoặc tập tin FXML trực tiếp từ tệp gốc của hệ thống của bạn người quản lý (Trình khám phá hoặc Trình tìm kiếm) và thả nó vào bảng điều khiển Thư viện

  2. Trong cửa sổ hộp thoại Mở, điều hướng đến vị trí của tệp JAR hoặc FXML mà bạn muốn nhập. Hộp thoại nhập khẩu, tương tự như được hiển thị trong Figure 8-4, được hiển thị. Nội dung của tệp JAR là được kiểm tra và tất cả các lớp Java được xác định là các thành phần tùy chỉnh phù hợp được hiển thị trong cửa sổ hộp thoại. Nội dung của tệp FXML được phân tích cú pháp để đảm bảo rằng thành phần được thêm là hợp lệ và độc lập.

  3. Từ cửa sổ hộp thoại Nhập, chọn hoặc bỏ chọn các mục từ danh sách của các mục mà bạn có thể nhập.

  4. Nhấp vào Thành phần nhập. Các mục nhập khẩu được thêm vào phần Tuỳ chỉnh của bảng điều khiển Thư viện. Chúng có thể được sử dụng ngay lập tức và họ tồn tại trong thư viện ngay cả sau khi Cảnh Builder được khởi động lại

Note, SceneBuilder cũng hỗ trợ nhập khẩu các linh kiện FXML dựa chứ không chỉ các thành phần đang thẳng. Câu trả lời này chỉ thảo luận về việc nhập mã chỉ các thành phần không chứa FXML.

Sample nhập khẩu phần Cách sử dụng

Dưới đây là một thành phần lĩnh vực tìm kiếm tùy chỉnh mà tôi nhập khẩu vào SceneBuilder sử dụng phương pháp nêu trên.

search sample

Bảng tìm kiếm hàng đầu là trong cửa sổ thiết kế Scene Builder, bảng điều khiển tìm kiếm dưới cùng là kết quả của việc sử dụng chức năng xem trước Scene Builder và tìm kiếm hạnh phúc.

mẫu SceneBuilder tạo Mã

File fxml được tạo ra bởi SceneBuilder dựa trên thiết kế được đưa vào đây. Lưu ý, đây chỉ là một cảnh thử nghiệm mà tôi đã tạo với SceneBuilder để kiểm tra thành phần đã được nhập - nó không phải là một phần của quá trình nhập thành phần.

<?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> 

mẫu (có thể nhập cảng) Mã Component

Mã cho hộp tìm kiếm được nhập khẩu là:

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

Component Pre-kiện tiên quyết

Để cho quy trình hoạt động, có một vài điều bạn cần đảm bảo:

  1. Lớp thành phần của bạn mở rộng Nút.
  2. Lớp thành phần của bạn không có hàm tạo đối số.
  3. Lớp thành phần của bạn và không có hàm tạo đối số nào là công khai.
  4. Lớp thành phần của bạn nằm trong gói (ví dụ: org.jewelsea) - nó không thể không có gói.
  5. Lớp thành phần của bạn được đóng gói trong tệp JAR đã được nhập vào SceneBuilder như được mô tả ở trên.

đáp thắc mắc

Nếu bạn đang gặp vấn đề nhập khẩu JAR, sau khi bạn đã cố gắng một khẩu JAR, bạn có thể sử dụng chức năng phân tích JAR tài liệu dưới đây để giúp khắc phục sự cố (mà có thể giúp đỡ hoặc chỉ có thể cung cấp một số thông tin khó hiểu để gây nhầm lẫn cho bạn nhiều hơn).

jar file analysis

+0

Cảm ơn câu trả lời của bạn. Tôi đã xuất dự án eclipse vào một tệp jar. nhưng nhà xây dựng cảnh không phát hiện bất kỳ thành phần nào? hiện các tập tin java cần bất kỳ thông tin bổ sung? hoặc theo một cấu trúc? – ben

+1

OH MY GOD! CẢM ƠN CHO TẤT CẢ NÀY! TÔI THÍCH NÓ ! Rất cảm ơn ! tôi sẽ làm lại các thành phần của tôi: D cảm ơn – ben

Các vấn đề liên quan