2015-04-06 58 views
2

我正在設計程序,我需要使用MDI(多文檔界面),我不知道如何做,所以請任何人都可以回答我。 YouTube上的視頻正在做javafx中的MDI,但沒有視頻鏈接的視頻源代碼或解釋:https://www.youtube.com/watch?v=0nskbRY-Tnw。 請幫助我,這是可惜的javafx不允許我們管理其他窗口內的窗口。javafx支持MDI(多文檔界面)嗎?

+1

有沒有抽象的子窗口烘焙到Java FX2或據我所知,FX8。 – scottb

回答

4

MDI在很大程度上被認爲是poor user experience,部分原因是在當前版本的JavaFX中沒有內置的MDI API。

但是,如果你真的想實現這樣的應用程序,它不會太困難。使用普通的Pane來保存各個窗口,並使用BorderPane s來實現窗口,頂部區域保持標題欄和一些按鈕。你需要做一些工作來實現鼠標監聽器的拖動和聚焦,但不是太多。

+0

+1表示「請勿」。:-)我可以建議使用自由浮動窗口或可能更好,單個窗口,全尺寸選項卡窗格。 – haraldK

0

我發現了一個辦法做到MDI APP只需使用jfxtra庫

+0

你是如何處理這個問題的? – Troyseph

0

JVX通過SIB願景似乎對JavaFX的一些MDI支持工作:http://blog.sibvisions.com/2015/03/19/javafx-styled-stage-and-mdi-system/

不過,請注意,我目前工作的一個Docking Framework for JavaFX,這可能會感興趣你作爲一個替代的辦法MDI。

註釋目前僅在Drombler FX應用程序中可用,但程序化方法也適用於非OSGi環境(請參閱sample)。

請注意,有一個Getting Started頁基於Drombler FX應用,支持對接框架註解。

0

這對JavaFX來說並不難完成 - 但我同意它太糟糕了,它不是原生的。雖然我對這個想法並不滿意,但有些使用案例存在。

你有主窗口中使用窗格爲其中的窗口將打開,然後就可以使用其保持滾動窗格中有一個CustomPane的位置。然後,您可以將您FXML加載到該對象...

public class MoveablePane extends Pane { 
    private ScrollPane scrollArea; 
    private Node contentNode; 
    public MoveablePane (String title, Node contentNode) { 

    this.contentNode = contentNode; 

    //Set up the title bar 
    //Set up the window buttons 
    //Place the node into the scroll area so the user can resize 
    this.scrollArea = new ScrollPane(contentNode); 
    //Add the nodes to be layed out on the stage 
    this.getChildren().clear(); 
    this.getChildren().addAll(scrollArea); 
} 

....

然後,你需要實現拖動&調整事件&佈局的孩子......

例如:

private void dragPaneToNewLocation(MouseEvent event) { 

    // Get the exact moved X and Y 
    double offsetX = event.getSceneX() - mousex; 
    double offsetY = event.getSceneY() - mousey; 

    x += offsetX; 
    y += offsetY; 

    double scaledX = x; 
    double scaledY = y; 

    if(scaledY > 0){ 
     setLayoutY(scaledY); 
    } 

    if(scaledX > 0){ 
     setLayoutX(scaledX); 
    } 


    // again set current Mouse x AND y position 
    mousex = event.getSceneX(); 
    mousey = event.getSceneY(); 
}