【问题标题】:JavaFX: Splitpane columns not equalJavaFX:拆分窗格列不相等
【发布时间】:2014-02-20 10:31:22
【问题描述】:

我想构建一个 javafx 应用程序,它由关于整个场景的 3 大列组成。列应该可以调整大小,所以我使用了拆分窗格。我在拆分窗格中添加了 3 个边框窗格,每个边框都具有相同的首选宽度(场景总体宽度为 3840,因此每列的宽度为 1280)。但是当我启动应用程序时,中间边框比另外两个小。它没有按 1280 宽度缩放。

那么我该如何管理拆分窗格不缩放边框并使用首选宽度?

更新:我找到了一个很好的解决方案,它使来自 user3249346 的解决方案动态化。添加或删除列后,您可以这样调用:

ObservableList<SplitPane.Divider> dividers = splitPane.getDividers();
for (int i = 0; i < dividers.size(); i++) {
    dividers.get(i).setPosition((i + 1.0) / 3);
}

【问题讨论】:

    标签: javafx splitpane


    【解决方案1】:

    我试过这个,当我用三列Splitpane最大化和恢复屏幕时,这个工作正常。 重要的是 Platform.runLater

    import javafx.application.Application;
    import javafx.application.Platform;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.SplitPane;
    import javafx.scene.layout.StackPane;
    import javafx.stage.Stage;
    
    public class SplitPaneTest  extends Application {
    @Override public void start(Stage stage) {
         final SplitPane sp = new SplitPane();
         final StackPane sp1 = new StackPane();
         Button addColumn = new Button("Add Column");
           // Added the below function to set the size dynamically when column is added.
         addColumn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent arg0) {
                StackPane temp = new StackPane();
                temp.getChildren().add(new Button("New Column"));
                sp.getItems().add(temp);
                int divCount = sp.getDividerPositions().length;
                double equalSize = 1.0/(divCount+1);
                double divPosValues[] = new double[divCount];
                for(int count=1; count<divCount+1; count++) {
                    divPosValues[count-1] = equalSize*count;
                }
                sp.setDividerPositions(divPosValues);
            }
        });
    
         sp1.getChildren().add(addColumn);
         final StackPane sp2 = new StackPane();
         sp2.getChildren().add(new Button("New Button"));
         final StackPane sp3 = new StackPane();
         sp3.getChildren().add(new Button("New Button"));
         sp.getItems().addAll(sp1, sp2, sp3);
         sp.setDividerPositions(0.33f, 0.63f, 0.93f);
    
        Scene scene = new Scene(sp, 400, 400);
        stage.setScene(scene);
    
        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                sp.setDividerPositions(0.3f, 0.6f, 0.9f);
            }
          });
        stage.show();
    }
    
    public static void main(String[] args) {
        Application.launch(args);
    }
    }
    

    【讨论】:

    • 好的,这适用于 3 列,谢谢。但如果动态添加或删除列,它将不起作用。
    • 非常有趣 :) 我编辑了上面的代码,尝试在添加列时动态设置分隔线位置。我认为这是一个肮脏的解决方案..但它有效..
    猜你喜欢
    • 1970-01-01
    • 2014-11-16
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多