JFrame 是 Swing 應用的主窗口容器。本文通過完整示例代碼,系統講解窗口標題、尺寸、屏幕居中、圖標設置、背景顏色/圖片、關閉行為、可調整大小等核心配置技巧。
package w160412.wang.main;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class GUI {
public static void main(String[] args) {
JFrame frame = new JFrame("JAVA_GUI_DEMO");
// 1. 設置尺寸
frame.setSize(500, 400);
// 2. 屏幕居中(必須在 setSize 之後調用)
frame.setLocationRelativeTo(null);
// 3. 設置窗口圖標(左上角)
ImageIcon img = new ImageIcon("image/java.png");
frame.setIconImage(img.getImage());
// 等價:frame.setIconImage(Toolkit.getDefaultToolkit().createImage("image/1.png"));
// 4. 設置背景顏色(需作用於 ContentPane)
frame.getContentPane().setBackground(new Color(204, 255, 204));
// 5. 設置背景圖片(使用 JLabel 鋪滿 ContentPane)
Container con = frame.getContentPane();
JLabel bgLabel = new JLabel(new ImageIcon(
Toolkit.getDefaultToolkit().createImage("image/chutian.jpg")
));
bgLabel.setBounds(0, 0, bgLabel.getWidth(), bgLabel.getHeight());
frame.add(bgLabel); // 默認添加到 ContentPane 的 LayeredPane 層
// 6. 關閉操作:退出 JVM
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 7. 禁止用戶拖動邊框調整大小
frame.setResizable(false);
// 8. 顯示窗口
frame.setVisible(true);
}
}
| 需求 | 方法/屬性 | 關鍵點 |
|---|---|---|
| 設置標題 | setTitle(String) | 構造器或後續調用均可 |
| 設置尺寸 | setSize(w, h) / setPreferredSize | 先設尺寸再居中,否則居中失效 |
| 屏幕居中 | setLocationRelativeTo(null) | JDK 1.4+ 一行搞定,內部自動計算屏幕與窗口尺寸 |
| 窗口圖標 | setIconImage(Image) | 需 ImageIcon.getImage() 或 Toolkit.createImage() 獲取 Image 對象 |
| 背景顏色 | getContentPane().setBackground(Color) | 直接 frame.setBackground() 無效,因 JFrame 由 RootPane/ContentPane 組成 |
| 背景圖片 | JLabel + setBounds + add() | JLabel 放圖片,鋪滿 ContentPane;或重寫 paintComponent 繪製 |
| 關閉退出 | setDefaultCloseOperation(EXIT_ON_CLOSE) | 其他選項:HIDE_ON_CLOSE, DISPOSE_ON_CLOSE, DO_NOTHING_ON_CLOSE |
| 固定大小 | setResizable(false) | 禁止最大化/拖動邊框 |
JFrame 由四層組成(由外向內):
add() 默認添加到此處,背景顏色必須設置在這裡。口訣:組件加到 ContentPane,背景塗在 ContentPane,彈出層在 LayeredPane,全屏攔截用 GlassPane。
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = frame.getSize();
int x = (screen.width - frameSize.width) / 2;
int y = (screen.height - frameSize.height) / 2;
frame.setLocation(x, y);
等同於 setLocationRelativeTo(null)。注意:必須先 setSize 再 setLocation。
getClass().getResource() 加載 classpath 資源。setOpaque(false) 且大小覆蓋 ContentPane,或使用 setLayout(null) 絕對定位。getContentPane().setVisible(false) 會隱藏所有業務組件,慎用。