如何获得一个JScrollPane与其父调整大小的JPanel(How to get a JScro

2019-09-28 01:24发布

我的问题是类似这样的( 如何获得一个JScrollPane内JScrollPanes跟随父母的调整大小 ),但这个问题并不清楚,答案有没有帮助我..

我有这个SSCCE(使用MigLayout ):

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

    JPanel innerPanel = new JPanel(new MigLayout());
    innerPanel.setBorder(new LineBorder(Color.YELLOW, 5));

    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);

        innerPanel.add(new JLabel("Notes" + i));
        innerPanel.add(jsp, "span, grow");
    }
    JScrollPane jsp = new JScrollPane(innerPanel) {
        @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;
        }
    };
    jsp.setBorder(new LineBorder(Color.green, 5));

    JPanel outerPanel = new JPanel();
    outerPanel.setBorder(new LineBorder(Color.RED, 5));
    outerPanel.add(jsp);

    JFrame frame = new JFrame();

    JDesktopPane jdp = new JDesktopPane();
    frame.add(jdp);
    jdp.setPreferredSize(new Dimension(800, 600));
    frame.pack();

    JInternalFrame jif = new JInternalFrame("Title", true, true, true, true);
    jif.pack();
    jif.add(outerPanel);

    jdp.add(jif);
    jif.pack();
    jif.setVisible(true);


    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

我想JScrollPane来调整每当父母JPanel调整大小。 基本上,我想绿色边框与红色边框排队。 眼下,绿色边框保持相同的大小,不管红色边框(除非你调整太小)。

Answer 1:

JPanel outerPanel = new JPanel();

一个JPanel默认使用的FlowLayout总是尊重添加到它的部件的尺寸。 作为一个猜测,也许你可以使用:

JPanel outerPanel = new JPanel( new BorderLayout() );

一个BorderLayout给所有可用的空间添加到面板的组件。 默认情况下,一个是JInternalFrame还采用了BorderLayout的。 如此以来,你的滚动窗格的所有父组件使用BorderLayout的所有空间应该去滚动窗格。

在您发表SSCCE你应该使用从模拟你的问题,让大家可以测试你的SSCCE的JDK类POST代码。



Answer 2:

我注意到这一点并没有使用原来的布局所以这里是一个答案。

为了使JScrollPane调整当父JPanel调整大小,你需要做两件事情。

1)设置面板成长的布局。 这可以用下面的代码。

new MigLayout("",  //Layout Constraints
    "grow",        //Column Constraints
    "grow");       //Row Constraints

2)设置组件成长。 这是在增加一个额外的参数作为简单add()函数。

add(jsp, "grow");

额外
为了使JTextArea ,当你调整列成长JScrollPane ,您可以更改布局只会使第二列的变化。 例如

new MigLayout("",                        //Layout Constraints
    "[/*Column 1*/][grow /*Column 2*/]", //Column Constraints
    "");                                 //Row Constraints

另外,我建议你使用wrap代替span使用下一行的span是指使用这么多列。 例如span 2 //Means use 2 columns for this component 。 当您添加这意味着jspinnerPanel它会成为

innerPanel.add(jsp, "wrap, grow");

编辑SSSCE

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
import net.miginfocom.swing.MigLayout;

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

        JPanel innerPanel = new JPanel(new MigLayout("", "[][grow]", ""));
        innerPanel.setBorder(new LineBorder(Color.YELLOW, 5));

        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);

            innerPanel.add(new JLabel("Notes" + i));
            innerPanel.add(jsp, "wrap, grow");
        }
        JScrollPane jsp = new JScrollPane(innerPanel) {
            @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;
            }
        };
        jsp.setBorder(new LineBorder(Color.green, 5));

        JPanel outerPanel = new JPanel(new MigLayout("", "grow", "grow"));
        outerPanel.setBorder(new LineBorder(Color.RED, 5));
        outerPanel.add(jsp, "grow");

        JFrame frame = new JFrame();

        JDesktopPane jdp = new JDesktopPane();
        frame.add(jdp);
        jdp.setPreferredSize(new Dimension(800, 600));
        frame.pack();

        JInternalFrame jif = new JInternalFrame("Title", true, true, true, true);
        jif.pack();
        jif.add(outerPanel);

        jdp.add(jif);
        jif.pack();
        jif.setVisible(true);


        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}


文章来源: How to get a JScrollPane to resize with its parent JPanel