簡體   English   中英

JavaFX - 調整屏幕大小時調整畫布大小

[英]JavaFX - Resize Canvas when screen is resized

我正在處理我在 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;
}

正如 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());
}

要使 JavaFx 畫布可調整大小,所需要做的就是覆蓋 min/pref/max 方法。 使其可調整大小並實現調整大小方法。

使用此方法不需要寬度/高度偵聽器來觸發重繪。 也不再需要將寬度和高度的大小綁定到容器。

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),因為標准實現實際上是空的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM