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

Java 開發實戰筆記:編譯錯誤、事件處理與 Swing 進階技巧

     編輯:Java 程式設計入門

常見編譯錯誤與解決

1. 介面方法未實作

Jsubnetframe should be declared abstract; it does not define valueChanged(ListSelectionEvent)
public class Jsubnetframe extends JFrame implements ListSelectionListener { ... }

原因:實作 ListSelectionListener 必須覆寫 valueChanged(ListSelectionEvent e)。
解決:補上方法本體,或改用匿名內部類/Lambda (JDK 8+)。

2. 缺少 import 導致符號找不到

cannot resolve symbol: class TableModel
cannot resolve symbol: class AbstractTableModel
TableModel dataModel = new AbstractTableModel() { ... }

解決:import javax.swing.table.*;

3. 事件監聽器介面不匹配

addActionListener(ActionListener) cannot be applied to (Jsubnetframe)
cancelb.addActionListener(this);

原因:Jsubnetframe 未實作 ActionListener。
解決:implements ActionListener 並覆寫 actionPerformed,或使用獨立監聽器。

4. MouseListener 需實作所有方法

Jhpportframe should be declared abstract; it does not define mousePressed(MouseEvent)

解決:實作五個方法 (可留空) 或改用 MouseAdapter 只覆寫需要的:

addMouseListener(new MouseAdapter() {
    @Override public void mousePressed(MouseEvent e) { ... }
});

滑鼠左右鍵判斷

public void mousePressed(MouseEvent evt) {
    int modifiers = evt.getModifiersEx();
    if ((modifiers & InputEvent.BUTTON1_DOWN_MASK) != 0) {
        // 左鍵
    } else if ((modifiers & InputEvent.BUTTON3_DOWN_MASK) != 0) {
        // 右鍵
    }
}

抽象類無法實例化

Image img = new Image(url); // 錯誤:Image 為抽象類
// 正確:
Image img = getImage(url); // Applet/Component 方法
// 或
Image img = Toolkit.getDefaultToolkit().getImage(url);

注意:getImage 為非同步載入,勿放在建構子,應置於 init() 或事件處理中。

各類事件監聽器速查表

事件類型監聽器介面必須實作方法註冊方式
鍵盤KeyListenerkeyPressed, keyReleased, keyTypedcomp.addKeyListener(this)
焦點FocusListenerfocusGained, focusLostcomp.addFocusListener(this)
滑鼠點擊/進出MouseListenermouseClicked, pressed, released, entered, exitedcomp.addMouseListener(this)
滑鼠移動/拖曳MouseMotionListenermouseMoved, mouseDraggedcomp.addMouseMotionListener(this)
按鈕動作ActionListeneractionPerformedbtn.addActionListener(this)

焦點控制技巧

  • transferFocus():移至下一個可聚焦元件。
  • requestFocus() / requestFocusInWindow():強制指定元件取得焦點 (JDK 1.4+ 建議用後者)。
  • 焦點遍歷順序由 FocusTraversalPolicy 決定,可自訂。

JTable 進階

  • 每列不同背景色:自訂 TableCellRenderer,在 getTableCellRendererComponent 依 TableModel 資料決定顏色。參考 Swing Examples。
  • 刷新顯示:table.revalidate() + table.repaint(),或 table.reshape() (舊版)。

玻璃層 實作要點

  1. 建立 JComponent 子類別,覆寫 paintComponent 繪製浮層內容。
  2. setOpaque(false) 確保透明。
  3. rootPane.setGlassPane(glassPane) 安裝至根面板。
  4. glassPane.setVisible(true) 啟用。
  5. 事件轉派:覆寫 dispatchEvent 或使用 redispatchMouseEvent 將事件轉發給底層元件 (見原文代碼)。

總結

Swing 開發核心在於:理解事件派發機制、正確實作監聽器介面、善用 Adapter 簡化代碼、掌握焦點與繪製管線。遇到編譯錯誤優先檢查 import 與介面契約,運行異常則用除錯器追蹤事件流向。

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