更改javafx对象属性

问题描述:

我试图以业务逻辑和视图分开的方式开发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); 
    } 

} 

该类的对象可以被创建并在另一个类中的主要方法包括经营业务逻辑以这种方式使用:

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

不幸的是,我不能之后改变它的属性。因此,这种说法没有任何作用。

foo.setColor(); 

就像我说的,也许这是一个错误的方法。我不是很熟悉javafx,所以请放纵我。

+0

你说你要分开观点和逻辑,但你必须在这里只有一个类。如果你扩展应用程序,这个类是你的Main.class,你的应用程序将以它开始。你不要从任何其他类中实例化它!你的逻辑部分在哪里? – Tobi

+0

对不起,我省略了整个逻辑部分。该类下面的语句应该在另一个类的主要方法中执行(该类包含与其无关的商业逻辑)。 – user3803086

+0

你的逻辑类也有一个主要方法吗? – Tobi

您需要从视图中删除主要方法。在您的逻辑类中,您必须保存您设置的根窗格。然后,您可以将视图放入您的窗格。那么你的视图就不能再扩展应用了!使它扩展一些窗格。

private final BorderPane rootPane = new BorderPane(); // Class field 

// in your start method 
final Scene scene = new Scene(rootPane); 
primaryStage.setScene(scene); 

//Change View like this: 
View v = new BView(); 
rootPane.setCenter(v.getRec()); 

// later you can set your color 
v.setColor() 


// Your View class: 
public class View{ 
    private Rectangle rect; 

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

    public Rectangle getRec(){ 
     return this.rect; 
    } 
} 

也看看this Documentatino here

+0

如果我理解正确,我也必须删除View类的开始方法。此外,逻辑类必须扩展应用程序并实现一个包含您的文章中的语句的启动方法。 不幸的是,该视图仍然没有出现。 – user3803086

+0

是的,整个应用程序只有一个主要方法!是的,这些线。如果你想改变视图,你可以从你的main.class – Tobi

+0

的其他地方调用rootPane.setCenter(xxx)。我怎么显示视图?我确实像你说的那样,但窗户不会出现。 – user3803086

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

因此,您称为foo的实例不是正在显示的实例,因此更改属性不起作用。如果你仔细阅读Javadoc,那么你可能会做一些破解来获得你想要的效果,但我不会推荐它,因为你依赖的是下一个版本中可能会改变的东西。

如果你真的想从其他地方调用应用程序方法,你可以这样做。

在其他类:

private static View view; 

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

然后查看的启动方法中,添加一行:

OtherClass.setView(this); 

在另一方面,如果你正在寻找模型/视图的分离,它从模型(包含业务逻辑的类)中实例化视图(应用程序)可能不是一个好主意。这样做有点矛盾,因为模型现在依赖于视图(即模型不应该知道矩形)。一个更好的方法是在start()方法中实例化Model类,让你的应用程序和你的Model接口一起工作。这样,你的Application类作为一个适配器连接GUI控件来触发你的模型中的东西。

+0

非常感谢! 我的问题是,业务逻辑永久地更改视图(更确切地说是矩形)。在这种特殊情况下,是否可以在业务逻辑中创建视图对象? – user3803086

+0

你当然可以在任何地方创建你的视图,但你必须删除第二个主要方法! – Tobi

+0

如何在运行包含业务逻辑的类时显示视图? – user3803086