2015-10-18 297 views
0

我試圖以業務邏輯和視圖分開的方式開發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

回答

1

您需要從視圖中刪除主要方法。在您的邏輯類中,您必須保存您設置的根窗格。然後,您可以將視圖放入您的窗格。那麼你的視圖就不能再擴展應用了!使它擴展一些窗格。

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

1

你的問題是你正在創建你自己的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