我的SplitPane中有两个Canvas实例。当我拖动分隔栏时,一个画布会增长。当我向后拖动分隔线时,画布并没有真正收缩。它拥有与调整大小时给定的最大尺寸相同的尺寸。所以我只看到了画布一部分,不管SplitPane能显示多少空间。类似的行为也发生在另一个画布上。当分隔符被拖动时,我需要它们缩小到适合各自的部分,而不仅仅是剪裁它们。
在添加到SplitPane之前,画布被包装在一个单元素的GridPane子类中。只要包装器调整大小,这个包装器类就会调整画布的大小。
问题是SplitPane给出了错误的大小:不管画布的最大大小是多少。为什么SplitPane会认为这是正确的做法?
发布于 2015-01-30 04:35:33
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开头的行,然后再次运行它。现在它起作用了。
我不知道你怎么想,但我觉得这很奇怪。
发布于 2015-01-08 01:41:55
基于Jasper Potts的这个post,您可以创建一个可调整大小的画布,并在拆分窗格中使用它。
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();
}请注意,每次调整场景大小或移动拆分内容分隔符时,都会重新绘制两个画布,但始终使用其各自窗格的确切大小。正如他还建议的,您可以考虑对画布内容进行快照,并使用图像来提高性能。
https://stackoverflow.com/questions/27808210
复制相似问题