修复JFrame中JPanels的JScrollPane的大小

时间:2015-02-21 00:36:47

标签: java swing jframe jpanel jscrollpane

我是Java Swing的初学者,我正在尝试在JScrollPanel中放置多个JPanel。问题是,JSCrollPannel(在代码中命名为jp)不应该填充所有JFrame,但即使我使用setSize()修改大小并使用setMaximalSize()修复最大大小也是如此。有什么麻烦?如何使JSCrollPane小于JFrame?

    package GUI;
    import java.awt.*;
    import javax.swing.*;

    public class MultiPanels {
    private JScrollPane getContent() {
    Dimension d = new Dimension(300,200);
    JPanel panel = new JPanel(new GridBagLayout());
    GridBagConstraints gbc= new GridBagConstraints();
    gbc.weightx = 1.0;
    gbc.fill = GridBagConstraints.HORIZONTAL;


    gbc.gridwidth = GridBagConstraints.REMAINDER;
    panel.add(getPanel(d,  6, Color.red), gbc);
    panel.add(getPanel(d,  4, Color.green.darker()), gbc);
    panel.add(getPanel(d,  4, Color.orange), gbc);
    panel.add(getPanel(d, 12, Color.blue), gbc);
    panel.add(getEmptyPanel(d), gbc);

    return new JScrollPane(panel);
}

private JScrollPane getPanel(Dimension d, int rows, Color color) {
    JPanel panel = new JPanel(new GridBagLayout());
    panel.setBackground(color);
    GridBagConstraints gbc= new GridBagConstraints();
    gbc.insets = new Insets(10,5,10,5);
    gbc.weightx = 1.0;
    for(int i = 0, j = 1; i < rows; i++) {
        gbc.gridwidth = GridBagConstraints.RELATIVE;
        panel.add(new JButton(String.valueOf(j++)), gbc);
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        panel.add(new JButton(String.valueOf(j++)), gbc);
    }
    JScrollPane scrollPane = new JScrollPane(panel);
    scrollPane.setPreferredSize(d);
    return scrollPane;
}

private JScrollPane getEmptyPanel(Dimension d) {
    JPanel panel = new JPanel() {
        protected void paintComponent(Graphics g) {
            int w = getWidth();
            int h = getHeight();
            GradientPaint gp = new GradientPaint(0,0,Color.red,
                                                 0,h,Color.cyan);
            ((Graphics2D)g).setPaint(gp);
            g.fillRect(0,0,w,h);
        }
    };

    panel.setPreferredSize(new Dimension(300,400));
    JScrollPane scrollPane = new JScrollPane(panel);
    scrollPane.setPreferredSize(d);
    return scrollPane;
    }

    public static void main(String[] args) {
    JFrame f = new JFrame();

    JScrollPane jp =  new MultiPanels().getContent();
    jp.setSize(new Dimension(200, 200));
    jp.setMaximumSize(new Dimension(200,200));
    jp.setPreferredSize(new Dimension(200,200));


    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.add(jp);


    f.setSize(400,400);
    f.setLocation(200,200);
    f.setResizable(false);
    f.setVisible(true);
    }
    }

1 个答案:

答案 0 :(得分:1)

任何时候事情的大小或安排不正确,你都要看看布局。

一般来说,花更多时间:

http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

具体而言,JPanelJFrame的默认布局是BorderLayout,这确实是一个非常简单的布局管理器。当您添加到由BorderLayout管理的组件而不说明在哪里时,它会自动添加到中心并填充以使用所有可用空间:

http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html#border

可以使用&#34; none&#34; (绝对定位)作为布局,但这几乎总是一个坏主意,你想要考虑你真正想要用JFrame中的其余空间做什么:也许通过让新的子组件,以及他们自己的大小要求占据主要面板正在吞咽的一些空间。