簡體   English   中英

如何在Java Swing中自動擴展框架的高度

[英]How to auto extend the height of frame in java swing

我創建了一個具有500,500尺寸的小框架,在我的框架中還添加了面板,我還動態添加了標簽和文本框,我在面板中添加了10個標簽,顯示正確,但是我將添加上面的另外5個標簽和文本框添加標簽意味着5個標簽和文本框被隱藏之后,因此如何自動擴展框架高度

調用.pack()方法應該可以解決問題:

公共無效包()

使此窗口的大小適合其子組件的首選大小和布局。 如果任意一個尺寸小於上一次調用setMinimumSize方法指定的最小尺寸,則窗口的寬度和高度將自動放大。 如果窗口和/或其所有者仍無法顯示,則在計算首選大小之前,將它們都顯示。 計算窗口大小后,將對其進行驗證。

有一些重要的規則和必需的知識,具體的LayoutManager如何與min,max和PreferredSize一起使用來自其子級

  1. 我強烈建議為已經可見的Container添加(re)validate()repaint()

  2. 使用JScrollPane作為添加到JFrame / JDialog / JWindow第一個JComponent並使用它來確定JFrame最大大小(最好是從顯示分辨率出發),如果超過最大大小,請不要使用pack() ,否則容器邊界可能不在屏幕上

代碼示例,必須在第2點添加規則。

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;

public class AddComponentsAtRuntime {

    private JFrame f;
    private Container panel;
    private JCheckBox checkValidate, checkReValidate, checkRepaint, checkPack;

    public AddComponentsAtRuntime() {
        JButton b = new JButton();
        b.setBackground(Color.red);
        b.setBorder(new LineBorder(Color.black, 2));
        b.setPreferredSize(new Dimension(600, 10));
        panel = new Container();
        panel.setLayout(new GridLayout(0, 1));
        panel.add(b);
        f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(panel, "Center");
        f.add(getCheckBoxPanel(), "South");
        f.setLocation(200, 200);
        f.pack();
        f.setVisible(true);
    }

    private JPanel getCheckBoxPanel() {
        checkValidate = new JCheckBox("validate");
        checkValidate.setSelected(false);
        checkReValidate = new JCheckBox("revalidate");
        checkReValidate.setSelected(false);
        checkRepaint = new JCheckBox("repaint");
        checkRepaint.setSelected(false);
        checkPack = new JCheckBox("pack");
        checkPack.setSelected(false);
        JButton addComp = new JButton("Add New One");
        addComp.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JButton b = new JButton();
                b.setBackground(Color.red);
                b.setBorder(new LineBorder(Color.black, 2));
                b.setPreferredSize(new Dimension(600, 10));
                panel.add(b);
                makeChange();
                System.out.println(" Components Count after Adds :" + panel.getComponentCount());
            }
        });
        JButton removeComp = new JButton("Remove One");
        removeComp.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                int count = panel.getComponentCount();
                if (count > 0) {
                    panel.remove(0);
                }
                makeChange();
                System.out.println(" Components Count after Removes :" + panel.getComponentCount());
            }
        });
        JPanel panel2 = new JPanel();
        panel2.add(checkValidate);
        panel2.add(checkReValidate);
        panel2.add(checkRepaint);
        panel2.add(checkPack);
        panel2.add(addComp);
        panel2.add(removeComp);
        return panel2;
    }

    private void makeChange() {
        if (checkValidate.isSelected()) {
            panel.validate();
        }
        if (checkReValidate.isSelected()) {
            panel.revalidate();
        }
        if (checkRepaint.isSelected()) {
            panel.repaint();
        }
        if (checkPack.isSelected()) {
            f.pack();
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                AddComponentsAtRuntime makingChanges = new AddComponentsAtRuntime();
            }
        });
    }
}

沒有布爾值,可以將其設置為true來使框架自動增長。

您可能希望在每次添加內容時都執行內容面板的getPreferredSize() ,並執行frame.setSize(...)來適應新組件。

這是一個演示

public class FrameTestBase {

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

        t.getContentPane().setLayout(new GridLayout(-1, 1));

        t.add(new JButton(new AbstractAction("Add label") {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                t.getContentPane().add(new JLabel("hello"));

                // Auto-adjust height.
                Dimension dim = t.getContentPane().getPreferredSize();
                dim.width = 500;
                t.setSize(dim);
            }
        }));

        t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        t.setSize(500, 500);
        t.setVisible(true);
    }
}

暫無
暫無

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

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