首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java Swing 中 JOptionPane.showMessageDialog 不彈窗、if 邏輯異常的多重 Bug 修復實錄

     編輯:程式設計綜合問答

問題現象

  • `main` 方法中調用 `JOptionPane.showMessageDialog` 無反應。
  • `if (psw1 == psw2)` 判斷失效,無論密碼是否相同,`System.out.println` 都執行,彈窗卻不出現。

根因分析與修復

問題原因修復
main 中 frame 為非 static靜態方法無法訪問非靜態字段`private static JFrame frame = new JFrame(...);`
缺少 JOptionPane 匯入編譯器未報錯但運行時找不到類`import javax.swing.JOptionPane;`
`JPasswordField.getPassword()` 返回 `char[]`,直接賦值給 `String` 導致編譯錯誤/邏輯錯誤類型不匹配,`==` 比較的是引用而非內容`String psw1 = String.valueOf(password.getPassword());`
`String psw2 = String.valueOf(password2.getPassword());`
字符串比較用 `==`比較引用地址,應用 `equals()``if (psw1.equals(psw2))`

修復後完整代碼(核心部分)

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

public class WinReg implements ActionListener {
    private static JFrame frame = new JFrame("Register");
    private JTextField username = new JTextField();
    private JPasswordField password = new JPasswordField();
    private JPasswordField password2 = new JPasswordField();
    private JButton confirm = new JButton("Confirm");
    private JButton cancel = new JButton("Cancel");

    public WinReg() {
        frame.setSize(600, 400);
        frame.setLayout(new BorderLayout());
        initFrame();
        confirm.addActionListener(this);
        cancel.addActionListener(this);
        frame.setVisible(true);
    }

    private void initFrame() { /* 界面佈局代碼省略 */ }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JOptionPane.showMessageDialog(frame, "Alert", "Alert", JOptionPane.ERROR_MESSAGE);
            new WinReg();
        });
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == confirm) {
            String usn = username.getText();
            String psw1 = String.valueOf(password.getPassword());
            String psw2 = String.valueOf(password2.getPassword());

            if (psw1.equals(psw2)) {
                JOptionPane.showMessageDialog(frame, "Passwords match!");
                System.out.println(psw1);
            } else {
                JOptionPane.showMessageDialog(frame, "Passwords do not match!");
            }
        }
    }
}

關鍵最佳實踐總結

  1. Swing 組件創建與操作**必須在 EDT(事件分發線程)**中進行,使用 `SwingUtilities.invokeLater()`。
  2. `JPasswordField` 取值用 `getPassword()` 返回 `char[]`,轉字符串用 `String.valueOf()` 或 `new String()`。
  3. 字符串內容比較**永遠用 `equals()`**,不要用 `==`。
  4. 靜態方法訪問字段需聲明 `static`,或改為實例方法。
  5. 代碼風格:類名大寫、運算符前後空格、大括號縮進統一,提升可讀性。

修復以上問題後,註冊對話框的密碼驗證與彈窗提示均能正常工作。

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