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

Java Swing GUI 開發:JFrame 視窗狀態監聽與基礎元件佈局實戰

     編輯:Java 相關知識

前言:Swing 仍是 Java 桌面開發基石

雖然 JavaFX、TornadoFX、Compose for Desktop 等新框架層出不窮,但 Swing 因**成熟穩定、JDK 內建、海量存量專案**仍佔據企業級桌面應用大多數。本文透過兩個完整範例,示範 JFrame 視窗狀態監聽(最小化/最大化/還原)與基礎元件佈局(JPanel、JScrollPane、JTextArea)。

範例 1:監聽視窗狀態變化

核心 API:WindowStateListener

  • windowStateChanged(WindowEvent e):視窗狀態改變時觸發。
  • e.getNewState() 返回位元遮罩:NORMAL=0、ICONIFIED=1、MAXIMIZED_HORIZ=2、MAXIMIZED_VERT=4、MAXIMIZED_BOTH=6。
  • 組合狀態需用位元運算判斷,如 (state & MAXIMIZED_BOTH) != 0。

完整程式碼


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

public class WindowStateDemo extends JFrame {
    public WindowStateDemo() {
        setTitle("視窗狀態監聽示範");
        setSize(400, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null); // 置中

        addWindowStateListener(new WindowStateListener() {
            @Override public void windowStateChanged(WindowEvent e) {
                int state = e.getNewState();
                if ((state & Frame.ICONIFIED) != 0) {
                    System.out.println("→ 視窗最小化");
                } else if ((state & Frame.MAXIMIZED_BOTH) != 0) {
                    System.out.println("→ 視窗最大化");
                } else if (state == Frame.NORMAL) {
                    System.out.println("→ 視窗還原/正常");
                }
            }
        });

        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(WindowStateDemo::new); // 確保在 EDT 建立 UI
    }
}

關鍵點提醒

  1. SwingUtilities.invokeLater():所有 Swing 元件建構/修改必須在事件派發執行緒(EDT)執行,否則會出現競態條件、繪製異常。
  2. setLocationRelativeTo(null):視窗置中於螢幕,體驗更好。
  3. 狀態位元遮罩可組合,例如最大化時 getNewState() == 6 (MAXIMIZED_HORIZ | MAXIMIZED_VERT)。

範例 2:基礎佈局 — 含捲軸的文字區域

元件層級結構

JFrame (BorderLayout)
 └─ JPanel (FlowLayout/GridLayout)
      └─ JScrollPane
           └─ JTextArea

完整程式碼


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

public class TextAreaDemo {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("文字區域示範");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(400, 300);
            frame.setLocationRelativeTo(null);

            JPanel panel = new JPanel(new BorderLayout()); // 邊界佈局,讓捲軸填滿

            JTextArea textArea = new JTextArea(10, 30);
            textArea.setText("這裡是初始文字內容...\n支援多行\n自動換行需設定 setLineWrap(true)");
            textArea.setLineWrap(true);
            textArea.setWrapStyleWord(true);

            JScrollPane scrollPane = new JScrollPane(textArea,
                    JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                    JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
            panel.add(scrollPane, BorderLayout.CENTER);

            frame.add(panel);
            frame.setVisible(true);
        });
    }
}

常用 JTextArea 設定

方法說明
setLineWrap(true)自動換行(預設 false,單行超寬不換行)
setWrapStyleWord(true)按單字換行而非字元截斷(英文環境重要)
setEditable(false)唯讀模式(日誌顯示常用)
setFont(new Font("Monospaced", Font.PLAIN, 14))等寬字體,適合程式碼/日誌
append(str)高效追加文字(比 setText + getText 快)

進階補充:JFrame 關閉流程控制


setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
    @Override public void windowClosing(WindowEvent e) {
        int opt = JOptionPane.showConfirmDialog(frame,
                "確定要離開?", "確認", JOptionPane.YES_NO_OPTION);
        if (opt == JOptionPane.YES_OPTION) {
            // 執行清理:儲存設定、關閉連線池、停止執行緒...
            System.exit(0);
        }
    }
});

結語

Swing 雖屬舊世代,但其事件模型(EDT、Listener 模式)、佈局管理器(BorderLayout、GridBagLayout、MigLayout)、元件生態極為成熟。掌握 JFrame 生命週期、視窗狀態監聽、捲軸佈局、EDT 規則,即可應對絕大多數桌面工具、管理後台、監控儀表板的開發需求。新專案若需現代 UI、CSS 樣式、GPU 加速,可評估 JavaFX 或 Compose for Desktop。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved