Java 从JScrollPane中的Swing滚动条中删除箭头

Java 从JScrollPane中的Swing滚动条中删除箭头,java,swing,icons,jbutton,jscrollbar,Java,Swing,Icons,Jbutton,Jscrollbar,我想从JScrollPane中的滚动条中删除滚动条箭头按钮。我该怎么做呢?如果您使用的是基本版本的JScrollBar,那么它可能是使用BasicScrollBarUI进行渲染的。我建议您扩展BasicScrollBarUI以创建自定义UI类(如MyBasicScrollBarUI)。按钮是超类中受保护的变量。因此,您需要重写子类中的installComponents()方法,并确保不添加按钮。请参阅下面的代码段,并按照此处的建议隐藏这些行 protected void installCompo

我想从JScrollPane中的滚动条中删除滚动条箭头按钮。我该怎么做呢?

如果您使用的是基本版本的JScrollBar,那么它可能是使用BasicScrollBarUI进行渲染的。我建议您扩展BasicScrollBarUI以创建自定义UI类(如MyBasicScrollBarUI)。按钮是超类中受保护的变量。因此,您需要重写子类中的installComponents()方法,并确保不添加按钮。请参阅下面的代码段,并按照此处的建议隐藏这些行

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我尝试了代码,虽然箭头图标消失了,但按钮仍然存在。我刚刚编辑了我的问题,指定删除按钮。谢谢你的主意。代码只是隐藏了按钮。按钮的占位符空间仍然保留在那里,而且仍然空置。它没有被滚动条占用。