You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX中Pane类setWidth()方法导致图形异常放大的原因咨询

JavaFX Pane 自定义组件异常问题

编辑说明:若在start方法中使用StackPane而非Pane,代码可正常运行,示例如下:

public void start(Stage primaryStage) {
StackPane pane = new StackPane();
}

难道问题出在Pane类上?

我创建了一个继承自JavaFX Pane类的自定义面板类MyPane,并添加了setWidth()方法用于调整其宽度。

我希望将圆形置于舞台中央,并在拖动调整窗口大小时同步缩放图形,但结果不符合预期:

  • 初始状态下,图形是左上角的一个小点。按道理MyPane的宽高初始为0,是不是应该完全不显示?
  • 无论放大还是缩小窗口,圆形都会持续变大。

初始状态截图:[左上角显示极小的圆形]
窗口调整后截图:[圆形随窗口操作持续放大]

能否有人帮我解析这一过程的底层机制?

提前感谢!

以下是我的代码:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

public class Exercise_14_11 extends Application {
  public void start(Stage primaryStage) {
    Pane pane = new Pane();

    MyPane circle = new MyPane();
    pane.getChildren().add(circle);
    Scene scene = new Scene(pane, 400, 400);
    primaryStage.setTitle("Exercise_14_11");
    primaryStage.setScene(scene);
    primaryStage.show();

  }
  public static void main(String[] args) {
    launch(args);
  }
}
class MyPane extends Pane {
  public MyPane() {
    paint();
  }
  public void paint() {
    double centerX = getWidth() / 2;
    double centerY = getHeight() / 2;
    double radius = centerX;
    
    Circle face = new Circle(centerX, centerY, radius);
    face.setFill(Color.WHITE);
    face.setStroke(Color.BLACK);

    getChildren().clear();
    getChildren().addAll(face);
  }

  @Override
  public void setWidth(double width) {
  super.setWidth(width);
    paint();
  }
}

我已查阅Pane和Region的官方文档,但仍无头绪。

我知道可以通过属性绑定实现需求,但更关注Pane宽度处理的底层流程。


内容的提问来源于stack exchange,提问作者Liam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 05:59:57