Windows外观下JScrollPane与滚动条间出现白色线条如何消除
问题现象

可以看到容器与滚动条之间存在一条白色线条:
运行环境:Windows 10,Java 1.8
解决方案
这条白线可以消除,它是Windows系统原生LookAndFeel下,JScrollPane默认自带的1像素内边框、以及中间视口(Viewport)的默认边距导致的。你之前只设置了滚动条和JScrollPane本身的透明属性,漏了视口和JScrollPane默认边框的处理,补充以下配置即可:
- 移除
JScrollPane的默认系统边框 - 关闭视口的默认背景绘制和边距
- 可选:提前在UIManager中全局禁用ScrollPane的默认边框
修复后完整代码
public class WhitePixels { public static void main(String[] args) throws Exception { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); // 全局禁用ScrollPane默认边框,可选配置 UIManager.put("ScrollPane.border", BorderFactory.createEmptyBorder()); JFrame f = new JFrame("A"); JPanel container = new JPanel(); container.setLayout(new BoxLayout(container, BoxLayout.Y_AXIS)); for (int i = 0; i < 15; i++) { container.add(new JButton("A")); } f.setLayout(new BorderLayout()); JScrollPane sp = new JScrollPane(container); // 移除JScrollPane本身的边框 sp.setBorder(BorderFactory.createEmptyBorder()); sp.setOpaque(false); // 处理视口的属性 sp.getViewport().setOpaque(false); sp.getViewport().setBorder(BorderFactory.createEmptyBorder()); // 处理滚动条属性 sp.getVerticalScrollBar().setOpaque(false); sp.getVerticalScrollBar().setBorder(BorderFactory.createEmptyBorder()); f.add(sp); f.pack(); f.setSize(200, 200); f.setLocationByPlatform(true); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } }
修改后重新编译运行即可消除容器和滚动条之间的白色线条。
内容的提问来源于stack exchange,提问作者George Z.
相关产品推荐
相关产品推荐

