JavaFX将画布拉伸到维度 >在我的C++ Windows程序中,我直接画到固定的像素缓冲区( u32 *< /COD>),并将其拉伸以适应窗口尺寸: StretchDIBits(device_context, 0, 0, window_width, window_height, src_x, src_y, src_width, src_height, src_memory, src_info, DIB_RGB_COLORS, SRCCOPY);

JavaFX将画布拉伸到维度 >在我的C++ Windows程序中,我直接画到固定的像素缓冲区( u32 *< /COD>),并将其拉伸以适应窗口尺寸: StretchDIBits(device_context, 0, 0, window_width, window_height, src_x, src_y, src_width, src_height, src_memory, src_info, DIB_RGB_COLORS, SRCCOPY);,java,javafx,canvas,rendering,Java,Javafx,Canvas,Rendering,我是JavaFX新手。 在JavaFX中,我有: @Override public void start(Stage primary_stage) throws Exception { Group root = new Group(); Scene scene = new Scene(root); primary_stage.setScene(scene); Canvas canvas = new Canvas(1280, 720); root.getChildre

我是JavaFX新手。 在JavaFX中,我有:

@Override
public void
start(Stage primary_stage) throws Exception
{
   Group root = new Group();
   Scene scene = new Scene(root);
   primary_stage.setScene(scene);
   Canvas canvas = new Canvas(1280, 720);
   root.getChildren().add(canvas);
   GraphicsContext gc = canvas.getGraphicsContext2D();
}
在我的Windows示例中,我想将画布(它是
GraphicsContext
)视为固定大小的像素缓冲区。我希望将每个框架拉伸或收缩到窗口尺寸(或我指定的任何尺寸)。我看到的许多示例似乎增加了画布节点本身的宽度和高度。我想拉伸画布的内容,而不是画布节点本身(如果有意义的话)


JavaFX是否有一个与StretchDIBits等价的方法?

我不相信有一个内置的方法可以调用来做你想做的事情。但您可以缩放
画布
,以填充可用空间。当画布的父对象调整大小时,需要不断更新比例因子。这可能最好通过自定义布局实现。例如:

导入javafx.geometry.HPos;
导入javafx.geometry.VPos;
导入javafx.scene.canvas.canvas;
导入javafx.scene.canvas.GraphicsContext;
导入javafx.scene.layout.Region;
公共类自动缩放画布扩展区域{
私人最终画布;
公共自动缩放画布(双画布宽度、双画布高度){
this.canvas=新画布(画布宽度、画布高度);
getChildren().add(画布);
}
公共图形上下文getGraphicsContext2D(){
返回canvas.getGraphicsContext2D();
}
@凌驾
受保护的void layoutChildren(){
双x=getInsets().getLeft();
双y=getInsets().getTop();
双w=getWidth()-getInsets().getRight()-x;
双h=getHeight()-getInsets().getBottom()-y;
//保持纵横比,同时也保持在可用空间内
double sf=Math.min(w/canvas.getWidth(),h/canvas.getHeight());
画布。设置刻度(sf);
帆布固定尺(sf);
位置区域(画布、x、y、w、h、-1、HPos.CENTER、VPos.CENTER);
}
}
下面是一个使用上述方法的示例:

导入javafx.application.application;
导入javafx.scene.scene;
导入javafx.scene.paint.Color;
导入javafx.stage.stage;
公共类主扩展应用程序{
@凌驾
公共无效开始(阶段primaryStage){
AutoScalingCanvas画布=新的AutoScalingCanvas(500300);
getGraphicsContext2D().fillOval(200100100100);
canvas.getGraphicsContext2D().setLineWidth(5);
canvas.getGraphicsContext2D().setStroke(Color.RED);
getGraphicsContext2D().strokeRect(0,0,500,300);
初始阶段。设置场景(新场景(画布));
primaryStage.show();
}
}

@Slaw如果我使用
scale\ux=canvas\u fixed\u width/window\u width
如何获得当前的窗口宽度?但这有意义吗?画布上的任何图形看起来都是扭曲的。这就是你想要的吗?@mipa我知道,如果JavaFX具有我正在寻找的等效函数(这在图形库中很常见,例如Windows API、Xlib、AppKit),那么不处理纵横比,它看起来会失真(对于调试来说很好),那么处理纵横比就很简单了。@Slaw My loop in a
AnimationTimer
handle()
调用
gc.scale(1280/scene.getWidth(),720/scene.getHeight())这在初始打开时有效,但在调整大小时会失控。我尝试在
画布上设置
,但当增加时,它会将内容向内推,即0,0移到中心,缩小时会放大。你应该问问自己,画布是否是正确的方法。在我看来,场景图似乎是更好的选择。人们不应该总是在不同的环境中寻找一对一的概念替换。当最大化时,这似乎会导致文本模糊?这并不让我感到惊讶,但我不知道如何修复它。