2015-09-30 11 views
7

Ho un file FXML con pulsanti con attributi onMouseClicked. Non ho impostato un controller su FXML perché ho dati iniettati dal costruttore che voglio fornire al controller."Nessun controller specificato per l'elemento di livello superiore" quando si imposta programmaticamente un controller

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

Sto impostando il controller in modo programmatico e il mio controller contiene i metodi specificati in FXML. Le funzioni del controller vengono eseguite e tutto funziona correttamente.

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

Il mio problema si trova nell'ispezione IntelliJ dei file .fxml. Ad ogni occorrenza del riferimento alla funzione, viene segnalato "Errore: (45, 54) Nessun controller specificato per l'elemento di livello superiore". Sto osservando le regole di ispezione di IntelliJ e non vedo questa regola nella sezione JavaFX. Ancora una volta, il programma costruisce e gira bene, quindi non è un vero errore di compilazione. Voglio disabilitare questa notifica di errore.

Come posso evitare questo errore?

risposta

2

È necessario aggiungere elemento di livello superiore fx: controller.

Diciamo che si dispone di un file fxml di base con un solo riquadro di ancoraggio con un pulsante come il fxml sottostante.

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

In questo caso, il tuo elemento di livello superiore sarà il riquadro di ancoraggio. Se si desidera utilizzare pulsanti di azione come onMouseClicked, è necessario comunicare a fxml la classe del controller nel proprio elemento di livello superiore (in questo caso il riquadro di ancoraggio) come di seguito.

<?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" riga dice che la mia classe di controllo è controller che è nel pacchetto com.example.

Anche i tuoi elementi ID devono iniziare con fx come nell'esempio (fx:id="buttonExample").

+1

se si specifica quel controllore, quando si tenta di raggiungere campi di testo, i pulsanti nella classe controller otterranno un'eccezione nullpointer. –

1

Anche, non mi piacciono quelle notifiche. Ho impostato i controller in modo programmatico. Per disabilitarlo, è necessario impostare il livello di evidenziazione su none. Per fare ciò, apri il tuo file fxml e in fondo sul lato destro, vedrai un'icona hector. Fai clic sull'icona di hector e imposta il livello di evidenziazione su none trascinando il cursore.

Sarà necessario riavviare l'IDE affinché le modifiche abbiano effetto. L'evidenziazione sarà impostata su none solo per quel file. Gli altri file non vedranno alcun cambiamento nel loro comportamento di evidenziazione finché non avremo impostato nuovamente il livello di evidenziazione su none.

Utilizzare il seguente collegamento se non si è in grado di trovare l'icona di hector. https://www.jetbrains.com/help/idea/status-bar.html

Problemi correlati