在 SWT FXCanvas 中嵌入 JavaFX 时解决 DPI 缩放问题
Resolve DPI-scaling when embedding JavaFX within SWT FXCanvas
我有一个 Eclipse-RCP 项目,我需要在其中的 SWT 部分/windows 中使用 JavaFX 控件和组件。我将这些控件包含在一个简单的部分中,该部分将 JavaFX 组件包装在 FXCanvas
中。但是,当我 运行 在启用了字体缩放的高 DPI 屏幕的计算机上运行该应用程序时, FXCanvas
的内容渲染得比 SWT 部分的内容更小(也更模糊)。另请注意,JavaFX 警报(在纯 JavaFX 平台上而不是在 FX-Canvas 内)甚至比 FXCanvas
的内容还要小
为了比较,相同的应用程序 运行 在正常 DPI 屏幕上并且没有字体缩放看起来如下:
我的 FXCanvasPart
代码如下:
public class FXCanvasPart {
private FXCanvas fxCanvas;
private Label label;
private Button jfxButton;
@PostConstruct
public void postConstruct(final Composite parent) {
fxCanvas = new FXCanvas(parent, SWT.NONE);
final BorderPane root = new BorderPane();
label = new Label("This is an FX Label.");
root.setTop(label);
jfxButton = new Button("This is an FX button.");
root.setCenter(jfxButton);
final Scene scene = new Scene(root);
fxCanvas.setScene(scene);
}
}
SWT 部分同样简单:
public class SWTPart {
private Label label;
private Button button;
@PostConstruct
public void createComposite(Composite parent) {
parent.setLayout(new GridLayout(1, false));
label = new Label(parent, SWT.NULL);
label.setText("This is an SWT text label.");
button = new Button(parent, SWT.NONE);
button.setText("This is an SWT button.");
}
}
使用以下处理程序通过应用程序的菜单项打开 JavaFX 对话框:
public class OpenDialogHandler {
@Execute
public void execute(Shell shell) {
Alert alert = new Alert(AlertType.INFORMATION);
alert.setTitle("A JavaFX dialog");
alert.setHeaderText("Header text");
alert.setContentText("This is a JavaFX Alert dialog.");
alert.showAndWait();
}
}
我已经上传了一个 zip file 完整的 Eclipse 项目来演示这个问题,如果这样可以更容易地调查这个问题。
谁能告诉我这是怎么回事以及如何解决这个问题?谢谢!
这两个例子都是 运行 在 Windows 10 上使用 JDK 9.0.4。顺便说一句,当在具有高 DPI 屏幕的机器上使用 JDK 8 时,FXCanvas 文本较大,但纯 FX 对话框的大小正确:
这是一个已知问题:
https://bugs.openjdk.java.net/browse/JDK-8191661
要等到几个版本之后才能修复。
我有一个 Eclipse-RCP 项目,我需要在其中的 SWT 部分/windows 中使用 JavaFX 控件和组件。我将这些控件包含在一个简单的部分中,该部分将 JavaFX 组件包装在 FXCanvas
中。但是,当我 运行 在启用了字体缩放的高 DPI 屏幕的计算机上运行该应用程序时, FXCanvas
的内容渲染得比 SWT 部分的内容更小(也更模糊)。另请注意,JavaFX 警报(在纯 JavaFX 平台上而不是在 FX-Canvas 内)甚至比 FXCanvas
为了比较,相同的应用程序 运行 在正常 DPI 屏幕上并且没有字体缩放看起来如下:
我的 FXCanvasPart
代码如下:
public class FXCanvasPart {
private FXCanvas fxCanvas;
private Label label;
private Button jfxButton;
@PostConstruct
public void postConstruct(final Composite parent) {
fxCanvas = new FXCanvas(parent, SWT.NONE);
final BorderPane root = new BorderPane();
label = new Label("This is an FX Label.");
root.setTop(label);
jfxButton = new Button("This is an FX button.");
root.setCenter(jfxButton);
final Scene scene = new Scene(root);
fxCanvas.setScene(scene);
}
}
SWT 部分同样简单:
public class SWTPart {
private Label label;
private Button button;
@PostConstruct
public void createComposite(Composite parent) {
parent.setLayout(new GridLayout(1, false));
label = new Label(parent, SWT.NULL);
label.setText("This is an SWT text label.");
button = new Button(parent, SWT.NONE);
button.setText("This is an SWT button.");
}
}
使用以下处理程序通过应用程序的菜单项打开 JavaFX 对话框:
public class OpenDialogHandler {
@Execute
public void execute(Shell shell) {
Alert alert = new Alert(AlertType.INFORMATION);
alert.setTitle("A JavaFX dialog");
alert.setHeaderText("Header text");
alert.setContentText("This is a JavaFX Alert dialog.");
alert.showAndWait();
}
}
我已经上传了一个 zip file 完整的 Eclipse 项目来演示这个问题,如果这样可以更容易地调查这个问题。
谁能告诉我这是怎么回事以及如何解决这个问题?谢谢!
这两个例子都是 运行 在 Windows 10 上使用 JDK 9.0.4。顺便说一句,当在具有高 DPI 屏幕的机器上使用 JDK 8 时,FXCanvas 文本较大,但纯 FX 对话框的大小正确:
这是一个已知问题: https://bugs.openjdk.java.net/browse/JDK-8191661
要等到几个版本之后才能修复。