更改javafx对象属性

时间:2015-10-18 10:11:09

标签: java oop javafx

我试图以一种业务逻辑和视图分离的方式开发一个javafx项目。坦率地说,我不知道我是否意识到这一点。

我的想法是创建一个类视图。简化它看起来像这样:

public class View extends Application {

    private Pane screen = new Pane();

    private Rectangle rect;

    private Scene scene = new Scene(screen, 500, 500);


    public View(){
        rect = new Rectangle(10, 10, 100, 100);
        rect.setFill(Color.WHITE);
        rect.setStroke(Color.BLACK);
        screen.getChildren().add(rect);
    }

    @Override
    public void start(Stage primaryStage) {

        primaryStage.setTitle("Rectangles");
        primaryStage.setScene(scene);
        primaryStage.show();

    }

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

    public void setColor() {
        rect.setFill(Color.BROWN);
    }

}

可以在另一个类的main方法中以这种方式创建和使用该类的对象,包括业务逻辑:

View foo = new View();
foo.main(null);

不幸的是,之后我无法更改其属性。因此,这种说法没有任何效果。

foo.setColor();
像我说的那样,也许这是一种错误的做法。我对javafx不太熟悉,所以请放纵我。

2 个答案:

答案 0 :(得分:1)

您的问题是您正在创建自己的View实例。当你调用静态方法main(String [] args)时,它会创建自己的View实例并显示它。看看JavaFX 2.2 Application.

因此,您调用foo的实例不是正在显示的实例,因此更改属性无效。如果你仔细阅读Javadoc然后你可能会做一个hack来获得你想要的效果,但我不推荐它,因为你依赖于下一个版本中可能会改变的东西。

如果你真的希望能够从其他地方调用应用程序方法,你可以做这样的事情。

在另一堂课:

private static View view;

public static void setView(View view) {
    this.view = view;
}

然后在View的start方法中添加以下行:

OtherClass.setView(this);

另一方面,如果您正在寻找模型/视图分离,那么从模型(包含业务逻辑的类)中实例化视图(应用程序)可能不是一个好主意。这样做是矛盾的,因为模型现在依赖于视图(即模型不应该知道矩形)。更好的想法是在start()方法中实例化Model类,并让您的应用程序使用Model的接口。这样,您的Application类充当连接GUI控件的适配器,以触发模型中的内容。

答案 1 :(得分:1)

您需要从View中删除main方法。在您的逻辑类中,您必须保存您设置的根窗格。然后,您可以将视图放入/更改为窗格。您的视图无法再扩展应用程序了!让它扩展一些窗格。

<option value="option2" selected>M</option>

另请查看this Documentatino here