Удалить стрелки из Swing Scrollbar в JScrollPane

Я хотел бы удалить кнопки со стрелками полосы прокрутки из полосы прокрутки в JScrollPane. Как бы я это сделал?

3 ответа

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, то она, вероятно, выполняет рендеринг с использованием BasicScrollBarUI. Я бы предложил расширить BasicScrollBarUI для создания пользовательского класса пользовательского интерфейса (например, 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.

Примечание: я не пробовал это сам, но из кода похоже, что он может работать.

Это не самый элегантный способ... но у меня работает

JScrollBar jsb = getHorizontalScrollBar();
        for(Component c : jsb.getComponents()) {
            jsb.remove(c);
        }

Я пошел по этому пути.

  1. Установите политику полосы прокрутки полосы прокрутки, которую вы хотите скрыть, как never
  2. Подражайте этому поведению с помощью MouseWheelListener

Этот способ:

  • Быстро реализовать с очень небольшим количеством строк кода.
  • Сохраняет преимущества L&F.
  • Удалит и кнопки, и панель.

Ниже приведен пример кода для удаленияverticall scroll bar.

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);
        }
    });
Другие вопросы по тегам