你能让JScrollBar的背景透明吗?

时间:2015-05-27 22:04:22

标签: java swing transparent jscrollbar

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

我想将滚动条的背景设置为透明,以便只有"抓取器" (或称之为的任何东西)是唯一被绘制的东西。 (它会掩盖它结束的标签的开头,但会少得多。)

有没有办法做到这一点?这是我试过的:

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

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

我正在拍摄的内容就像iPhone的滚动条抓取器在某些应用中悬停在信息上一样。甚至可以使用JScrollBars吗?

3 个答案:

答案 0 :(得分:0)

Transparent JScrollBar可以做到这一点,但请考虑一下:如果列标签与数据相关并且您可以单独滚动它们,那么初学者用户可能无法理解正在发生的事情并将列标签与下方的视觉对齐关联它。要么您需要某种可视指示器,以明确标签与数据断开连接,或者您应该更改标签滚动的方式,从而不会将它们静态地放在一个位置。

以下是我最终如何使标签与数据之间的关系更加清晰:

  1. 我决定通过鼠标悬停来控制标签滚动位置,而不是允许用户独立地和有意地滚动标签。这消除了对突出滚动条的需求。
  2. 我创建了一个类似滚动条的指示器,显示标签所代表的数据部分。
  3. 我突出显示了与其下方数据对应的当前悬停标签,即与数据正确对齐的唯一标签是光标下方(或正上方)的标签。
  4. 当鼠标未悬停(或拖动)列标签时,请勿显示任何标签。这有助于防止用户进行无效的标签/数据关联。
  5. 一些细微差别的注意事项:实现自己的滚动条状指示器有点牵扯,特别是如果您的标签被涂漆然后旋转,因为0的涂料位置位于窗格的底部,但是垂直滚动位置是窗格位于顶部。您必须跟踪垂直滚动位置,以便在光标返回时能够再次恢复它,因为您在鼠标移出时消隐了标签。

答案 1 :(得分:0)

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

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

它利用了:

ButtonlessScrollBarUI.createTransparent()

方法,这是IntelliJ特定方法。但是,如果您可以找到具有透明背景的ScrollBarUI,则可以使用相同的技巧。

答案 2 :(得分:0)

由于起初我在阅读@ 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链接,以获取有关在这些功能中确切执行操作的提示。