0

我发现这个项目在独立运行时工作得很好。但是,当我尝试将其添加到另一个项目中的 JPanel 时(已经在完全相同的项目中执行此操作,但使用我自己的 JFrame 并且工作正常),会出现此错误:

 UIDefaults.getUI() failed: no ComponentUI class for: doubleslider.MThumbSlider[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=,flags=0,maximumSize=,minimumSize=,preferredSize=,isInverted=false,majorTickSpacing=0,minorTickSpacing=0,orientation=HORIZONTAL,paintLabels=false,paintTicks=false,paintTrack=true,snapToTicks=false,snapToValue=true]
    java.lang.Error
        at javax.swing.UIDefaults.getUIError(UIDefaults.java:729)
        at javax.swing.MultiUIDefaults.getUIError(MultiUIDefaults.java:130)
        at javax.swing.UIDefaults.getUI(UIDefaults.java:759)
        at javax.swing.UIManager.getUI(UIManager.java:1002)
        at javax.swing.JSlider.updateUI(JSlider.java:323)
        at doubleslider.MThumbSlider.updateUI(MThumbSlider.java:44)
        at javax.swing.JSlider.<init>(JSlider.java:275)
        at javax.swing.JSlider.<init>(JSlider.java:182)
        at doubleslider.MThumbSlider.<init>(MThumbSlider.java:24)
        at doubleslider.DoubleSlider.<init>(DoubleSlider.java:29)
        at com.einge.scadaremotecontrol.Ventana.<init>(Ventana.java:227)
        at com.einge.scadaremotecontrol.ScadaRemoteControl.<init>(ScadaRemoteControl.java:92)
        at com.einge.scadaremotecontrol.ScadaRemoteControl.main(ScadaRemoteControl.java:197)
    UIDefaults.getUI() failed: no ComponentUI class for: doubleslider.MThumbSlider[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=,flags=0,maximumSize=,minimumSize=,preferredSize=,isInverted=false,majorTickSpacing=0,minorTickSpacing=0,orientation=HORIZONTAL,paintLabels=false,paintTicks=false,paintTrack=true,snapToTicks=false,snapToValue=true]
    java.lang.Error
        at javax.swing.UIDefaults.getUIError(UIDefaults.java:729)
        at javax.swing.MultiUIDefaults.getUIError(MultiUIDefaults.java:130)
        at javax.swing.UIDefaults.getUI(UIDefaults.java:759)
        at javax.swing.UIManager.getUI(UIManager.java:1002)
        at javax.swing.JSlider.updateUI(JSlider.java:323)
        at doubleslider.MThumbSlider.updateUI(MThumbSlider.java:44)
        at doubleslider.MThumbSlider.<init>(MThumbSlider.java:26)
        at doubleslider.DoubleSlider.<init>(DoubleSlider.java:29)
        at com.einge.scadaremotecontrol.Ventana.<init>(Ventana.java:227)
        at com.einge.scadaremotecontrol.ScadaRemoteControl.<init>(ScadaRemoteControl.java:92)
        at com.einge.scadaremotecontrol.ScadaRemoteControl.main(ScadaRemoteControl.java:197)

我的第一个猜测是 MultiTumbSlider 类试图设置与我的 JFrame 不同的外观。有什么解决办法吗?我想不通,我真的需要两个滑块才能有一个时间范围

任何帮助将不胜感激!

4

2 回答 2

3

我不认识这个非常古老的示例中使用的加载方法;它似乎基于当前的外观和感觉。您可以尝试javax.swing.plaf.metal.MetalLookAndFeel显式设置。展望未来,请参阅 Kirill Grouchnikov 的如何编写自定义 Swing 组件,以获取有关现代化代理管道的指导。

于 2012-07-17T17:13:38.230 回答
1

在 Marc Loy 等人的“Java Swing,第 2 版”一书中。al.,在“创建你自己的组件”部分(第 28 章:在引擎盖下摆动),我们在main()方法中有代码行:

UIManager.put(JogShuttleUI.UI_CLASS_ID, "BasicJogShuttleUI");

这将UIDefaults通过通知UIManeger自定义组件的基本 UI 委托的类名。但是请注意,您必须提供完全限定的类名,因为它将由类加载机制定位。

例如,当我使用

UIManager.put(DiagramUI.UI_CLASS_ID, "BasicDiagramUI");

我收到您的问题报告的相同错误。但是,当我将其更改为

UIManager.put(DiagramUI.UI_CLASS_ID, BasicDiagramUI.class.getName());

事情运作良好。编码不错!

于 2016-09-12T17:38:19.793 回答