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

Java Swing:JscrollPane具有自主内容大小,java,swing,jscrollpane,Java,Swing,Jscrollpane,我有一个带有布局的面板(例如,BorderLayout),其中心有一个JScrollPaneJScrollPane中包含内容(aJPanel) 问题是,当这个JScrollPane调整大小时,我不希望它的内容调整大小。例如,如果布局增加了JScrollPane,我希望它的内容与原来一样小(并且只占据窗格的一部分),但它会调整大小以适应窗格 我还需要一个机会来减少窗格内的内容,并手动增加内容(增加内容没有问题,它们是在减少内容) 那么,如何实现内容大小的独立性呢?当然,如果内容大于JScrollP

我有一个带有布局的面板(例如,
BorderLayout
),其中心有一个
JScrollPane
JScrollPane
中包含内容(a
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();
        }
    });
}
//final JScrollPane scrollPane = new JScrollPane(innerPanel);
JPanel outer = new JPanel();
outer.add( innerPanel );
final JScrollPane scrollPane = new JScrollPane(outer);
}

因此,问题陈述:

  • 我不希望内部面板延伸到窗格(但窗格可以通过外部布局调整大小,所以面板必须保持其大小)
  • 我想能够减少手动内面板,使其只能占用滚动窗格的一部分
  • 当然,当内部面板比滚动面板大时,我想保存滚动功能

  • 你有没有注意到Andrew关于使用布局管理器来实现你的目标的链接

    下面是另一个简单的例子:

    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();
            }
        });
    }
    
    //final JScrollPane scrollPane = new JScrollPane(innerPanel);
    JPanel outer = new JPanel();
    outer.add( innerPanel );
    final JScrollPane scrollPane = new JScrollPane(outer);
    

    为了更快地获得更好的帮助,请发布一个(最小完整可验证示例)或(简短、自包含、正确的示例)。请参阅两个布局,它们将以内容为中心而不拉伸内容。问题是我允许JScrollPane与父级一起拉伸。我只想保持JScrollPane内容的大小稳定,并能够对其进行更改。问题是,如果没有,帮助您将非常困难。非常感谢!我尝试了很多不同布局的例子,但这个概念很简单,也很有效。