首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java FX SplitPane

Java FX SplitPane
EN

Stack Overflow用户
提问于 2015-01-07 06:19:44
回答 2查看 1.7K关注 0票数 1

我的SplitPane中有两个Canvas实例。当我拖动分隔栏时,一个画布会增长。当我向后拖动分隔线时,画布并没有真正收缩。它拥有与调整大小时给定的最大尺寸相同的尺寸。所以我只看到了画布一部分,不管SplitPane能显示多少空间。类似的行为也发生在另一个画布上。当分隔符被拖动时,我需要它们缩小到适合各自的部分,而不仅仅是剪裁它们。

在添加到SplitPane之前,画布被包装在一个单元素的GridPane子类中。只要包装器调整大小,这个包装器类就会调整画布的大小。

问题是SplitPane给出了错误的大小:不管画布的最大大小是多少。为什么SplitPane会认为这是正确的做法?

EN

回答 2

Stack Overflow用户

发布于 2015-01-30 04:35:33

代码语言:javascript
复制
package experimental;

import javafx.application.Application;
import javafx.geometry.Orientation;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.control.SplitPane;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

public class SplitPaneProblem extends Application {

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

    public SplitPaneProblem() { }

    @Override
    public void start(Stage primaryStage) throws Exception {
        SplitPane splitPane = new SplitPane();
        splitPane.setOrientation(Orientation.VERTICAL);
        splitPane.getItems().add(new TestPane("0",new Canvas()));
        splitPane.getItems().add(new TestPane("1",new Canvas()));
        primaryStage.setScene(new Scene(splitPane));
        primaryStage.setHeight(400);
        primaryStage.setWidth(400);
        primaryStage.show();
    }

    public class TestPane extends AnchorPane {

        String name;
        Canvas canvas;

        public TestPane(String name,Canvas canvas) {
            super();
            this.canvas = canvas;
            getChildren().add(canvas);
//1         canvas.setManaged(false);
            this.name = name;
        }

        @Override
        public void resize(double width,double height) {
            System.out.println(name+" input  "+width+' '+height);
            super.resize(width, height);
            System.out.println(name+" panel  "+getWidth()+' '+getHeight());
//0         canvas.setWidth (width);
//0         canvas.setHeight(height);
            System.out.println(name+" canvas "+canvas.getWidth()+' '+canvas.getHeight());
        }
    }
}

Canvas不会自动调整大小。运行代码,如图所示,上下拖动分隔线。阅读控制台输出。画布实例的大小永远不会从(0,0)更改。

取消注释以//0开头的行,然后再次运行它。现在,画布实例的大小被强制调整为其包含窗格的大小。上下拖动分隔线。请注意,画布实例是垂直增长的,但它们从不收缩,即使代码告诉它们这样做。想象一下,我们在画布的角上画了一个X。这些X图形将随着分隔线的增加而增长。但是,当您向另一个方向拖动分隔线时,图像会被剪裁,但它永远不会缩小。

取消注释以//1开头的行,然后再次运行它。现在它起作用了。

我不知道你怎么想,但我觉得这很奇怪。

票数 2
EN

Stack Overflow用户

发布于 2015-01-08 01:41:55

基于Jasper Potts的这个post,您可以创建一个可调整大小的画布,并在拆分窗格中使用它。

代码语言:javascript
复制
class ResizableCanvas extends Pane {

    private final int id;
    private final Canvas canvas = new Canvas();

    public ResizableCanvas(int id) {
        this.id=id;
        getChildren().add(canvas);
    }

    @Override
    protected void layoutChildren() {
        final int top = (int)snappedTopInset();
        final int right = (int)snappedRightInset();
        final int bottom = (int)snappedBottomInset();
        final int left = (int)snappedLeftInset();
        final int w = (int)getWidth() - left - right;
        final int h = (int)getHeight() - top - bottom;
        canvas.setLayoutX(left);
        canvas.setLayoutY(top);
        if (w != canvas.getWidth() || h != canvas.getHeight()) {
            canvas.setWidth(w);
            canvas.setHeight(h);
            GraphicsContext gc = canvas.getGraphicsContext2D();
            gc.clearRect(0, 0, w, h);
            if(id==1){
                gc.setFill(Color.BLUE);                
                gc.fillOval(5, 5, w-10, h-10);
            } else {
                gc.setFill(Color.RED);
                gc.fillRect(10, 10, w-20, h-20);
            } 
        }
    }
}

@Override
public void start(Stage stage) throws Exception {
    ResizableCanvas canvas1 = new ResizableCanvas(1);
    ResizableCanvas canvas2 = new ResizableCanvas(2);

    SplitPane split = new SplitPane();
    split.getItems().addAll(canvas1,canvas2);

    stage.setScene(new Scene(split, 600, 400));
    stage.show();
}

请注意,每次调整场景大小或移动拆分内容分隔符时,都会重新绘制两个画布,但始终使用其各自窗格的确切大小。正如他还建议的,您可以考虑对画布内容进行快照,并使用图像来提高性能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27808210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档