这个java类路径设置正确吗?

这个java类路径设置正确吗?,java,swing,Java,Swing,我真的不知道我错过了什么。我已经花了很多时间阅读如何设置类路径,但这仍然不起作用,在这一点上,我确信这一定是一些琐碎的事情,让我无法理解 我正在尝试使用swing来更改swing应用程序的外观。我按照创建jar文件的方法,当这些文件不起作用时,我下载并尝试了。我向开发人员提出了一个问题,并确认我正确地遵循了。演示代码如下: import java.awt.*; import javax.swing.*; import java.awt.image.*; public class Walkthr

我真的不知道我错过了什么。我已经花了很多时间阅读如何设置类路径,但这仍然不起作用,在这一点上,我确信这一定是一些琐碎的事情,让我无法理解

我正在尝试使用swing来更改swing应用程序的外观。我按照创建jar文件的方法,当这些文件不起作用时,我下载并尝试了。我向开发人员提出了一个问题,并确认我正确地遵循了。演示代码如下:

import java.awt.*;
import javax.swing.*;
import java.awt.image.*;

public class Walkthrough extends JFrame {
  public Walkthrough() {
    super("Sample app");
    this.setLayout(new FlowLayout());
    this.add(new JButton("button"));
    this.add(new JCheckBox("check"));
    this.add(new JLabel("label"));

    this.setIconImage(new BufferedImage(1, 1, BufferedImage.TYPE_4BYTE_ABGR));
    this.setSize(new Dimension(250, 80));
    this.setLocationRelativeTo(null);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }

  public static void main(String[] args) {
    JFrame.setDefaultLookAndFeelDecorated(true);

    SwingUtilities.invokeLater(() -> {
        Walkthrough w = new Walkthrough();
        w.setVisible(true);
    });
  }
}
java -Dswing.defaultlaf=org.pushingpixels.substance.api.skin.SubstanceBusinessLookAndFeel -cp .:tmp/radiance-substance-2.5-SNAPSHOT.jar:tmp/radiance-trident-2.5-SNAPSHOT.jar:tmp/radiance-neon-2.5-SNAPSHOT.jar Walkthrough 
代码首先使用
javac Walkthrough.java编译,然后使用
java Walkthrough
执行。这个很好用。接下来,使用radiance jar来更改外观,这是通过将
swing.defaultlaf
属性设置为使用来自radiance的蒙皮来完成的。这就是它不起作用的地方

我将所有必需的jar复制到
tmp
目录中,其中演练示例位于
tmp
之外。然后,我尝试按如下方式运行应用程序:

import java.awt.*;
import javax.swing.*;
import java.awt.image.*;

public class Walkthrough extends JFrame {
  public Walkthrough() {
    super("Sample app");
    this.setLayout(new FlowLayout());
    this.add(new JButton("button"));
    this.add(new JCheckBox("check"));
    this.add(new JLabel("label"));

    this.setIconImage(new BufferedImage(1, 1, BufferedImage.TYPE_4BYTE_ABGR));
    this.setSize(new Dimension(250, 80));
    this.setLocationRelativeTo(null);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }

  public static void main(String[] args) {
    JFrame.setDefaultLookAndFeelDecorated(true);

    SwingUtilities.invokeLater(() -> {
        Walkthrough w = new Walkthrough();
        w.setVisible(true);
    });
  }
}
java -Dswing.defaultlaf=org.pushingpixels.substance.api.skin.SubstanceBusinessLookAndFeel -cp .:tmp/radiance-substance-2.5-SNAPSHOT.jar:tmp/radiance-trident-2.5-SNAPSHOT.jar:tmp/radiance-neon-2.5-SNAPSHOT.jar Walkthrough 
这导致了以下例外情况:

Exception in thread "AWT-EventQueue-0" java.lang.Error: Cannot load org.pushingpixels.substance.api.skin.SubstanceBusinessLookAndFeel
    at java.desktop/javax.swing.UIManager.initializeDefaultLAF(UIManager.java:1406)
    at java.desktop/javax.swing.UIManager.initialize(UIManager.java:1517)
    at java.desktop/javax.swing.UIManager.maybeInitialize(UIManager.java:1483)
    at java.desktop/javax.swing.UIManager.getUI(UIManager.java:1056)
    at java.desktop/javax.swing.JPanel.updateUI(JPanel.java:126)
    at java.desktop/javax.swing.JPanel.<init>(JPanel.java:86)
    at java.desktop/javax.swing.JPanel.<init>(JPanel.java:109)
    at java.desktop/javax.swing.JPanel.<init>(JPanel.java:117)
    at java.desktop/javax.swing.JRootPane.createGlassPane(JRootPane.java:521)
    at java.desktop/javax.swing.JRootPane.<init>(JRootPane.java:348)
    at java.desktop/javax.swing.JFrame.createRootPane(JFrame.java:279)
    at java.desktop/javax.swing.JFrame.frameInit(JFrame.java:258)
    at java.desktop/javax.swing.JFrame.<init>(JFrame.java:225)
    at Walkthrough.<init>(Walkthrough.java:7)
    at Walkthrough.lambda$main$0(Walkthrough.java:23)
    at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:389)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
所以在这一点上,我肯定我把类路径弄乱了,但我不知道是什么。我在Fedora 28上,我的java版本是:

java version "12.0.1" 2019-04-16
Java(TM) SE Runtime Environment (build 12.0.1+12)
Java HotSpot(TM) 64-Bit Server VM (build 12.0.1+12, mixed mode, sharing)

这与类路径无关,而是与jar库本身有关。我观察到,默认情况下,在我的机器上,字体没有消除锯齿(Fedora28,使用i3Gaps作为窗口管理器)。我想知道这是否有某种关联,并阅读了一些Java运行时环境字体。本质上,字体如下所示:

但使用以下系统属性启动应用程序:
-Dawt.useSystemAAFontSettings=on
修复了以下问题:

事实证明,在启动“辐射漫游”时设置此属性可以使其正常工作:

java-Dawt.useSystemAAFontSettings=on-Dswing.defaultlaf=org.pushingpixels.substance.api.skin.SubstanceBusinessLookAndFeel-cp.:tmp/radiance-substance-2.5-SNAPSHOT.jar:tmp/radiance-trident-2.5-SNAPSHOT.jar:tmp/radiance-neon-2.5-SNAPSHOT.jar演练

删除此属性会导致Java无法加载org.pushingpixels.substance.api.skin.SubstanceBusinessLookAndFeel的错误

阅读有更多的信息。我假设,因为我自定义了Fedora 28设置(我不使用gnome),所以我没有运行
gnome设置守护进程,Java使用该守护进程来获取系统默认值,这在某种程度上是Radiance的问题。。。?不确定

我已经通知了Radiance开发者这件事。如果他提供反馈,我会更新这个答案

更新
开发人员确认库中有一个bug。它已经被修复。

我猜您现在应该降级您的Java版本。按照官方文档尝试使用Java 9,然后逐步升级。@steven35我就此联系了开发人员,Java 9只是构建库所必需的,但它可以使用Java 9及以后的版本。他还确认,他尝试了java 12下的步骤,效果很好。如果你没有使用IDE,你是否在运行时通过
-cp
参数指定类路径?@steven35 Yep,我通过:
java-Dswing.defaultlaf=org.pushingpixels.substance.api.skin.SubstanceBusinessLookAndFeel-cp.:tmp/radiance-substance-2.5-SNAPSHOT.jar:tmp/radiance-trident-2.5-SNAPSHOT.jar:tmp/radiance-neon-2.5-SNAPSHOT.jar演练您的项目是模块化的吗?如果是,那么您是否需要模块描述符(module info.class)中的模块?好东西。你还可以按照我的建议,以编程方式加载look-and-feel,看看是否会产生一个信息更丰富的异常吗?@Gimby-yes我确实尝试过,谢谢;但这次我能够捕获异常并打印其堆栈跟踪。我已将此信息传递给开发人员。