我有一系列独立于下面矩阵中显示的数据滚动的列标签。我可以让整个滚动条透明除了悬停。标签正好在数据的上方,我喜欢这样,但是,在悬停时,除非我移动垂直滚动条(我宁愿不这样做),否则滚动条会模糊所有标签的开头。
我想把滚动条的背景设置为透明的,这样只有"抓取器"(或不管它叫什么)是唯一被绘制的东西。(它会模糊标签的开头,但效果会好得多。)
有办法吗?下面是我的尝试:
Color bg = new Color(255,255,255,0);
colLabelScroll.setBackground(bg);
这似乎不能使滚动条的背景透明。
我拍摄的是像iPhone的滚动条抓取器悬停在一些应用程序的信息。这在JScrollBars中可能吗?
Transparent JScrollBar可以做到这一点,但考虑到这一点:如果列标签与数据相关,并且您可以独立滚动它们,初学者可能不明白发生了什么,并将列标签与它下面的视觉对齐联系起来。要么你需要某种视觉指示器,让它清楚地表明标签与数据是断开的,要么你应该改变标签滚动的方式,使它们永远不会静态地留在一个地方。
我是这样让标签和数据之间的关系更清晰的:
- 我决定通过鼠标悬停来控制标签的滚动位置,而不是允许用户独立地有意地滚动标签。这样就不需要引人注目的滚动条了。
- 我创建了一个类似滚动条的指示器,用于显示标签所代表的数据部分。
- 我突出显示了当前悬停的标签,对应于它下面的数据,也就是说,唯一与数据正确对齐的标签是在光标下面(或正上方)的标签。
- 当鼠标不在列标签上悬停(或拖动)时,不显示任何标签。这有助于防止用户无效的标签/数据关联。
一些细微的注意事项:实现您自己的类似滚动条的指示器有点涉及,特别是如果您的标签被绘制然后旋转,因为绘制位置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
链接,以获得有关在这些函数中确切做什么的提示。