编程语言
首页 > 编程语言> > java-设置包含JScrollPane的容器的大小,以使滚动条不可见

java-设置包含JScrollPane的容器的大小,以使滚动条不可见

作者:互联网

如何设置包含JScrollPane的容器的大小,以使滚动条不出现?

考虑以下SSCCE(使用MigLayout):

public static void main(String[] args) {

    JPanel panel = new JPanel(new MigLayout());

    for(int i = 0; i < 15; i++) {
        JTextArea textArea = new JTextArea();
        textArea.setColumns(20);
        textArea.setRows(5);
        textArea.setWrapStyleWord(true);
        textArea.setLineWrap(true);
        JScrollPane jsp = new JScrollPane(textArea);

        panel.add(new JLabel("Notes" + i));
        panel.add(jsp, "span, grow");
    }
    JScrollPane jsp = new JScrollPane(panel);


    JFrame frame = new JFrame();
    frame.add(jsp);
    frame.pack();
    frame.setSize(jsp.getViewport().getViewSize().width, 500);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

如您所见,我正在尝试找出要放在此行中的内容:

frame.setSize(jsp.getViewport().getViewSize().width, 500);

目的是相对于视口的内容设置宽度,以便不需要水平滚动条.

应该:

编辑:根据camikr的建议,这是结果:

public static final int pref_height = 500;
public static void main(String[] args) {

    JPanel panel = new JPanel(new MigLayout());

    for(int i = 0; i < 15; i++) {
        JTextArea textArea = new JTextArea();
        textArea.setColumns(20);
        textArea.setRows(5);
        textArea.setWrapStyleWord(true);
        textArea.setLineWrap(true);
        JScrollPane jsp = new JScrollPane(textArea);

        panel.add(new JLabel("Notes" + i));
        panel.add(jsp, "span, grow");
    }
    JScrollPane jsp = new JScrollPane(panel) {
        @Override
        public Dimension getPreferredSize() {
            setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
            Dimension dim = new Dimension(super.getPreferredSize().width + getVerticalScrollBar().getSize().width, pref_height);
            setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
            return dim;
        }
    };


    JFrame frame = new JFrame();
    frame.add(jsp);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

对我来说似乎有点骇人听闻,但确实有效.

解决方法:

As you can see, I’m trying to figure out what to put on this line:

不要放任何东西.您不应该尝试管理框架的大小.例如,您的代码甚至没有考虑框架的边框.如果有任何更改,您的代码将更改为使用框架的宽度,而不是滚动窗格的宽度.

更好的解决方案是重写滚动窗格的getPreferredSize()方法以返回super.getPreferredSize()的宽度,然后指定一个合理的高度.您需要确保垂直滚动条始终可见,以使计算正常进行.

然后pack()方法将按预期工作.

标签:miglayout,swing,preferredsize,jscrollpane,java
来源: https://codeday.me/bug/20191029/1961808.html