你能让 JScrollBar 的背景透明吗?

Can you make the background of a JScrollBar transparent?

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

我想将滚动条的背景设置为透明,这样只有 "grabber"(或它的名称)是唯一绘制的东西。 (它会掩盖它结束的标签的开头,但会少很多。)

有什么办法吗?这是我尝试过的:

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

这似乎没有使滚动条的背景透明。

我正在拍摄的是 iPhone 的滚动条抓取器如何在某些应用程序中悬停在信息上。使用 JScrollBars 甚至可能吗?

Transparent JScrollBar 可以做到,但考虑一下:如果列标签与数据相关并且您可以独立滚动它们,则初学者可能无法理解发生了什么并将列标签与视觉上的任何内容相关联在它下面对齐。要么您需要某种视觉指示器来清楚地表明标签与数据断开连接,要么您应该更改标签的滚动方式,使其永远不会静态地留在 1 个位置。

以下是我最终使标签和数据之间的关系更清晰的方法:

  1. 我决定通过鼠标悬停来控制标签滚动位置,而不是允许用户独立和有意地滚动标签。这消除了对干扰滚动条的需要。
  2. 我创建了一个类似滚动条的指示器,用于显示标签所代表的数据部分。
  3. 我突出显示了与其下方数据对应的当前悬停标签,即唯一与数据正确对齐的标签是光标下方(或正上方)的标签。
  4. 当鼠标未悬停在列标签上(或从中拖动)时,不显示任何标签。这有助于防止用户进行无效的 label/data 关联。

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

在为 IntelliJ 开发插件时,我完成了它:

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

它利用了:

ButtonlessScrollBarUI.createTransparent()

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

由于在阅读@hepcat72 的回答后我一开始有点迷茫,所以我发布了一些关于 BasicScrollBarUI 的解释 class:

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 link 以获取有关在这些函数中确切执行的操作的提示。