Java程序不';在调整大小之前,是否不显示swing元素?

Java程序不';在调整大小之前,是否不显示swing元素?,java,swing,Java,Swing,谁能解释一下为什么会发生这种情况? 图片在这里,我无法上传,因为我是新用户 setTitle("jNote"); pack(); setVisible(true); setLayout(new BorderLayout()); setDefaultCloseOperation(EXIT_ON_CLOSE); Image icon = Toolkit.getDefaultToolkit().getImage("jNote.png"); setIcon

谁能解释一下为什么会发生这种情况? 图片在这里,我无法上传,因为我是新用户

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

通过首选尺寸设置尺寸时,必须调用
pack()
,才能应用首选尺寸。调整帧的大小也会对其进行打包,因此您可以进行观察

// component initializations
yourFrame.pack();

这就是你应该做的:

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();
            }

        });
    }
}

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

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);
    }
}


我使用了pack,它使我的窗口非常小。有什么参数需要添加吗?您还需要设置帧的首选大小。Put pack()和setVisible(true)在代码的末尾,+1是关于BorderLayout的约束条件和一个很好的例子:-),还有一个是关于使用
setLocationByPlatform()
:-)@brano88:IMHO的优点的好主意,当使用
JFrame.DISPOSE ON\u CLOSE
,只需使用
JFrame.EXIT\u ON\u CLOSE
,即可隐藏JFrame并使其可用于
垃圾收集,这与使用
System.EXIT(0)相同,您正在故意强制关闭应用程序。+1谢谢,这解决了问题。我正在放背包;在我声明所有组件之前。