Как включить функции сцены JavaFX в public static void main

Я хотел бы знать, есть ли возможность включить функции сцены JavaFX в

public static void main (String args[]) {
    …
}

Внутри public static void main находится launch(args); программа helloworld.java JavaFX выглядит следующим образом:

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import static javafx.geometry.HPos.RIGHT;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class Login extends Application {

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("JavaFX Welcome");
        GridPane grid = new GridPane();
        grid.setAlignment(Pos.CENTER);
        grid.setHgap(10);
        grid.setVgap(10);
        grid.setPadding(new Insets(25, 25, 25, 25));


        Text scenetitle = new Text("Welcome");
        scenetitle.setId("welcome-text");
     //   scenetitle.setFont(Font.font("Tahoma", FontWeight.NORMAL, 20));
        grid.add(scenetitle, 0, 0, 2, 1);

        Label userName = new Label("User Name:");
        grid.add(userName, 0, 1);

        TextField userTextField = new TextField();
        grid.add(userTextField, 1, 1);

        Label pw = new Label("Password:");
        grid.add(pw, 0, 2);

        PasswordField pwBox = new PasswordField();
        grid.add(pwBox, 1, 2);

        Button btn = new Button("Sign in");
        HBox hbBtn = new HBox(10);
        hbBtn.setAlignment(Pos.BOTTOM_RIGHT);
        hbBtn.getChildren().add(btn);
        grid.add(hbBtn, 1, 4);

        final Text actiontarget = new Text();
        grid.add(actiontarget, 0, 6);
        grid.setColumnSpan(actiontarget, 2);
        grid.setHalignment(actiontarget, RIGHT);
        actiontarget.setId("actiontarget");

        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent e) {
               // actiontarget.setFill(Color.FIREBRICK);
                actiontarget.setId("actiontarget");
                actiontarget.setText("Sign in button pressed");
            }
        });

        Scene scene = new Scene(grid, 300, 275);
        primaryStage.setScene(scene);

        scene.getStylesheets().add(
            Login.class.getResource("Login.css").toExternalForm());
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Я хотел бы использовать всю программу внутри static void main, как в java Swing, как в следующей программе:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;


public class combotable {
static JFrame frame = new JFrame();
static JButton boton_nuevo=new JButton("nuevo");

public static void main(String[] args){


frame.setSize(400,400);


String[] petStrings={"Bird", "Cat", "Dog", "Rabbit", "Pig"};
//JComboBox comboBox = new JComboBox(petStrings);

JComboBox<String> combo = new JComboBox<>(petStrings);
combo.setSelectedIndex(4);
//comboBox.setSelectedIndex(4);

frame.add(combo, BorderLayout.PAGE_START);

frame.add (boton_nuevo);

boton_nuevo.addActionListener( new ActionListener()
{

 public void actionPerformed(ActionEvent e) 
        {
         String s = (String) combo.getSelectedItem();
          if (s == "Bird")
                         {
                       System.out.println("Se selecciono Bird");
                          }

           if (s== "Cat")
                         {
                       System.out.println("Se selecciono Cat");
                          }
            if (s== "Dog")
                         {
                       System.out.println("Se selecciono Dog");
                          }

            if (s== "Rabbit")
                         {
                       System.out.println("Se selecciono Rabbit");
                          }
               if (s== "Pig")
                         {
                       System.out.println("Se selecciono Pig");
                          }
         }

}
);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);


}

}

Есть ли шанс сделать это? Любая помощь приветствуется.


person Omar Elio Torres Castillo    schedule 28.08.2015    source источник


Ответы (1)


Нет. Ваш пример Swing неправильно синхронизирован в том смысле, что объекты Swing GUI должны создаваться и управляться только на поток отправки событий. Ваш JavaFX Application правильно синхронизирован в этом " модификация операций графа сцены для живых объектов (объектов, уже прикрепленных к сцене) должна выполняться на поток приложений JavaFX." Вы можете переопределить init(), чтобы выполнить другую инициализацию или создать объекты JavaFX, отличные от Scene или Stage.

person trashgod    schedule 28.08.2015
comment
Добро пожаловать, но мне любопытно, что вы хотите сделать в этом контексте. - person trashgod; 29.08.2015
comment
Я работал с Java-программами со всем своим кодом внутри public static void main (String args[]) {…} это просто стиль программирования, теперь я планирую перейти на JavaFX, а внутри JavaFX есть только public static void main (String[] аргументы) { запуск(аргументы); } }, я не хочу использовать launch(args) вместо всей программы, но похоже, что другого способа работы с JavaFX нет - person Omar Elio Torres Castillo; 31.08.2015
comment
То же самое для свинга; при отсутствии использования правильного потока программа может позже завершиться недетерминированным сбоем. - person trashgod; 31.08.2015
comment
Спасибо за ответ - person Omar Elio Torres Castillo; 02.09.2015