将视口宽度设置为滚动窗格宽度

时间:2019-06-12 11:43:39

标签: java swing jscrollpane

有没有一种方法可以将JScrollPane视口的宽度固定为其所有者(JScrollPane)的宽度。我的目标是一个JScrollPane,它可以向下滚动,但是视口的宽度被压缩/设置为JScrollPane的大小。

我尝试手动设置视口的大小,但是由于我使用GridLayout来布局组件,所以它失败了。我还尝试了GridBagLayout并将约束设置为视口及其组件。我还禁用了水平滚动条。

我对Java FX宽度不熟悉。

1 个答案:

答案 0 :(得分:2)

您只需要为面板实现Scrollable接口即可。这是一个示例:

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Rectangle;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.Scrollable;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

/**
 * <code>ScrollableExample</code>.
 */
public class ScrollableExample implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new ScrollableExample());
    }

    @Override
    public void run() {
        JPanel scrollPanel = new ScrollablePanel();
        scrollPanel.setLayout(new GridLayout(20, 1));
        for (int i = 0; i < 20; i++) {
            scrollPanel.add(new JLabel("It's a simple label to test whether scrolling works " + i));
        }
        JFrame frm = new JFrame("Test scrolling");
        frm.add(new JScrollPane(scrollPanel));
        frm.setSize(220, 200);
        frm.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        frm.setLocationRelativeTo(null);
        frm.setVisible(true);
    }

    private static class ScrollablePanel extends JPanel implements Scrollable {

        @Override
        public Dimension getPreferredScrollableViewportSize() {
            return getPreferredSize();
        }

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

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

        @Override
        public boolean getScrollableTracksViewportWidth() {
            // no horizontal scroll bar
            return true;
        }

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

    }
}