GVKun编程网logo

javafx-2 – 如何在controller-class中的javafx应用程序中交换屏幕?(javafx界面切换)

15

对于想了解javafx-2–如何在controller-class中的javafx应用程序中交换屏幕?的读者,本文将是一篇不可错过的文章,我们将详细介绍javafx界面切换,并且为您提供关于bindi

对于想了解javafx-2 – 如何在controller-class中的javafx应用程序中交换屏幕?的读者,本文将是一篇不可错过的文章,我们将详细介绍javafx界面切换,并且为您提供关于binding – javafx将fx:id传递给fxml onAction方法中的controller或parameter、Controller.java文件中的Javafx 2.0 How-to Application.getParameters()、ControlsFX 8.0 发布,JavaFX 的 UI 控件集、Java vs JavaFX Script vs FXML.哪种更好的JavaFX编程方式?的有价值信息。

本文目录一览:

javafx-2 – 如何在controller-class中的javafx应用程序中交换屏幕?(javafx界面切换)

javafx-2 – 如何在controller-class中的javafx应用程序中交换屏幕?(javafx界面切换)

嘿,我搜索了一段时间,但我找不到解决以下问题的方法:

在javafx中有3个基本文件;控制器类,fxml文件和应用程序类.现在我想在控制器中做出一个按钮点击(其工作得很好)并更改该点击屏幕(通常使用stage.setScreen()),但我没有参考舞台(你可以在应用程序类中找到).

应用程序示例:

public class JavaFXApplication4 extends Application {

@Override
public void start(Stage stage) throws Exception {
    Parent root = FXMLLoader.load(getClass().getResource("Sample.fxml"));

    Scene scene = new Scene(root);

    stage.setScene(scene);
    stage.show();
}

/**
 * The main() method is ignored in correctly deployed JavaFX application.
 * main() serves only as fallback in case the application can not be
 * launched through deployment artifacts,e.g.,in IDEs with limited FX
 * support. NetBeans ignores main().
 *
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}
}

FXML-样品:

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane id="AnchorPane" prefheight="200.0" prefWidth="320.0"  xmlns:fx="http://javafx.com/fxml" fx:controller="javafxapplication4.SampleController">
  <children>
  <Button id="button" fx:id="nextScreen" layoutX="126.0" layoutY="90.0" onAction="#handleButtonAction" text="Next Screen" />
  <Label fx:id="label" layoutX="126.0" layoutY="120.0" minHeight="16.0" minWidth="69.0" />
  </children>
</AnchorPane>

控制器 – 示例:

public class SampleController implements Initializable {

@FXML
private Label label;

@FXML
private void handleButtonAction(ActionEvent event) {
    System.out.println("You clicked me!");
    label.setText("Hello World!");
    //Here I want to swap the screen!
}

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

我会感谢任何一种帮助.

解决方法

@FXML
private void handleButtonAction(ActionEvent event) {
    System.out.println("You clicked me!");
    label.setText("Hello World!");
    //Here I want to swap the screen!

    Stage stageTheEventSourceNodeBelongs = (Stage) ((Node)event.getSource()).getScene().getwindow();
    // OR
    Stage stageTheLabelBelongs = (Stage) label.getScene().getwindow();
    // these two of them return the same stage
    // Swap screen
    stage.setScene(new Scene(new Pane()));
}

binding – javafx将fx:id传递给fxml onAction方法中的controller或parameter

binding – javafx将fx:id传递给fxml onAction方法中的controller或parameter

有没有办法将参数传递给fxml文件中的onAction方法?或者,我可以以某种方式获取调用onAction方法的组件的fx:id吗?

我有几个按钮应该做同样的事情,比如5个带有ids button1的按钮 – 按钮5,当按下时,应该打印相应的数字1-5.我不希望有5个与此变量相同的onAction方法.

任何帮助,赞赏,

解决方法

只调用一个处理程序,actionEvent.source是发起事件的对象.

试试这个:

myButton1.setonAction(new MyButtonHandler());
myButton2.setonAction(new MyButtonHandler());

private class MyButtonHandler implements EventHandler<ActionEvent>{
    @Override
    public void handle(ActionEvent evt) {
        if (evt.getSource().equals(myButton1)) {
          //do something
        } else if (evt.getSource().equals(myButton2)) {
          //do something
        }
    }
}

要么:

myButton1.addEventHandler(ActionEvent.ACTION,new MyButtonHandler());
myButton2.addEventHandler(MouseEvent.CLICKED,new MyButtonHandler());

private class MyButtonHandler implements EventHandler<Event>{
    @Override
    public void handle(Event evt) {
        if (evt.getSource().equals(myButton1)) {
          //do something
        } else if (evt.getSource().equals(myButton2)) {
          //do something
        }
    }
}

Controller.java文件中的Javafx 2.0 How-to Application.getParameters()

Controller.java文件中的Javafx 2.0 How-to Application.getParameters()

考虑以下示例。

如何在控制器中访问应用程序的参数/参数?

谢谢。


注意:我试图仅在一个Class文件中混合App.java和MyController.java,但没有帮助。


App.java(简体):

public class App extends Application {    public static void main(String[] args) {        Application.launch(App.class, args);    }    @Override    public void start(Stage primaryStage) throws Exception {        // output arguments in console        System.out.println(getParameters().getNamed().toString());        Parent root = FXMLLoader.load(getClass().getResource("MyView.fxml"));        final Scene scene = new javafx.scene.Scene(root);        primaryStage.setScene(scene);        primaryStage.show();    }}

MyController.java(简体):

public class MyController implements Initializable {    @Override    public void initialize(URL url, ResourceBundle rb) {        // HOW TO getParameters() HERE ?    }    @FXML    private Button myButton;    @FXML    private void my_Action(ActionEvent event) {        // HOW TO getParameters() HERE ?    }}

MyView.fxml(简体):

<AnchorPane fx:id="root" fx:controller="mainpackage.MyController">    <children>        <Button fx:id="myButton" onAction="#my_Action" text="Start" />    </children></AnchorPane>

答案1

小编典典

1. 最直接的方法-将它们保存在应用中:

public class App extends Application {  public static void main(String[] args) { launch(); }  public static String parameters;  @Override  public void start(Stage primaryStage) throws Exception {    parameters = getParameters().getNamed().toString();    Parent root = FXMLLoader.load(getClass().getResource("MyView.fxml"));    final Scene scene = new javafx.scene.Scene(root);    primaryStage.setScene(scene);    primaryStage.show();  }}

并在控制器中读取它们:

public class MyController implements Initializable {  @Override  public void initialize(URL url, ResourceBundle rb) {     System.out.println(App.parameters);  }

2. 下一个主题将介绍更复杂(但总体上更好)的方法:

  • 传递参数JavaFX FXML

ControlsFX 8.0 发布,JavaFX 的 UI 控件集

ControlsFX 8.0 发布,JavaFX 的 UI 控件集

ControlsFX 8.0 发布了,ControlsFX 主要针对JavaFX 8.0(捆绑在JDK 8中),考虑到JavaFX中已经包含了一些控件,ControlsFX只会包含新的控件和功能,并且还有一个完善的javadoc文档。

该版本主要是功能改进和bug修复,

包括:

  • 支持“Command Links”对话框。

  • 新增Actions API,可与dialogs API和ButtonBar API结合使用。
  • 文档的大幅改善,提供在线阅读。
  • 更新了 SegmentedButton 控件的样式
  • 完善 ControlsFX 示例应用

详情请看官方发行说明:
http://fxexperience.com/2013/06/announcing-controlsfx-8-0-0-final/

Java vs JavaFX Script vs FXML.哪种更好的JavaFX编程方式?

Java vs JavaFX Script vs FXML.哪种更好的JavaFX编程方式?

我是 JavaFX的新手,我在 JavaFX中遇到了2-3种设计UI的方法.

>简单的Java文件,与我们在Swing中使用的方法相同
>我不知道的JavaFX脚本
> FXML是基于xml的UI设计文件

哪个更好?为什么?

解决方法

只是为了说明一点,在javafx 2.0之前使用了javafx脚本并且不再使用了!

>如果您更熟悉java中的编码UI,则可以使用此方法.但是,我个人不喜欢这种方法,因为当你的应用程序过于复杂时,它会使代码变得复杂.
> JavaFX Script在JavaFX 2.0之前使用,不再使用
>在Javafx 2.0中引入了基于FXML的UI设计.这些帮助程序员使用MVC方法对javafx应用程序进行编码.可以找到一个非常好的FXML介绍here.

来自Oracle docs的一节,Why Use FXML

From a Model View Controller (MVC) perspective,the FXML file that contains the description of the user interface is the view. The controller is a Java class,optionally implementing the Initializable class,which is declared as the controller for the FXML file. The model consists of domain objects,defined on the Java side,that you connect to the view through the controller.

FXML可以使用Scene Builder轻松设计,Scene Builder是javafx应用程序的Drag n Drop UI设计器.使用FXML具有以下优点:

>您的应用程序遵循MVC结构,就像企业JavaEE应用程序一样.
>表示层(UI)与应用层(逻辑)隔离,这样可以在需要时轻松更改应用程序的外观,就像网站一样!
> FXML为您的应用程序带来了可扩展性和可维护性.

我对你的建议是使用FXML.如果您不了解它们,请了解它们.这将是值得的!

今天关于javafx-2 – 如何在controller-class中的javafx应用程序中交换屏幕?javafx界面切换的介绍到此结束,谢谢您的阅读,有关binding – javafx将fx:id传递给fxml onAction方法中的controller或parameter、Controller.java文件中的Javafx 2.0 How-to Application.getParameters()、ControlsFX 8.0 发布,JavaFX 的 UI 控件集、Java vs JavaFX Script vs FXML.哪种更好的JavaFX编程方式?等更多相关知识的信息可以在本站进行查询。

本文标签: