Как да включите сценични функции на JavaFX в публичен 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 е неправилно синхронизиран, тъй като GUI обектите на Swing трябва да се конструират и манипулират само на нишка за изпращане на събитие. Вашият 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 (Низ [] аргументи) { стартиране (аргументи); } }, не искам да използвам launch(args) вместо цялата програма, но изглежда, че няма друг начин за работа с JavaFX - person Omar Elio Torres Castillo; 31.08.2015
comment
Същото за Swing; липсва, използвайки правилната нишка, програмата може по-късно да се провали по недетерминиран начин. - person trashgod; 31.08.2015
comment
Благодаря ви за отговора - person Omar Elio Torres Castillo; 02.09.2015