Как скрыть кнопки со стрелками в JScrollBar

Мне нужно скрыть кнопки со стрелками java.awt.Scrollbar(VERTICAL) в приложении AWT. Кто-нибудь знает, как этого можно достичь?

Я видел пример здесь, но код просто скрывает кнопки. Свободное место для кнопок все еще остается; она не занята полосой прокрутки.

Чтобы быть более точным, вот скриншот того, чего я должен достичь. Я не уверен, в каком направлении идти об этом.

Обновление: я искал решение в AWT. Но теперь я открыт для предложений и в Swing.

желаемый эффект

2 ответа

Решение

Попробуйте это.. он заменяет обычные кнопки на вертикальной полосе прокрутки на кнопки размером 0x0.

Это действительно ограничивает ваш внешний вид, хотя:(

JScrollPane scroller = new JScrollPane(mainPane);
scroller.setPreferredSize(new Dimension(200,200));
// ... etc
scroller.getVerticalScrollBar().setUI(new BasicScrollBarUI()
    {   
        @Override
        protected JButton createDecreaseButton(int orientation) {
            return createZeroButton();
        }

        @Override    
        protected JButton createIncreaseButton(int orientation) {
            return createZeroButton();
        }

        private JButton createZeroButton() {
            JButton jbutton = new JButton();
            jbutton.setPreferredSize(new Dimension(0, 0));
            jbutton.setMinimumSize(new Dimension(0, 0));
            jbutton.setMaximumSize(new Dimension(0, 0));
            return jbutton;
        }
    });

Обновление: извините, это свинг-решение

Используя Nimbus Look and Feel, вы можете использовать это для удаления кнопок со стрелками:

    UIManager.getLookAndFeelDefaults().put(
        "ScrollBar:\"ScrollBar.button\".size", 0);
    UIManager.getLookAndFeelDefaults().put(
        "ScrollBar.decrementButtonGap", 0);
    UIManager.getLookAndFeelDefaults().put(
        "ScrollBar.incrementButtonGap", 0);

Вот полный пример:

public class ScrollDemo extends JFrame {

    public ScrollDemo() {

        String[] columnNames = {"Column"};
        Object[][] data = {
                {"A"},{"B"},{"C"},{"D"},{"E"},{"F"},
                {"A"},{"B"},{"C"},{"D"},{"E"},{"F"},
                {"A"},{"B"},{"C"},{"D"},{"E"},{"F"},
                {"A"},{"B"},{"C"},{"D"},{"E"},{"F"},
                {"A"},{"B"},{"C"},{"D"},{"E"},{"F"},
        };

        add(new JScrollPane(new JTable(data, columnNames)));
        pack();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {

                try {
                    UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
                } catch (Exception e) {
                    // No Nimbus
                }
                UIManager.getLookAndFeelDefaults().put(
                        "ScrollBar:ScrollBarThumb[Enabled].backgroundPainter",
                        new FillPainter(new Color(127, 169, 191)));
                UIManager.getLookAndFeelDefaults().put(
                        "ScrollBar:ScrollBarThumb[MouseOver].backgroundPainter",
                        new FillPainter(new Color(127, 169, 191)));
                UIManager.getLookAndFeelDefaults().put(
                        "ScrollBar:ScrollBarTrack[Enabled].backgroundPainter",
                        new FillPainter(new Color(190, 212, 223)));

                UIManager.getLookAndFeelDefaults().put(
                        "ScrollBar:\"ScrollBar.button\".size", 0);
                UIManager.getLookAndFeelDefaults().put(
                        "ScrollBar.decrementButtonGap", 0);
                UIManager.getLookAndFeelDefaults().put(
                        "ScrollBar.incrementButtonGap", 0);

                new ScrollDemo();
            }
        });
    }

}

Код для Painter используемый:

public class FillPainter implements Painter<JComponent> {

    private final Color color;

    public FillPainter(Color c) { color = c; }

    @Override
    public void paint(Graphics2D g, JComponent object, int width, int height) {
        g.setColor(color);
        g.fillRect(0, 0, width-1, height-1);
    }

}
Другие вопросы по тегам