框架显示超小的Java Swing

问题描述 投票:0回答:1

有人可以告诉我为什么我的框架显示得非常小/最小化吗?我以为我只需打包框架即可解决问题,但打包框架似乎对结果没有任何影响。

small frame / frame not showing up properly

这是我的代码:


package welcome.netbeans;

import java.awt.Container;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class WelcomeNetbeans extends JFrame {
    private JLabel welcomeText;

    public static void main(String[] args) {
        WelcomeNetbeans frame = new WelcomeNetbeans();    
        frame.start();
    }
    
    public void start() {
        JPanel panel = new JPanel();
        Container cont = getContentPane();
        cont.add(panel);
        
        setSize(300, 300);
        setTitle("Welcome Netbeans!");
        setLayout(new GridBagLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setFocusable(true);
        
        welcomeText = new JLabel("Wecome Netbeans!");
        welcomeText.setSize(100, 50);
        panel.add(welcomeText);
        
        pack();
        setLocationRelativeTo(null); // center
        setVisible(true);
    }
    
}

非常感谢!

java swing jframe jpanel jcomponent
1个回答
0
投票

您必须了解,大多数布局管理器不考虑组件的大小,而是考虑其首选大小。因此,在组件上调用

setSize(...)
通常不会对您有帮助。您可以在 JLabel 上调用
setPreferredSize(...)
,但这样做仍然会错过重点,并导致僵化的 GUI 可能无法正常工作。我自己经常设置标签的字体,有时给它一个空边框,以避免直接设置尺寸和首选尺寸。有时,我会重写组件的 `getPreferredSize() 方法。

例如:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;

public class MyWelcomeGui extends JPanel {
    private static final float LABEL_FONT_SIZE = 60.0f;
    private static final int PADDING = 60;
    private static final String TITLE = "Wecome To My GUI!";
    private static final Color BACKGROUND = new Color(51, 255, 189);

    MyWelcomeGui() {
        JLabel label = new JLabel(TITLE, SwingConstants.CENTER);
        label.setFont(getFont().deriveFont(Font.BOLD, LABEL_FONT_SIZE));
        Border border = BorderFactory.createEmptyBorder(PADDING, PADDING, PADDING, PADDING);
        label.setBorder(border);
        label.setForeground(Color.BLUE);
        setBackground(BACKGROUND);
        setLayout(new BorderLayout());
        add(label);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame window = new JFrame();
                window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                window.add(new MyWelcomeGui());
                window.pack();
                window.setLocationRelativeTo(null);
                window.setVisible(true);
            }
        });
}
© www.soinside.com 2019 - 2024. All rights reserved.