【问题标题】:JavaFX - Resize Canvas when screen is resizedJavaFX - 调整屏幕大小时调整画布大小
【发布时间】:2014-06-20 10:11:01
【问题描述】:

我正在使用我在 JavaFX 中构建的关卡编辑器的 GUI,我希望能够将画布对象的大小调整为新的拆分窗格尺寸。似乎我尝试过的一切都失败了。这包括将窗格对象传入并直接使用其宽度,使用窗口大小侦听器并将宽度和高度属性绑定到拆分窗格的属性。有任何想法吗?这是调整大小之前的样子:

调整大小后:

有人有什么想法吗?该类的代码相当广泛,但调整大小的代码将包含在此处:

public Canvas canvas;
public String tabTitle;
public VBox layout;
public GraphicsContext g;
public Core core;

public CanvasTab(Core core, String tabTitle){
    this.core = core;
    this.canvas = new Canvas(core.scene.getWidth() - 70, core.scene.getHeight() - 70);
    layout = VBoxBuilder.create().spacing(0).padding(new Insets(10, 10, 10, 10)).children(canvas).build();
    
    this.g = canvas.getGraphicsContext2D();

    g.setFill(Color.BLACK);
    g.fillRect(0, 0, canvas.getWidth(), canvas.getHeight());
    
    HBox.setHgrow(layout, Priority.ALWAYS);
    
    this.setContent(layout);
    this.setText(tabTitle);
    
    canvas.widthProperty().bind(layout.widthProperty().subtract(20));
    canvas.heightProperty().bind(layout.heightProperty().subtract(20));
}

public CanvasTab(Canvas canvas){
    this.canvas = canvas;
}

【问题讨论】:

  • 画布(我假设)调整大小正确,但是在构建画布选项卡时,您填充了画布大小的黑色矩形。如果您要使用画布并希望它重新调整大小,您可能需要在调整大小时重新绘制所有内容(或至少某些内容)。

标签: java canvas resize javafx


【解决方案1】:

正如 James_D 所指出的,您需要在调整大小时重新绘制画布的内容。这可以通过向画布的宽度和高度属性添加监听器来完成,如下所示:

InvalidationListener listener = new InvalidationListener(){
    @Override
    public void invalidated(Observable o) {
        redraw();       
    }           
});
canvas.widthProperty().addListener(listener);
canvas.heightProperty().addListener(listener);

或者在 Java 8 中使用函数式接口:

canvas.widthProperty().addListener(observable -> redraw());
canvas.heightProperty().addListener(observable -> redraw());

redraw() 是您自己的方法,在您的示例中看起来像这样(绘制黑色矩形:

private void redraw() {
    g.setFill(Color.BLACK);
    g.fillRect(0, 0, canvas.getWidth(), canvas.getHeight());
}

【讨论】:

【解决方案2】:

要使 JavaFx 画布可调整大小,只需覆盖 min/pref/max 方法。使其可调整大小并实现 resize 方法。

使用此方法,无需宽度/高度侦听器即可触发重绘。也不再需要将宽度和高度的大小绑定到容器。

public class ResizableCanvas extends Canvas {

@Override
public double minHeight(double width)
{
    return 64;
}

@Override
public double maxHeight(double width)
{
    return 1000;
}

@Override
public double prefHeight(double width)
{
    return minHeight(width);
}

@Override
public double minWidth(double height)
{
    return 0;
}

@Override
public double maxWidth(double height)
{
    return 10000;
}

@Override
public boolean isResizable()
{
    return true;
}

@Override
public void resize(double width, double height)
{
    super.setWidth(width);
    super.setHeight(height);
    paint();
}

注意resize方法不能简单调用Node.resize(width,height),因为标准实现是空的。

【讨论】:

  • 这个答案是金!
猜你喜欢
  • 1970-01-01
  • 2013-05-12
  • 2016-04-20
  • 2015-08-31
  • 2018-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多