SWING禁用或隐藏滚动条,但启用滚轮?

时间:2017-12-19 23:13:47

标签: java swing jtable scrollbar

我想在JScrollPane中禁用或隐藏滚动条,但让用户使用鼠标滚轮向上和向下滚动。 如果我使用verticalScrollBarPolicy(NEVER)它会隐藏滚动条,所以它没关系,但不能使用滚轮。

有什么建议吗? 谢谢!

2 个答案:

答案 0 :(得分:1)

Based on this answer from CodeRanch,从不显示滚动条时禁用滚动。您需要覆盖JScrollBar s isVisible属性以“欺骗”滚动。

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.Scrollable;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                JScrollPane scrollPane = new JScrollPane(new TestPane());
                JScrollBar scrollBar = new JScrollBar(JScrollBar.VERTICAL) {

                    @Override
                    public boolean isVisible() {
                        return true;
                    }
                };
                // if appropriate, uncomment
                //scrollBar.putClientProperty("JScrollBar.fastWheelScrolling", Boolean.TRUE);
                scrollPane.setVerticalScrollBar(scrollBar);
                scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
                frame.add(scrollPane);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel implements Scrollable {

        public TestPane() {
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 800);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            FontMetrics fm = g2d.getFontMetrics();
            Integer lineY = null;
            for (int yPos = fm.getAscent(); yPos < getHeight(); yPos += 30) {
                g2d.drawString(Integer.toString(yPos), 10, yPos + fm.getAscent());
                if (lineY != null) {
                    g2d.drawLine(15, lineY, 15, yPos);
                }
                lineY = yPos + fm.getAscent();
            }
        }

        @Override
        public Dimension getPreferredScrollableViewportSize() {
            return new Dimension(200, 200);
        }

        @Override
        public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
            return 64;
        }

        @Override
        public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
            return 128;
        }

        @Override
        public boolean getScrollableTracksViewportWidth() {
            return false;
        }

        @Override
        public boolean getScrollableTracksViewportHeight() {
            return false;
        }

    }

}

您不需要使用Scrollable,这里仅用于演示目的来测试理论。

然而,这也停止调用getScrollableUnitIncrement,这可能会影响滚动的整体速度,您需要进一步调查

哦,还有其他警告,如果JScrollPane中包含的一个或多个组件注册到MouseWheelListener事件,它将阻止滚动窗格被通知

答案 1 :(得分:0)

基于@MadProgrammer从CodeRanch引用的相同答案,我可以使用更简单的解决方案:

public class OnlyHorizontalJScrollPane extends JScrollPane {
    @Override
    public JScrollBar createVerticalScrollBar() {
        JScrollBar verticalScrollBar = new JScrollPane.ScrollBar(1);
        verticalScrollBar.setPreferredSize(new Dimension(0,0));
        return verticalScrollBar;
    }
}

我在Windows 14 Java上进行了测试。