Java在Wayland中的图形用户界面支持

15
我希望在仅支持wayland后端的系统上添加Java GUI支持。我尝试包含OpenJDK-7-jre软件包,但似乎有X11依赖性。 我成功编译了“Openjre-8”软件包并将其包含在我的映像中。但是,它只能运行没有GUI的Java应用程序。当我尝试运行任何基于JAVA SWING API的GUI程序时,我会得到以下错误:
Exception in thread "main" java.awt.HeadlessException                           
        at java.awt.GraphicsEnvironment.checkHeadless(Unknown Source)           
        at java.awt.Window.<init>(Unknown Source)                               
        at java.awt.Frame.<init>(Unknown Source)                                
        at java.awt.Frame.<init>(Unknown Source)                                
        at javax.swing.JFrame.<init>(Unknown Source)                            
        at GuiApp1.<init>(GuiApp1.java:25)                                      
        at GuiApp1.main(GuiApp1.java:20)  

在Wayland上运行Java GUI程序是可能的吗?我们该如何实现?

5个回答

7
我在思考同样的问题时发现了这个问题:我有一个Java Swing应用程序,我希望在Wayland上本地运行它。我不知道是否可能,而其他答案的缺乏似乎表明不可能。
然而,您绝对可以在XWayland下运行Swing应用程序,并在您喜欢的Wayland合成器下运行。您可能会发现这对您的需求足够好。至少在GNOME 3合成器下的初始测试中,它表现良好。
编辑:在继续搜索时,我发现Wayland社区在他们的邮件列表中以相同的方式回答了您的问题,并附加了其他上下文。为了节省其他读者的麻烦,本帖子总结了截至2016年8月的情况:https://lists.freedesktop.org/archives/wayland-devel/2016-August/030832.html

1
我是那封邮件的作者。同时,我创建了JavaFX到Wayland的单片机端口。更多信息请看此处:https://github.com/udevbe/wayland-javafx - Zubzub
{btsdaf} - Alessandro Scarozza
1
@Xan 是的,Red Hat为Wayland提供了一个Swing端口。http://mail.openjdk.java.net/pipermail/caciocavallo-dev/2016-August/000558.html 然而,我不知道它的工作效果如何,以及设置是否容易。 - Zubzub
进展看起来不错 https://bugs.eclipse.org/bugs/show_bug.cgi?id=516841 - user1133275
你知道答案是否改变了吗?我想要运行一个Java应用程序,使用本地的wayland(而不是xwayland),但我不知道是否可能。 - Boiethios

2

我使用 @Zubzub 在另一个回答中发布的 cacio-wayland 解决了问题。

由于我想要使用的程序(IntelliJ IDEA)需要 JDK >=11,因此我必须对 cacio-shared 子目录进行一些更改,并相应地调整 cacio-wayland 以在 JDK11 上运行:

https://github.com/petabyteboy/caciocavallo/commit/81d3254699f6caaa1e9957cae47703e0b18de870

您可以克隆我的存储库、构建库并使用它们来启动您的应用程序。在这个例子中,我启动了 JD-GUI:

# make sure you have the following things installed: openjdk jdk11, cairo, wayland, libxkbcommon, maven, git

git clone https://github.com/petabyteboy/caciocavallo
cd caciocavallo

mvn clean install
# it may fail to generate javadocs, but as long as cacio-wayland/target/cacio-wayland-1.10-SNAPSHOT.jar is generated it should be fine

# the generated native library needs to be renamed to be found at runtime
mkdir natives
cp cacio-wayland/target/nar/cacio-wayland-1.10-SNAPSHOT-amd64-Linux-gpp-jni/lib/amd64-Linux-gpp/jni/libcacio-wayland-1.10-SNAPSHOT.so natives/libcacio-wayland.so

java \
  -cp $PWD/cacio-shared/target/cacio-shared-1.10-SNAPSHOT.jar:$PWD/cacio-wayland/target/cacio-wayland-1.10-SNAPSHOT.jar:/usr/share/jd-gui/jd-gui-1.6.6.jar \
  -Dawt.toolkit=net.java.openjdk.cacio.wayland.WaylandToolkit \
  -Djava.awt.graphicsenv=net.java.openjdk.cacio.wayland.WaylandGraphicsEnvironment  \
  -Djava.library.path=$PWD/natives \
  org.jd.gui.App

如果在您的Wayland合成器中出现SIGSEGV崩溃,请尝试使用Weston。

我主要是想用于JetBrains IDE。在这里https://youtrack.jetbrains.com/issue/JBR-3206上,他们说它将具有本地的Wayland支持。此外,关于Java HiDPI的一些信息可以在此处找到https://wiki.archlinux.org/index.php/HiDPI#Java_applications。 - Ashark

1

对于AWT和Swing,长期解决方案正在OpenJDK的一部分中开发,名为Wakefield。截至2023年初,它尚未出现在官方的OpenJDK版本中。


1

0

我使用cacio-wayland在wayland上运行idea,但在HiDPI下仍然模糊不清。 需要一些步骤来运行:

  1. 在idea目录中使用jbr作为java runtime进行构建
  2. 修复一些构建错误:
    • cacio-shared/src/main/java/sun/awt/peer/cacio/KFMHelper.java:shouldNativelyFocusHeavyweight添加最后一个参数
    • cacio-wayland/pom.xml:修复include/lib路径
    • pom.xml:将maven-install-plugin版本更改为3.0.0-M1
  3. 修复运行时错误: cacio-wayland/src/main/native/wayland.c:display_handle_mode
// is current mode
if ((flags & 0x1) == 0x1) {
  if (width > _display.width)
    _display.width = width;
  if (height > _display.height)
    _display.height = height;
}
获取最大显示尺寸以创建池,避免错误:wl_shm_pool宽度、高度或步幅无效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接