有人可以告诉我为什么我的框架显示得非常小/最小化吗?我以为我只需打包框架即可解决问题,但打包框架似乎对结果没有任何影响。
这是我的代码:
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);
}
}
非常感谢!
您必须了解,大多数布局管理器不考虑组件的大小,而是考虑其首选大小。因此,在组件上调用
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);
}
});
}