Java 从JScrollPane中的Swing滚动条中删除箭头
我想从JScrollPane中的滚动条中删除滚动条箭头按钮。我该怎么做呢?如果您使用的是基本版本的JScrollBar,那么它可能是使用BasicScrollBarUI进行渲染的。我建议您扩展BasicScrollBarUI以创建自定义UI类(如MyBasicScrollBarUI)。按钮是超类中受保护的变量。因此,您需要重写子类中的installComponents()方法,并确保不添加按钮。请参阅下面的代码段,并按照此处的建议隐藏这些行Java 从JScrollPane中的Swing滚动条中删除箭头,java,swing,icons,jbutton,jscrollbar,Java,Swing,Icons,Jbutton,Jscrollbar,我想从JScrollPane中的滚动条中删除滚动条箭头按钮。我该怎么做呢?如果您使用的是基本版本的JScrollBar,那么它可能是使用BasicScrollBarUI进行渲染的。我建议您扩展BasicScrollBarUI以创建自定义UI类(如MyBasicScrollBarUI)。按钮是超类中受保护的变量。因此,您需要重写子类中的installComponents()方法,并确保不添加按钮。请参阅下面的代码段,并按照此处的建议隐藏这些行 protected void installCompo
protected void installComponents(){
switch (scrollbar.getOrientation()) {
case JScrollBar.VERTICAL:
incrButton = createIncreaseButton(SOUTH);
decrButton = createDecreaseButton(NORTH);
break;
case JScrollBar.HORIZONTAL:
if (scrollbar.getComponentOrientation().isLeftToRight()) {
incrButton = createIncreaseButton(EAST);
decrButton = createDecreaseButton(WEST);
} else {
incrButton = createIncreaseButton(WEST);
decrButton = createDecreaseButton(EAST);
}
break;
}
scrollbar.add(incrButton); // Comment out this line to hide arrow
scrollbar.add(decrButton); // Comment out this line to hide arrow
// Force the children's enabled state to be updated.
scrollbar.setEnabled(scrollbar.isEnabled());
}
然后,在初始化JScrollBar后的代码中,可以调用setUI()并传入MyBasicScrollBarUI类的实例
注意:我自己还没有试过,但从代码上看,它似乎可以工作
class NoArrowScrollBarUI extends BasicScrollBarUI {
protected JButton createZeroButton() {
JButton button = new JButton("zero button");
Dimension zeroDim = new Dimension(0,0);
button.setPreferredSize(zeroDim);
button.setMinimumSize(zeroDim);
button.setMaximumSize(zeroDim);
return button;
}
@Override
protected JButton createDecreaseButton(int orientation) {
return createZeroButton();
}
@Override
protected JButton createIncreaseButton(int orientation) {
return createZeroButton();
}
@Override
protected void paintTrack(Graphics g, JComponent c, Rectangle trackBounds) {
//own painting if needed
}
@Override
protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) {
//own painting if needed
}
}
卸下按钮,留出空间。我发现将按钮归零是最简单的方法。这不是最优雅的方法。。。但对我来说很有用
JScrollBar jsb = getHorizontalScrollBar();
for(Component c : jsb.getComponents()) {
jsb.remove(c);
}
我就是这样走的
never
mouseweelllistener
- 实现起来很快,只需很少的代码行
- 保留了
的优点L&F
- 将删除按钮和栏
垂直调用滚动条
JScrollPane myScrollPane = new JScrollPane();
//remove the scroll bar you don't want
myScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
JTextPane myJTextArea = new JTextPane();
//myScrollPane.setViewportView(myJTextArea);
myScrollPane.addMouseWheelListener(new MouseWheelListener() {
//this will mimick the behavior of scrolling
public void mouseWheelMoved(MouseWheelEvent e) {
JScrollBar scrollBar = myScrollPane.getVerticalScrollBar();
//capturing previous value
int previousValue = scrollBar.getValue();
int addAmount;
//decide where the wheel scrolled
//depending on how fast you want to scroll
//you can chane the addAmount to something greater or lesser
if(e.getWheelRotation()>0) {
addAmount = 2;
}else {
addAmount = -2;
}
//set the new value
scrollBar.setValue(previousValue + addAmount);
}
});
您可能不应该扩展“基本”UI。如果这样做,则会丢失所有LAF自定义。因此,您可能应该扩展MetalScrollBarUI,或用于LAF的任何UI。@camickr:同意这一点。扩展基本UI只是说明可能的解决方案的最简单方法。@Thimmayya我尝试了代码,虽然箭头图标消失了,但按钮仍然存在。我刚刚编辑了我的问题,指定删除按钮。谢谢你的主意。代码只是隐藏了按钮。按钮的占位符空间仍然保留在那里,而且仍然空置。它没有被滚动条占用。