Wayland上的Java GUI支持

Wayland上的Java GUI支持,java,swing,wayland,Java,Swing,Wayland,我想在我的系统上包括Java GUI支持,它只支持wayland后端。我试图包括OpenJDK-7-jre包,但它似乎具有X11依赖性。 我成功编译了“Openjre-8”包,并将其包含在我的映像中。但是,它只能运行没有GUI的Java应用程序。当我尝试运行任何基于JAVA SWING API的GUI程序时,会出现以下错误: Exception in thread "main" java.awt.HeadlessException

我想在我的系统上包括Java GUI支持,它只支持wayland后端。我试图包括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)  
线程“main”java.awt.HeadlessException中的异常 位于java.awt.GraphicsEnvironment.checkHeadless(未知源) 在java.awt.Window。(未知源) 位于java.awt.Frame。(未知源) 位于java.awt.Frame。(未知源) 在javax.swing.JFrame。(未知源) 在GuiApp1。(GuiApp1.java:25) 位于GuiApp1.main(GuiApp1.java:20)
可以在wayland上运行Java GUI程序吗?我们如何做到这一点?

我发现了这个问题,同时也在想同样的事情:我有一个Java Swing应用程序,我想在Wayland上本机运行。我不知道这是否可能,而缺乏其他答案似乎表明这是不可能的

但是,您完全可以在XWayland下运行Swing应用程序,并在您首选的Wayland合成器下运行该应用程序。你可能会发现这足以满足你的需要。至少在GNOME3合成器下的初始测试中,它运行良好


编辑:在继续我的搜索时,我发现Wayland社区在他们的邮件列表上以同样的方式回答了你的问题,并提供了额外的上下文。为了避免其他读者的麻烦,这篇文章总结了截至2016年8月的情况:

这是有可能的。AWT代表“抽象”窗口工具包。AWT有几个扩展,其中对等方是QT或GTK,而不是默认的JDK

Qt:

Gtk:


请注意,这些源代码很旧,可能需要一些修订才能使用最新的JDK。

我使用cacio wayland@Zubzub作为对另一个答案的评论解决了这个问题

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

您可以克隆我的存储库,构建库并使用它们启动应用程序。在本例中,我启动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故障,试试威斯顿


我是那封信的作者。同时,我还为wayland创建了一个单镜头javafx端口。这里有更多信息:@Zubzub有任何swing解决方案吗?@Xan是的,redhat为wayland提供了一个swing端口。然而,我不知道它工作得有多好,或者设置起来有多容易。进展似乎不错。你知道答案是否改变了吗?我想用原生wayland(不是xwayland)运行Java应用程序,但我不知道这是否可行。我也希望它主要用于JetBrains IDE。在这里,他们说,它将有本土韦兰的支持。另外,这里还有一些关于JavaHidpi的信息