当前位置: 首页 > 知识库问答 >
问题:

JavaFx画布只调整高度而不调整宽度

终翰学
2023-03-14

我已经开始为绘制温度数据编程这个应用html" target="_blank">程序,当屏幕调整大小时,画布也应该调整大小。它初始化正确,但当我想调整窗口大小时,draw()方法只会根据它绑定的stackpanes高度值调整高度大小,但它将完全忽略宽度。听者甚至不会开火。这我觉得很奇怪。此外,我必须为StackPane设置最小大小,否则将不会绘制任何东西。我没有使用FXML。

编辑我将第58行从setRight()更改为setCenter,正如来自InternetUnExplorer的解决方案中提到的。但我还是很好奇为什么会这样,所以我做了一些研究。我在网上找到了这个:

  • 顶部/底部区域:可横向收缩/扩展,高度不变。
  • 左/右区域:可垂直收缩/扩张,长度不变。
  • 中心区域:可以在两个方向上收缩/扩展。

http://o7planning.org/en/10629/javafx-borderpane-layout-tutorial

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class main extends Application {

    @Override
    public void start(Stage mainStage) throws Exception {
        TempViewerWindow view = new TempViewerWindow();
        ReadData controller = new ReadData(view);
        controller.selectAll();

        mainStage.setScene(new Scene(view));
        //mainStage.setMinWidth(500);
        //mainStage.setMinHeight(400);
        mainStage.setTitle("Temperature Viewer");
        mainStage.show();
    }

    public static void main(String[] args) {

        launch(args);

    }

}
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;

public class TempViewerWindow extends BorderPane {

    public TableView<TempData> tableView;
    public Canvas canvas;
    public GraphicsContext gc;
    public StackPane holder;

    public TempViewerWindow() {
        tableView = new TableView<>();
        TableColumn<TempData, String> col_date = new TableColumn<>("Date");
        TableColumn<TempData, Float> col_temperature = new TableColumn<>("Temperature");

        col_date.setCellValueFactory(e -> e.getValue()
                                           .dateProperty());
        col_temperature.setCellValueFactory(e -> e.getValue()
                                                  .temperatureProperty()
                                                  .asObject());

        tableView.getColumns()
                 .addAll(col_date, col_temperature);

        setLeft(tableView);

        holder = new StackPane();
        holder.setMinSize(400, 400); // must be here for some reason

        canvas = new Canvas();

        gc = canvas.getGraphicsContext2D();

        canvas.widthProperty()
              .bind(holder.widthProperty()
                          .subtract(10));
        canvas.heightProperty()
              .bind(holder.heightProperty()
                          .subtract(10));

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

        holder.getChildren()
              .add(canvas);

        setCenter(holder); //here was the bug

    }

    private void redraw(GraphicsContext gc) {
        gc.clearRect(0, 0, canvas.getWidth(), canvas.getHeight());
        gc.setFill(Color.WHITE);
        gc.fillRect(0, 0, canvas.getWidth(), canvas.getHeight());
        System.out.println("redraw!");

    }

}

共有1个答案

裴嘉许
2023-03-14

您的画布被放置在您的BorderPane的右侧,而您应该将它放置在中心。

如果将TempViewerWindow的第54行从SetRight(holder)更改为SetCenter(holder),则缩放工作正常。

 类似资料:
  • 我在画布上画了一幅画,并根据用户的鼠标点击绘制了一些点。我使用了数学计算,以便在用户悬停作为工具提示时在图片中显示一些面板名称。我使用画布坐标和比例百分比。我的问题是,当我将窗口重新调整为更小的窗口(我使用了Mozilla响应模式移动设备)时,它给出了错误的坐标。 在移动窗口模式下,画布的实际大小为-460550,大约为250350 我用了以下风格 如何在不减少画布坐标的情况下重新调整画布的大小。

  • 问题内容: 我有一个UILabel,一个UIView在情节提要中并排包含其他子视图。UIView应该紧靠UILabel的右边缘(跟踪约束为1),但我还需要UIlabel(左侧的UIlabel)将其宽度设置为等于其内容大小,除非它达到最大宽度。视觉上: |标签文字| | UIViewWithSubviews | 我需要以下约束: 1)标签应明智地调整宽度大小,除非达到最大大小,并且高度也是动态的,这

  • 我目前正在做一个项目,我找不到任何解决方案。我希望Gridpane行的高度从该行中一个特定列的宽度动态计算。整个Gridpane必须可调整大小,其余可用空间应位于下面的另一行,以便根据该单元格内的元素保留该单元格的纵横比。孩子们,有什么想法吗? 我希望单元格1,0和1,1可以调整大小,并且通过增加其宽度,可以清楚地看到第0行和第1行的高度不应该平均增加。如果还剩下任何高度,我希望第3行可以承受,因

  • 问题内容: 允许用户调整窗口的宽度和高度。是否存在允许用户仅调整高度大小的方法? 谢谢。 编辑: 下面的解决方案似乎不起作用。在360x600 JFrame上, 仍然允许完全拉伸JFrame的宽度,而设置则不允许任何拉伸。 问题答案: 下面的代码可以正确完成工作。

  • 下面是和,我试图使它尽可能简单。 黑色是名为的,其内部是名为的。我要做的是将中的的大小调整为的大小减去4。但当您调整窗口大小时,一切都失败了。 你要尝试的... 2)增加窗口的大小,然后慢慢减小。 为什么会这样?我有这个问题三个月了,但我找不到解决办法... 我也看过javafx-resize Canvas,当屏幕调整大小时,但这里的问题似乎是不同的... 如果我不手动设置画布的宽度和高度,它甚至

  • 我有一个非常简单的DIV元素,我试图调整大小并水平拖动。它工作得很好,但是DIV元素的高度也会被jQueryUI改变。我不明白为什么。 有人有主意吗? JS代码: 超文本标记语言代码: CSS代码: