如何在 SWT 中使用 FXCanvas Java 8
How to use FXCanvas with SWT Java 8
我正在尝试使用 FXCanvas 将 JavaFX 集成到 SWT 应用程序中。作为参考,我正在关注 this oracle guide
在我的 IDE 中,这段代码显示错误
/* Create an FXCanvas */
final FXCanvas fxCanvas = new FXCanvas(shell, SWT.NONE) {
@Override
public Point computeSize(int wHint, int hHint, boolean changed) {
getScene().getWindow().sizeToScene();
int width = (int) getScene().getWidth();
int height = (int) getScene().getHeight();
return new Point(width, height);
}
};
错误:
(是的,我输入了正确的点class:org.eclipse.swt.graphics.Point
):
'computeSize(int, int, boolean)' in 'Anonymous class derived from javafx.embed.swt.FXCanvas' clashes with 'computeSize(int, int, boolean)' in 'javafx.embed.swt.FXCanvas'; attempting to use incompatible return type
但是,我不认为这是根本原因...因为当我尝试构建项目时(maven ) 我收到此错误:
package javafx.embed.swt does not exist
。我认为这是真正的问题。
所以在做了一些研究之后,我检查了一些事情,首先,jfxswt jar 看起来应该可以访问:
如果我打开 JAR,您可以看到 FXCanvas 在那里:
我什至尝试手动将 JAR 作为库添加到我的模块中,但仍然不起作用。
这是我的pom.xml,(我特意匿名了某些信息)
我还要提到的是,我在一个没有任何 Maven 依赖项的新项目中尝试过这个,只是手动添加 swt 和诸如库之类的库,但出现了同样的错误。
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</parent>
<artifactId></artifactId>
<version>2.0.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name></name>
<description></description>
<dependencies>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-engine</artifactId>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-core</artifactId>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-ui-swt</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.swt</groupId>
<artifactId>org.eclipse.swt.gtk.linux.x86_64</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse</groupId>
<artifactId>jface</artifactId>
<version>3.3.0-I20070606-0010</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
</project>
我是不是漏掉了什么,有什么想法吗?
您需要将 jfxswt.jar
文件添加到您的 class 路径以进行编译和执行。
这可以通过使用系统范围来完成,因为该 jar 文件是 jre/lib
目录下 JDK 的一部分。
<dependency>
<!-- GroupId/ArtifactId/Version doesn't matter unless it clashes. -->
<groupId>jfxswt</groupId>
<artifactId>jfxswt</artifactId>
<version>1.8</version>
<scope>system</scope>
<systemPath>${java.home}/lib/jfxswt.jar</systemPath>
</dependency>
这将指示 maven 将 jre/lib/jfxswt.jar
添加到 class 路径。如果有人使用不同的 JDK 其他地方有那个 jar 但对于 Java 8 你应该没问题,这可能会导致问题。
您必须在执行应用程序时将 jfxswt.jar
添加到您的 class 路径。
在maven中你可以使用exec插件:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>twobuttons.TwoButtons</mainClass>
<additionalClasspathElements>
<!-- The run environment must configure the system jar. -->
<element>${java.home}/lib/jfxswt.jar</element>
</additionalClasspathElements>
</configuration>
</plugin>
备注:
系统范围在 Maven 中已弃用,以支持将文件安装到存储库。上面的解决方案目前工作正常。
jfxswt.jar
的内容可能是某些 SWT 库的一部分,不幸的是我不熟悉 SWT。如果你能在 Maven 仓库中找到那个 jar,而不是仅仅包含它而不是弄乱系统范围。
twobuttons.TwoButtons
class 来自您提到的教程。
我正在尝试使用 FXCanvas 将 JavaFX 集成到 SWT 应用程序中。作为参考,我正在关注 this oracle guide
在我的 IDE 中,这段代码显示错误
/* Create an FXCanvas */
final FXCanvas fxCanvas = new FXCanvas(shell, SWT.NONE) {
@Override
public Point computeSize(int wHint, int hHint, boolean changed) {
getScene().getWindow().sizeToScene();
int width = (int) getScene().getWidth();
int height = (int) getScene().getHeight();
return new Point(width, height);
}
};
错误:
(是的,我输入了正确的点class:org.eclipse.swt.graphics.Point
):
'computeSize(int, int, boolean)' in 'Anonymous class derived from javafx.embed.swt.FXCanvas' clashes with 'computeSize(int, int, boolean)' in 'javafx.embed.swt.FXCanvas'; attempting to use incompatible return type
但是,我不认为这是根本原因...因为当我尝试构建项目时(maven ) 我收到此错误:
package javafx.embed.swt does not exist
。我认为这是真正的问题。
所以在做了一些研究之后,我检查了一些事情,首先,jfxswt jar 看起来应该可以访问:
如果我打开 JAR,您可以看到 FXCanvas 在那里:
我什至尝试手动将 JAR 作为库添加到我的模块中,但仍然不起作用。
这是我的pom.xml,(我特意匿名了某些信息)
我还要提到的是,我在一个没有任何 Maven 依赖项的新项目中尝试过这个,只是手动添加 swt 和诸如库之类的库,但出现了同样的错误。
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</parent>
<artifactId></artifactId>
<version>2.0.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name></name>
<description></description>
<dependencies>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-engine</artifactId>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-core</artifactId>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-ui-swt</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.swt</groupId>
<artifactId>org.eclipse.swt.gtk.linux.x86_64</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse</groupId>
<artifactId>jface</artifactId>
<version>3.3.0-I20070606-0010</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
</project>
我是不是漏掉了什么,有什么想法吗?
您需要将 jfxswt.jar
文件添加到您的 class 路径以进行编译和执行。
这可以通过使用系统范围来完成,因为该 jar 文件是 jre/lib
目录下 JDK 的一部分。
<dependency>
<!-- GroupId/ArtifactId/Version doesn't matter unless it clashes. -->
<groupId>jfxswt</groupId>
<artifactId>jfxswt</artifactId>
<version>1.8</version>
<scope>system</scope>
<systemPath>${java.home}/lib/jfxswt.jar</systemPath>
</dependency>
这将指示 maven 将 jre/lib/jfxswt.jar
添加到 class 路径。如果有人使用不同的 JDK 其他地方有那个 jar 但对于 Java 8 你应该没问题,这可能会导致问题。
您必须在执行应用程序时将 jfxswt.jar
添加到您的 class 路径。
在maven中你可以使用exec插件:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>twobuttons.TwoButtons</mainClass>
<additionalClasspathElements>
<!-- The run environment must configure the system jar. -->
<element>${java.home}/lib/jfxswt.jar</element>
</additionalClasspathElements>
</configuration>
</plugin>
备注:
系统范围在 Maven 中已弃用,以支持将文件安装到存储库。上面的解决方案目前工作正常。
jfxswt.jar
的内容可能是某些 SWT 库的一部分,不幸的是我不熟悉 SWT。如果你能在 Maven 仓库中找到那个 jar,而不是仅仅包含它而不是弄乱系统范围。
twobuttons.TwoButtons
class 来自您提到的教程。