Java程序在调整大小之前不显示swing元素?

时间:2012-08-30 13:38:19

标签: java swing

有谁可以解释为什么会发生这种情况?  图片在这里Image我无法上传,因为我是新用户。

setTitle("jNote");
    pack();
    setVisible(true);
    setLayout(new BorderLayout());
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    Image icon = Toolkit.getDefaultToolkit().getImage("jNote.png");
    setIconImage(icon);

3 个答案:

答案 0 :(得分:4)

通常内容可以建议GUI大小。如果在添加组件后调用,pack()将使GUI成为显示它们所需的最小大小。

jNote

import java.awt.BorderLayout;
import javax.swing.*;

public class JNote {

    public JComponent getGui(int rows, int cols) {
        JPanel p = new JPanel(new BorderLayout(2,2));

        p.add(new JLabel("1"), BorderLayout.LINE_START);
        JTextArea ta = new JTextArea(rows, cols);
        JScrollPane sp = new JScrollPane(
                ta,
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        p.add(sp);
        p.add(
            new JLabel("Rows: " + rows + "    " + "Columns: " + cols),
            BorderLayout.PAGE_END);

        return p;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable(){
            public void run() {
                int cols = 20;
                JNote jNote = new JNote();
                for (int rows=6; rows>0; rows-=2) { 
                    JFrame f = new JFrame("jNote " + rows + "x" + cols);
                    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                    f.setLocationByPlatform(true);
                    f.add(jNote.getGui(rows, cols));

                    f.pack();
                    f.setVisible(true);
                }
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

答案 1 :(得分:3)

通过首选尺寸设置尺寸时,您必须拨打pack()才能应用首选尺寸。调整框架的大小也包含它,因此您的观察结果。

// component initializations
yourFrame.pack();

答案 2 :(得分:2)

这是你应该做的:

import java.awt.Dimension;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.*;

public class JordanOsborn extends JFrame{
    JPanel panel = new JPanel();


    public JordanOsborn(){
        super("jNote");
        panel.setPreferredSize(new Dimension(400,300));
        add(panel);
        Image icon = Toolkit.getDefaultToolkit().getImage("jNote.png");
        setIconImage(icon);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                new JordanOsborn();
            }

        });
    }
}