在Java(FX)类中共享对象

时间:2017-10-17 02:23:28

标签: java javafx

好的,大家好,希望你能过得愉快。

所以我对Java很陌生,但我知道大部分基础知识,所以至少不是精湛的 noob;我正在开发一个JavaFX示例应用程序,仅用于测试。 所以我遇到了一个问题,我有一个主class我已经在其中创建了界面,非常简单,只有scene一个button

主要代码:

public class Main extends Application{

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

@Override
public void start(Stage primaryStage) throws Exception {
    primaryStage.setTitle("Hi I'm a title");

    //Initialize the Button Object
    Button button = new Button();
    button.setText("Bite me");

    //Call the Handlers Class, with the name handlers
    Handlers handlers = new Handlers();
    /*
    Here would go the code to pass the 'button' object to Handlers class
    So then I can do whatever I need in there
     */

    //The Button event, managed by the 'handle' method in Handlers class, that's why the 'handlers' in the
    //parentheses
    button.setOnAction(handlers);

    //Just the scenery, not relevant
    StackPane pane = new StackPane();
    pane.getChildren().add(button);

    Scene scene = new Scene(pane, 300,250);
    primaryStage.setScene(scene);
    primaryStage.show();

}

}

处理程序代码:

public class Handlers implements EventHandler<ActionEvent> {


//Very sad try of a constructor, so as to pass the 'button' object from Main class
//In here, however I have no idea as to how to pass an Object type and how to receive it
public void Handlers(){

}

//The handle method to manage the 'button.setOnAction' event
//This is where I need the 'button' object to compare the source of the event
//to that specific button, so as to prevent that every single button does the same thing
//'button' object from Main class should go ".equals(button)"
@Override
public void handle(ActionEvent event) {

    Main main = new Main();

    if (event.getSource().equals()){

    }
}

}

我向该按钮添加了一个事件,因此我创建了一个处理程序class来处理(dah)主要{{1}上的所有事件当我试图通过“按钮”时,问题就出现了问题。从classMain的对象,以便我可以获取它的来源,这样每个按钮都不会做同样的事情。

我的问题是:如何通过&#39;按钮&#39;从Handlersobject的{​​{1}}?我知道我可以使用Main,唯一的问题就是我仍然没有掌握Handlers的功能,以及正确使用参数。

我已经阅读了这些论坛大约1个小时寻找解决方案,而且我很确定我已经遇到过它,但由于我的无知,无法理解它。 最明显的例子是:

Similar problem

很抱歉这篇文章很长,但是......我需要帮助:(

祝你有个美好的一天:D

1 个答案:

答案 0 :(得分:0)

这里有一些问题我建议您在尝试完全解决您的应用程序想法之前先了解一些。但我可以回答你的问题,并给你一些链接,让你开始。

<强>简介

here是关于main()的帖子,通常您只有一个用于申请。

第一部分

查看类继承。在JavaFX应用程序中,您的主类通常会extend Application,而您的main()方法通常会调用Application.launch(),因为access control而使您的主类可用。在幕后,launch()正在调用Application.start()。因为你继承了Application中的所有内容,所以你需要实现abstract方法start()来实现(可能,但不要引用我)您的用户界面工作,请参阅overriding methods和相关的overloading。因此,在每个JavaFX应用程序中调用的start()中,您可以创建一个按钮Handler,该按钮可以分配给Button上的多个Stage。< / p>

public class Main extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("Hi I'm a title");

        EventHandler eventHandler = new BiteHandler("You've been bitten");

        Button biteMeButton = new Button();
        biteMeButton.setText("Bite me");

        Button biteMeAgainButton = new Button();
        biteMeAgainButton.setText("Bite me again");

        biteMeButton.setOnAction(eventHandler)
        biteMeAgainButton.setOnAction(eventHandler);

        StackPane pane = new StackPane();
        pane.getChildren().add(biteMeButton);
        pane.getChildren().add(biteMeAgainButton);

        Scene scene = new Scene(pane, 300,250);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

第二部分

这是BiteHandler课程。使用此结构,请查看polymorphism。由于多态性,您可以将BiteHandlerChewHandlerLickHandler全部存储在List<EventHandler>中。

通过设置EventHandler的方式,基本上handle()方法是在调用EventHandler时调用的方法,是点击操作上的按钮。所以我们需要在调用处理程序时给这件事做些什么。由于我不知道如何设置嘴巴的动画,我只是将这个东西打印到传递给控制台的消息。在这里,我留下了关于构造函数的评论。

public class BiteHandler implements EventHandler<ActionEvent> {
    private String message_;

    /**
     * Think of a constructor as any other method, however, it is special
     * in that it is named after the class. Because it is named
     * after the class, the compiler knows that the first thing
     * that needs to be done when instantiating this class. A 
     * constructor is "automatic work" that "constructs" your object. 
     * In this class, when you instantiate it, a message is required.
     * this message is stored in a "private class member" to be accessed
     * later on when the bite() method is called
     */
    public BiteHandler(String message) {
        message_ = message;
    }

    @Override
    public void handle(ActionEvent event) {
        bite();
    }

    public void bite() {
        System.out.println(message_);
    }
}

<强>终曲

在您的应用程序中,您将有2个按钮。当您单击任一按钮时,短语“您已经被咬”将打印到控制台。这是因为每个按钮具有相同的BiteHandler。漂亮的fk'ing对所有工作缺乏光彩,但是你有足够的功课来完全消化这个答案