如何创建javafx 2.0应用程序MDI

时间:2012-06-06 13:39:49

标签: modal-dialog javafx mdi

如何在JavaFx 2.0中专门实现某种内部框架?

我的尝试就是这样......

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Main extends Application {

    ConnectDb connection;

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

    @Override
    public void start(Stage stage) throws Exception {
        final Stage stage1 = new Stage();
        StackPane pane = new StackPane();
        Button btn = new Button("Click Me");
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                connection = new ConnectDb();
                try {
                    connection.start(stage1);
                } catch (Exception e) {
                    e.printStackTrace(); 
                }
                System.out.println("Fire some thing..");
            }
        });
        pane.getChildren().add(btn);
        stage.setScene(new Scene(pane ,200, 300));
        stage.show();
    }
}

ConnectDb.java

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class ConnectDb extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        StackPane pane = new StackPane();
        Button btn = new Button("Click On Button which is me");
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                System.out.println("Something here..");
            }
        });
        pane.getChildren().add(btn);
        stage.setScene(new Scene(pane ,200, 300));
        stage.show();
    }
}

2 个答案:

答案 0 :(得分:1)

首先,对于您的方法,您不需要(因此不应该)从Application扩展ConnectDb,因为您只需使用start方法来创建新阶段。您只需要一个Application类(在您的案例中为Main)。您也可以在第一个事件处理程序中创建新的舞台/场景。

其次,JavaFX 2.1中没有真正的MDI支持。现在,你可以拥有多个阶段(相当于拥有多个窗口/框架)。但是,您不能在桌面窗格中使用内部框架。

我想你可以采取以下行动:

  • 只需使用多个阶段(窗口),但缺点是它们会在桌面上浮动得非常不明显
  • 使用Swing作为容器(使用JDesktopPane和JInternalFrame)并集成JavaFX(这里是一个很好的How-To
  • 实施您自己的模仿MDI行为的框架
  • 找到提供MDI行为的框架
  • 等待将来发布的JavaFX,希望能提供MDI支持(据我所知,还有一个待更改请求......)

答案 1 :(得分:1)

  1. 创建父AncorPane。
  2. 添加几个孩子AnchorPanes。它们将作为内部框架。添加不同的内容。
  3. 设置儿童AnchorPanes不可见。
  4. 添加按钮以隐藏,调整大小或关闭子级AnchorPanes。需要时,调用函数将所有子项AnchorPanes设置为不可见,除了一个。