簡體   English   中英

修復JFrame中JPanels的JScrollPane的大小

[英]Fix the size of a JScrollPane of JPanels in a JFrame

我是Java Swing的初學者,我試圖在JScrollPanel中放置多個JPanels。 問題是,即使我使用setSize()固定大小和使用setMaximalSize()固定最大大小,JSCrollPannel(在代碼中命名為jp)也不應填滿所有JFrame,但它確實可以填滿。 有什么問題嗎? 如何使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);
    }
    }

任何時候如果大小或排列不正確,您都必須查看“布局”。

通常,將更多時間花在:

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

具體來說, JPanelJFrame的默認布局是BorderLayout ,這確實是一個非常簡單的布局管理器。 當您添加到由BorderLayout管理的組件而沒有說出位置時,它會自動添加到中心並填充以使用所有可用空間:

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

可以使用“無”(絕對位置)作為布局,但這幾乎總是一個壞主意,並且您想考慮一下JFrame其余空間的真正用途:也許是通過讓new子組件根據其自身的尺寸要求,占用了主面板現在占用的一些空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM