如何使用其父JPanel来调整JScrollPane的大小

ryv*_*age 1 java swing jpanel jscrollpane miglayout

我的问题类似于这个问题(如何在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);
}
Run Code Online (Sandbox Code Playgroud)

我希望JScrollPane每当父级JPanel调整大小时调整大小.基本上,我希望绿色边框与红色边框对齐.现在,绿色边框保持相同的大小,无论红色边框(除非你调整太小).

cam*_*ckr 5

JPanel outerPanel = new JPanel();
Run Code Online (Sandbox Code Playgroud)

默认情况下,JPanel使用FlowLayout,它始终遵循添加到其中的组件的大小.作为猜测,也许您可​​以使用:

JPanel outerPanel = new JPanel( new BorderLayout() );
Run Code Online (Sandbox Code Playgroud)

A BorderLayout为添加到面板的组件提供所有可用空间.默认情况下,JInternalFrame也使用BorderLayout.因此,由于滚动窗格的所有父组件都使用BorderLayout,因此所有空间都应转到滚动窗格.

当您发布SSCCE时,您应该使用JDK中的类来发布代码来模拟您的问题,以便每个人都可以测试您的SSCCE.