首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

[Java 100 例] 010 - 建立可自訂大小與位置的 Swing 視窗

     編輯:Java 程式設計入門

本例示範如何撰寫一個可重用的 JFrame 子類別,透過建構子參數指定標題、寬度、高度,並自動將視窗置中於螢幕。採用 Toolkit 取得螢幕尺寸,計算左上角座標以達到置中效果。

程式碼範例

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

public class MainFrame extends JFrame {
    /**
     * 建構子:初始化視窗屬性並置中顯示
     * @param sTitle 視窗標題
     * @param iWidth 視窗寬度
     * @param iHeight 視窗高度
     */
    public MainFrame(String sTitle, int iWidth, int iHeight) {
        // 取得螢幕尺寸
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        // 設定視窗圖示(需確保圖片路徑正確)
        ImageIcon ii = new ImageIcon("images/middle.gif");
        
        setTitle(sTitle);
        setIconImage(ii.getImage());
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // 關閉視窗時釋放資源
        setSize(iWidth, iHeight);
        
        // 計算置中座標
        int w = getSize().width;
        int h = getSize().height;
        int x = (dim.width - w) / 2;
        int y = (dim.height - h) / 2;
        setLocation(x, y);
        
        setVisible(true); // 顯示視窗
    }

    public static void main(String[] args) {
        // 使用系統外觀風格
        JFrame.setDefaultLookAndFeelDecorated(true);
        new MainFrame("Main Frame Demo", 400, 300);
    }
}

關鍵步驟解析

  1. 繼承 JFrame:自訂視窗類別繼承 javax.swing.JFrame,擁有完整視窗功能。
  2. 建構子參數化:將標題、寬、高參數化,提高複用性。
  3. 螢幕置中算法:
    • 取得螢幕解析度:Toolkit.getDefaultToolkit().getScreenSize()
    • 取得視窗實際大小:getSize()
    • 計算左上角座標:(screenWidth - frameWidth)/2, (screenHeight - frameHeight)/2
    • 設定位置:setLocation(x, y)
  4. 關閉操作:DISPOSE_ON_CLOSE 僅銷毀目前視窗,適合多視窗應用;若為主視窗可用 EXIT_ON_CLOSE 結束程式。
  5. 外觀風格:JFrame.setDefaultLookAndFeelDecorated(true) 啟用 Swing 預設裝飾(需在建立視窗前呼叫)。

常見問題與改進

  • 圖示載入失敗:若 images/middle.gif 不存在,getImage() 回傳 null,不會報錯但無圖示。建議使用 getClass().getResource() 載入資源檔。
  • 高 DPI 螢幕:在高解析度螢幕上,可能需設定 sun.java2d.uiScale 或使用 setAutoRequestFocus(false) 避免縮放問題。
  • 模態對話框:若需阻塞父視窗,改用 JDialog 並設定 setModal(true)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved