我试图以一种业务逻辑和视图分离的方式开发一个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不太熟悉,所以请放纵我。
答案 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>