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

时间:2015-02-18 02:22:43

标签: java swing jscrollpane

我的面板上有一个布局(例如,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. 当然,我希望在内部面板大于滚动窗格时保存滚动功能。

1 个答案:

答案 0 :(得分:2)

您是否关注过Andrew关于使用布局管理器实现目标的链接?

这是另一个简单的例子:

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