你能让JScrollBar的背景透明吗?



我有一系列独立于下面矩阵中显示的数据滚动的列标签。我可以让整个滚动条透明除了悬停。标签正好在数据的上方,我喜欢这样,但是,在悬停时,除非我移动垂直滚动条(我宁愿不这样做),否则滚动条会模糊所有标签的开头。

我想把滚动条的背景设置为透明的,这样只有"抓取器"(或不管它叫什么)是唯一被绘制的东西。(它会模糊标签的开头,但效果会好得多。)

有办法吗?下面是我的尝试:

Color bg = new Color(255,255,255,0);
colLabelScroll.setBackground(bg);

这似乎不能使滚动条的背景透明。

我拍摄的是像iPhone的滚动条抓取器悬停在一些应用程序的信息。这在JScrollBars中可能吗?

Transparent JScrollBar可以做到这一点,但考虑到这一点:如果列标签与数据相关,并且您可以独立滚动它们,初学者可能不明白发生了什么,并将列标签与它下面的视觉对齐联系起来。要么你需要某种视觉指示器,让它清楚地表明标签与数据是断开的,要么你应该改变标签滚动的方式,使它们永远不会静态地留在一个地方。

我是这样让标签和数据之间的关系更清晰的:

  1. 我决定通过鼠标悬停来控制标签的滚动位置,而不是允许用户独立地有意地滚动标签。这样就不需要引人注目的滚动条了。
  2. 我创建了一个类似滚动条的指示器,用于显示标签所代表的数据部分。
  3. 我突出显示了当前悬停的标签,对应于它下面的数据,也就是说,唯一与数据正确对齐的标签是在光标下面(或正上方)的标签。
  4. 当鼠标不在列标签上悬停(或拖动)时,不显示任何标签。这有助于防止用户无效的标签/数据关联。

一些细微的注意事项:实现您自己的类似滚动条的指示器有点涉及,特别是如果您的标签被绘制然后旋转,因为绘制位置0在窗格的底部,而窗格的垂直滚动位置在顶部。您必须跟踪垂直滚动位置,以便能够在光标返回时再次恢复它,因为您在鼠标退出时将标签清空。

在为IntelliJ开发插件时,我使用了:

scrollPane.getVerticalScrollBar().setUI(ButtonlessScrollBarUI.createTransparent());

它利用了:

ButtonlessScrollBarUI.createTransparent()

方法,它是IntelliJ特有的方法。然而,如果你能找到一个具有透明背景的ScrollBarUI,你可以使用相同的技巧。

因为我在阅读@hepcat72的回答后,一开始有点迷失了自己,所以我发布了关于BasicScrollBarUI类的一点解释:

JScrollBar scrollbar = scrollPaneConversation.getVerticalScrollBar();
scrollbar.setUI(new BasicScrollBarUI(){
    // This function returns a JButton to be used as the increase button
    // You could create your own customized button or return an empty(invisible) button 
    @Override
    protected JButton createIncreaseButton(int orientation){
    }
    // Same as above for decrease button
    @Override
    protected JButton createDecreaseButton(int orientation){
    }
    // This function paints the "track" a.k.a the background of the scrollbar
    // If you want no background just return from this function without doing anything
    // If you want a custom background you can paint the 'Graphics g' object as you like
    @Override
    protected void paintTrack(Graphics g, JComponent c, Rectangle trackBounds)
    {
    }
    // This function paints the "thumb" a.k.a the thingy that you drag up and down
    // You can override this function to paint it as you like
    @Override
    protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds)
    {
    }
});

请参考@hepcat72发布的Transparent JScrollBar链接,以获得有关在这些函数中确切做什么的提示。

相关内容

  • 没有找到相关文章