Swing:具有自主内容大小的 JscrollPane

Swing: JscrollPane with autonomous content size

我有一个带有布局的面板(例如,BorderLayout),中间有一个 JScrollPaneJScrollPane里面有内容(一个JPanel)

问题是,当 JScrollPane 调整大小时,我不想调整其内容的大小。例如,如果布局增加 JScrollPane,我希望它的内容尽可能小(并且只占据窗格的一部分),但它会调整大小以适合窗格。

我还需要一个机会减少窗格内的内容并手动增加它(增加没有问题,他们在减少)。

那么,如何实现内容大小独立?当然,我需要保存滚动功能,如果内容会大于 JScrollPane.

这是一个简单的例子:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TestScroll extends JFrame {

public TestScroll() {
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    setSize(500, 500);
    init();
}

private void init() {
    setLayout(new BorderLayout());

    // Inner panel
    final JPanel innerPanel = new JPanel();
    innerPanel.setOpaque(true);
    innerPanel.setBackground(Color.BLUE);
    innerPanel.setPreferredSize(new Dimension(200, 200));

    // Scroll
    final JScrollPane scrollPane = new JScrollPane(innerPanel);
    add(scrollPane, BorderLayout.CENTER);

    // Buttons
    JPanel buttonPanel = new JPanel();
    JButton extendButton = new JButton("Extend inner panel");
    extendButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            innerPanel.setPreferredSize(new Dimension(innerPanel.getWidth() * 2,
                    innerPanel.getHeight() * 2));
            innerPanel.revalidate();
        }
    });
    buttonPanel.add(extendButton);

    JButton reduceButton = new JButton("Reduce inner panel");
    reduceButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            innerPanel.setPreferredSize(new Dimension(innerPanel.getWidth() / 2,
                    innerPanel.getHeight() / 2));
            innerPanel.revalidate();
        }
    });
    buttonPanel.add(reduceButton);

    add(buttonPanel, BorderLayout.NORTH);

    setVisible(true);
}

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            new TestScroll();
        }
    });
}

}

所以,问题陈述:

  1. 我不希望内部面板拉伸到窗格(但窗格可以通过外部布局调整大小,因此面板必须保持其大小)。
  2. 我希望能够手动缩小内部面板,使其只占据滚动窗格的一部分。
  3. 当然,当内部面板大于滚动窗格时,我想保存滚动功能。

您是否遵循了 Andrew link 关于使用布局管理器来实现您的目标的说法?

这是另一个简单的例子:

//final JScrollPane scrollPane = new JScrollPane(innerPanel);
JPanel outer = new JPanel();
outer.add( innerPanel );
final JScrollPane scrollPane = new JScrollPane(outer);