2016-07-14 15 views
0

Ich benutze Szene-Generator, um ein Layout zu erstellen, nach dem Export der fxml ich in TextPad importiert wurde, das Layout wurde erfolgreich importiert, aber ich kann nicht mit den Elementen durch die ID (wenn das ist, wie es funktioniert). Meine Frage ist, wie man mit den Dingen umgeht, die ich hinzugefügt habe.javafx: Wie behandelt man Artikel (Textfelder, Etiketten usw.)?

import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 
import javafx.scene.Parent; 
import javafx.fxml.FXMLLoader; 

public class test2fx extends Application{ 


     public static void main(String[] args){ 

      Application.launch(args); 
     } 
     public void init(){ 
     } 

     @Override 
     public void start(Stage stage) throws Exception { 

     Parent root = FXMLLoader.load(getClass().getResource("fxlayout.fxml")); 
     Scene scene = new Scene(root, 300, 275); 
     stage.setTitle("FXML Welcome"); 
     stage.setScene(scene); 

     stage.show(); 

     } 
     public void stop(){ 
      System.exit(0); 
    } 

fxml Dateiinhalt:

<?xml version="1.0" encoding="UTF-8"?> 
<?import javafx.scene.control.Button?> 
<?import javafx.scene.control.Label?> 
<?import javafx.scene.control.TextField?> 
<?import javafx.scene.layout.Pane?> 
<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="284.0" prefWidth="314.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1"> 
    <children> 
     <Button layoutX="31.0" layoutY="252.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="50.0" text="Jogar" /> 
     <Button layoutX="124.0" layoutY="252.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="50.0" text="Novo" /> 
     <Button layoutX="219.0" layoutY="252.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="50.0" text="Sair" /> 
     <TextField id="tf1" disable="true" layoutX="150.0" layoutY="60.0" /> 
     <TextField id="tf1" disable="true" layoutX="150.0" layoutY="100.0" /> 
     <TextField id="tf3" layoutX="150.0" layoutY="140.0" /> 
     <TextField id="tf4" disable="true" layoutX="150.0" layoutY="180.0" /> 
     <Label id="lb1" layoutX="38.0" layoutY="60.0" prefHeight="22.0" prefWidth="59.0" text="Inicio" /> 
     <Label id="lb2" layoutX="38.0" layoutY="100.0" prefHeight="22.0" prefWidth="59.0" text="Fim" /> 
     <Label id="lb3" layoutX="38.0" layoutY="139.0" prefHeight="22.0" prefWidth="59.0" text="Palpite" /> 
     <Label id="lb4" layoutX="38.0" layoutY="180.0" prefHeight="22.0" prefWidth="59.0" text="Inicio" /> 
    </children> 
</Pane> 
+1

Verwenden 'fx: id' und eine [Controller-Klasse] (http://docs.oracle.com/javase/8/javafx/api/ javafx/fxml/doc-dateien/einführung_zu_fxml.html # controllers) –

+0

Wenn Sie ID in der fxml hinzufügen und SceneBuilder verwenden, gehen Sie zur Menüleiste, klicken Sie auf (Ansicht) Menü und dann auf (View Sample Controller) kopieren Sie den Code und hinter es auf Ihrer Java-Controller-Klasse.Viel nützlich wenn mit fx: id. – GOXR3PLUS

Antwort

0

Wie @James_D gesagt, Sie höchstwahrscheinlich wollen:

  1. Ein Verweis auf das Element in Ihrem FXMl Sie zugreifen möchten.
  2. Eine Controller-Klasse für Ihre FXML.

Beispiel:

/* 
* Dean2191 Stackoverflow example 
*/ 
package javafxapplication6; 

import java.net.URL; 
import java.util.ResourceBundle; 
import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.Label; 
import javafx.scene.control.TextField; 

/** 
* 
* @author dean2191 
*/ 
public class FXMLDocumentController implements Initializable { 

    @FXML 
    private Label label; 

    @FXML 
    private TextField tf1; // value will be injected by the FXMLLoader 

    @FXML 
    private void handleButtonAction(ActionEvent event) { 
     System.out.println("You clicked me!"); 
     label.setText("Hello World!"); 
    } 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     // TODO 
    } 

} 

Überprüfen Sie die Oracle-Beispiele here und beachten Sie auch, dass die NetBeans IDE eine Standard-Controller-Klasse erzeugt, wie oben jedoch gezeigt, wenn ein neues Element in Szene Builder hinzugefügt wird Sie jeder sollte hinzufügen @ Die FXML-Annotation für die Variable, auf die Sie zugreifen möchten, und der Szenenersteller/Netbeans verfügen über Synchronisierungsfunktionen, um zu sehen, auf welche Elemente in Ihrem Code verwiesen wird.

Synchronisieren mit dem Controller Quellcode Die NetBeans IDE Stellen Controller-Funktion können Sie die Änderungen synchronisieren Sie in der FXML Datei machen , die zur Zeit in Szene Builder und den Controller Quellcode geöffnet in NetBeans IDE geöffnet wird. Führen Sie die folgenden Schritte aus, um diese Funktion zu veranschaulichen:

Ziehen Sie im Szenen-Generator ein Button-Steuerelement aus dem Bedienfeld Bibliothek in das Bedienfeld . Weisen Sie im Bedienfeld "Code" einen neuen Wert für das neue Feld "fx: id" der Schaltfläche und einen neuen Methodennamen für die Methode "onAction" zu. Wählen Sie Datei im Hauptmenü und dann Speichern. Klicken Sie in NetBeans IDE 7.4 oder später mit der rechten Maustaste auf den Projektknoten für die FXML-Datei, die Sie nur bearbeitet haben, und wählen Sie Bearbeiten aus dem Kontextmenü. Wählen Sie im Hauptmenü Quelle und dann Controller. Die private Variable @FXML und Die neue onAction-Methode für die Schaltfläche, die Sie gerade im Szenengenerator hinzugefügt haben, wird in der Quelldatei des Controllers erstellt. Verwenden Sie den Befehl Make Controller , wenn Sie ein Element in der Systemsteuerung löschen oder einen fx: id-Wert oder einen Methodennamen in Scene Builder aktualisieren.

Source

Beachten Sie auch, sollten Sie in Ihrem FXMl überprüfen für diese Linie:

fx:controller="yourNamespace.fxlayout" 

Als Ihr Controller-Klasse in der FXML angegeben irgendwo werden muss. Ihr Controller wird dann in Ihrem Beispielcode so etwas wie fxlayout.java heißen. Dies kann eingestellt werden/modifizierte Szene Builder verwenden zu:

enter image description here