In der Regel haben Sie eine Hauptklasse, die gerade GUI startet. Der View-Teil von dir MVC wird von einer XML-Datei (genannt FXML) gehandhabt. Diese FXML ist mit einer Controller-Klasse verbunden. JavaFX ermöglicht es Ihnen auch, alle GUI-Komponenten direkt in eine geeignete Variable innerhalb des Controllers zu injizieren, so dass Sie sie nicht suchen müssen. Der einfachste Weg, ein Beispielprojekt zu erhalten, ist mit maven archetypes for JavaFX:
mvn archetype:generate -DarchetypeGroupId=com.zenjava -DarchetypeArtifactId=javafx-basic-archetype
Gehen Sie einfach auf ein Verzeichnis, in dem Sie projizieren sollte eine Art der obige Befehl sein. Es erzeugt dann direkt ein Beispielprojekt für Sie. Also lassen Sie uns mit der Hauptklasse beginnen
public class MainApp extends Application {
private static final Logger log = LoggerFactory.getLogger(MainApp.class);
public static void main(String[] args) throws Exception {
launch(args);
}
public void start(Stage stage) throws Exception {
log.info("Starting Hello JavaFX and Maven demonstration application");
String fxmlFile = "/fxml/hello.fxml";
log.debug("Loading FXML for main view from: {}", fxmlFile);
FXMLLoader loader = new FXMLLoader();
Parent rootNode = (Parent) loader.load(getClass().getResourceAsStream(fxmlFile));
log.debug("Showing JFX scene");
Scene scene = new Scene(rootNode, 400, 200);
scene.getStylesheets().add("/styles/styles.css");
stage.setTitle("Hello JavaFX and Maven");
stage.setScene(scene);
stage.show();
}
}
Wie Sie sehen können, lädt nur die FXMl und zeigt das Hauptfenster an. Die FXML gibt die visuelle Struktur der GUI (Labels, Textfelder, Bilder, Buttons Bildlaufleisten usw.)
<MigPane id="rootPane" fx:controller="example.HelloController" styleClass="main-panel" layout="insets 20" cols="[label, pref!][grow, 50::]" rows="" xmlns:fx="http://javafx.com/fxml">
<Label text="First Name:" />
<TextField fx:id="firstNameField" prefColumnCount="30" MigPane.cc="growx, wrap" />
<Label text="Last Name:" /> <TextField fx:id="lastNameField" prefColumnCount="30" MigPane.cc="growx, wrap" />
<Button text="Say Hello" onAction="#sayHello" MigPane.cc="skip, gap :push, gaptop 15, wrap" />
<Label fx:id="messageLabel" styleClass="hello-message" MigPane.cc="span, growx, gaptop 15" />
</MigPane >
Die Steuerung, die verwendet wird, um die GUI von seiner Logik zu trennen ist int der FXML angegeben und die fx:id
verwendet das Element direkt in die korrekte Variable einspritzt innerhalb des Controllers
public class HelloController
{
private static final Logger log = LoggerFactory.getLogger(HelloController.class);
@FXML private TextField firstNameField;
@FXML private TextField lastNameField;
@FXML private Label messageLabel;
public void sayHello() {
String firstName = firstNameField.getText();
String lastName = lastNameField.getText();
StringBuilder builder = new StringBuilder();
if (!StringUtils.isEmpty(firstName)) {
builder.append(firstName);
}
if (!StringUtils.isEmpty(lastName)) {
if (builder.length() > 0) {
builder.append(" ");
}
builder.append(lastName);
}
if (builder.length() > 0) {
String name = builder.toString();
log.debug("Saying hello to " + name);
messageLabel.setText("Hello " + name);
} else {
log.debug("Neither first name nor last name was set, saying hello to anonymous person");
messageLabel.setText("Hello mysterious person");
}
}
}
der Controller verfügt über Felder mit einem @FXML
Annotation diejenigen sind GUI-Elemente injiziert. Wie Sie können der Name der Variablen ist gleich fx:id
Dies ist notwendig, damit JavaFX die Elemente injiziert. Für die Erstellung der FXML können Sie die Oracle Scene Builder oder die auf Gluon beide sind sehr einfach zu bedienen und können Sie schnell eine schön aussehende GUI erstellen.
Sehen Sie, wenn http://stackoverflow.com/questions/32464698/java-how-do-i-start-a-standalone-application-from-the-current-one-when-both-are hilft –
Ich denke, die Frage ist: "Was verhindert, dass Sie genau die gleiche Struktur in JavaFX verwenden?". Die 'start (...)' Methode ersetzt die 'main (...)' Methode, 'Stage' ersetzt' JFrame' usw. –