JScrollBar在Nimbus L&F下不显示滑块

3
我有一个问题,只在Nimbus L&F上发生。如果JList中的项目太多,JScrollBar的拇指将会消失。但在Metal L&F中,拇指始终可见,因为它有一个最小大小。我还检查了Nimbus L&F中的逻辑,确实有相同的最小大小。但它没有产生影响。
请参见下面的代码:
    public static void main(String[] args) {
    for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
        if ("Nimbus".equals(info.getName())) {
            try {
                UIManager.setLookAndFeel(info.getClassName());
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(Demo.class.getName()).log(Level.SEVERE, null, ex);
            } catch (InstantiationException ex) {
                Logger.getLogger(Demo.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                Logger.getLogger(Demo.class.getName()).log(Level.SEVERE, null, ex);
            } catch (UnsupportedLookAndFeelException ex) {
                Logger.getLogger(Demo.class.getName()).log(Level.SEVERE, null, ex);
            }
            break;
        }
    }

    JFrame f = new JFrame("Metal (height 300)");

    String[] ss = new String[100];
    for (int i = 0; i < ss.length; i++) {
        ss[i] = "" + i;
    }

    JList<String> l = new JList<String>();
    l.setListData(ss);

    final JScrollPane jScrollPane = new JScrollPane(l);
    f.getContentPane().add(jScrollPane);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(300, 300);
    f.setVisible(true);
}

当我设置"f.setSize(300, 300);"时,拇指会消失。

enter image description here

但是如果我设置 "f.setSize(300, 400);",拇指将可见。

enter image description here

如何始终显示拇指?

enter image description here


我觉得没问题。你使用的Java版本是什么?你尝试过在EDT(Initial Threads)上下文中初始化UI吗?你有两个屏幕的截图吗? - MadProgrammer
我正在使用1.8.0_60版本。请查看以下截图:http://7xlpns.com1.z0.glb.clouddn.com/Nimbus%20300.png,http://7xlpns.com1.z0.glb.clouddn.com/Nimbus%20400.png,http://7xlpns.com1.z0.glb.clouddn.com/Metal%20300.png。 - Alan
我已经尝试在EDT线程中运行此演示,问题仍然存在。谢谢! - Alan
我正在运行Windows 7/Java 8,没有问题,可能与Windows 8有关的问题... - MadProgrammer
很奇怪。我已经在JDK1.8.0_60的Win7/8上进行了测试。但是它们都有这个问题。它只发生在Nimbus L&F下,metal则没有问题。当您减小框架的高度时,虽然有足够的空间来显示滑块,但滑块会消失。 - Alan
显示剩余3条评论
2个回答

2

你应该尝试这个:

UIManager.getLookAndFeelDefaults().put("ScrollBar.minimumThumbSize", new Dimension(30, 30));

2
尝试将拇指的最小大小设置为1。
getDefaults().put("ScrollBar.minimumThumbSize", new Dimension(29, 1));

谢谢,它有效了。我设置了new Dimension(29, 29)而不是new Dimension(29, 1)来使滑块更大。 - Alan
1
new Dimension(29,29) 是滑块的默认大小(请看这里)。我也尝试将其设置为这个大小,但是在我向测试表格中添加了大量新数据后,滑块仍然消失了。我猜这是因为 Java 无法将其“缩小”。但是当我将高度设置为1时,它对我起作用了。 - San Droid
我又遇到了一些奇怪的事情。在我的另一台电脑上,屏幕分辨率为1900*1000,数字1和29都无法正常工作。但是当我将高度设置大于35时,它就可以正常工作了。也许这种情况与屏幕大小有关,我不确定。无论如何,现在对我来说已经可以工作了。 - Alan
有趣的是,Java对Dimension(29,29)的默认值存在问题,但Ariloum的答案解决了我的问题(java 1.8_073-b02 win8.1)。因此,他的答案应该被标记为正确。 - San Droid

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