2015-09-30 16 views
7

Tôi có một tệp FXML có các nút có thuộc tính onMouseClicked. Tôi không thiết lập một bộ điều khiển trong FXML vì tôi có dữ liệu được xây dựng đã được chèn vào bộ điều khiển mà tôi muốn cung cấp cho Bộ điều khiển."Không có bộ điều khiển nào được chỉ định cho phần tử cấp cao nhất" khi lập trình thiết lập Bộ điều khiển

<Button mnemonicParsing="false" onMouseClicked="#newWidgetRequestButtonClicked" text="New Widget..." /> 

Tôi đang đặt Trình điều khiển theo chương trình và bộ điều khiển của tôi chứa các phương pháp được chỉ định trong FXML. Các chức năng điều khiển thực thi, và mọi thứ hoạt động tốt.

FXMLLoader loader = new FXMLLoader(getClass().getResource("MainView.fxml")); 
MyController controller = new MyController(...); 
loader.setController(controller); 

Vấn đề của tôi nằm trong việc kiểm tra tệp .fxml của IntelliJ. Trên mỗi lần xuất hiện của tham chiếu hàm, nó báo cáo "Lỗi: (45, 54) Không có bộ điều khiển nào được chỉ định cho phần tử cấp cao nhất". Tôi đang xem xét các quy tắc kiểm tra của IntelliJ và không thấy quy tắc này trong phần JavaFX. Một lần nữa, chương trình xây dựng và chạy tốt, vì vậy nó không phải là một lỗi biên dịch thực sự. Tôi muốn vô hiệu hóa thông báo lỗi này.

Làm cách nào để tránh lỗi này?

Trả lời

2

Bạn cần thêm phần tử cấp cao nhất fx: controller.

Cho phép nói rằng bạn có tệp fxml cơ bản với ngăn chỉ neo bằng nút giống như fxml bên dưới.

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

<?import javafx.scene.control.*?> 
<?import java.lang.*?> 
<?import javafx.scene.layout.*?> 


<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"> 
    <children> 
     <Button layoutX="102.0" layoutY="50.0" mnemonicParsing="false" text="Button" /> 
    </children> 
</AnchorPane> 

Phần tử cấp cao nhất của bạn sẽ là ngăn neo trong trường hợp này. Nếu bạn muốn sử dụng các nút hành động như onMouseClicked, bạn cần phải nói với lớp điều khiển fxml bạn trong phần tử cấp cao nhất của bạn (trong trường hợp này là ngăn neo) như dưới đây.

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

<?import javafx.scene.control.*?> 
<?import java.lang.*?> 
<?import javafx.scene.layout.*?> 


<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.Controller"> 
    <children> 
     <Button fx:id="buttonExample" layoutX="102.0" layoutY="50.0" mnemonicParsing="false" text="Button" /> 
    </children> 
</AnchorPane> 

fx:controller="com.example.Controller" dòng nói rằng lớp kiểm soát của tôi là khiển mà là trong com.example gói.

Ngoài ra, id phần tử của bạn sẽ bắt đầu bằng fx như trong ví dụ (fx:id="buttonExample").

+1

nếu bạn xác định trình điều khiển đó, khi bạn cố gắng tiếp cận các trường văn bản, các nút trong lớp điều khiển của bạn, bạn sẽ nhận được ngoại lệ nullpointer. –

1

Thậm chí, tôi không thích các thông báo đó. Tôi đặt các bộ điều khiển theo chương trình. Để tắt tính năng này, bạn cần đặt mức độ đánh dấu là không. Để thực hiện việc này, mở tệp fxml của bạn và ở phía dưới cùng bên phải, bạn sẽ thấy biểu tượng hector. Nhấp vào biểu tượng hector và đặt mức độ đánh dấu thành không bằng cách kéo thanh trượt.

Bạn sẽ cần phải khởi động lại IDE để các thay đổi có hiệu lực. Đánh dấu sẽ không được đặt thành chỉ cho tệp đó. Các tệp khác sẽ không thấy bất kỳ thay đổi nào trong hành vi làm nổi bật của chúng cho đến khi chúng tôi đặt lại mức độ nổi bật của chúng thành không.

Sử dụng liên kết sau, nếu bạn không thể tìm thấy biểu tượng hector. https://www.jetbrains.com/help/idea/status-bar.html

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