Удалить стрелки из 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);
}
Я пошел по этому пути.
- Установите политику полосы прокрутки полосы прокрутки, которую вы хотите скрыть, как
never
- Подражайте этому поведению с помощью
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);
}
});