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+)。
cannot resolve symbol: class TableModel
cannot resolve symbol: class AbstractTableModel
TableModel dataModel = new AbstractTableModel() { ... }
解決:import javax.swing.table.*;
addActionListener(ActionListener) cannot be applied to (Jsubnetframe)
cancelb.addActionListener(this);
原因:Jsubnetframe 未實作 ActionListener。
解決:implements ActionListener 並覆寫 actionPerformed,或使用獨立監聽器。
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() 或事件處理中。
| 事件類型 | 監聽器介面 | 必須實作方法 | 註冊方式 |
|---|---|---|---|
| 鍵盤 | KeyListener | keyPressed, keyReleased, keyTyped | comp.addKeyListener(this) |
| 焦點 | FocusListener | focusGained, focusLost | comp.addFocusListener(this) |
| 滑鼠點擊/進出 | MouseListener | mouseClicked, pressed, released, entered, exited | comp.addMouseListener(this) |
| 滑鼠移動/拖曳 | MouseMotionListener | mouseMoved, mouseDragged | comp.addMouseMotionListener(this) |
| 按鈕動作 | ActionListener | actionPerformed | btn.addActionListener(this) |
transferFocus():移至下一個可聚焦元件。requestFocus() / requestFocusInWindow():強制指定元件取得焦點 (JDK 1.4+ 建議用後者)。FocusTraversalPolicy 決定,可自訂。TableCellRenderer,在 getTableCellRendererComponent 依 TableModel 資料決定顏色。參考 Swing Examples。table.revalidate() + table.repaint(),或 table.reshape() (舊版)。JComponent 子類別,覆寫 paintComponent 繪製浮層內容。setOpaque(false) 確保透明。rootPane.setGlassPane(glassPane) 安裝至根面板。glassPane.setVisible(true) 啟用。dispatchEvent 或使用 redispatchMouseEvent 將事件轉發給底層元件 (見原文代碼)。Swing 開發核心在於:理解事件派發機制、正確實作監聽器介面、善用 Adapter 簡化代碼、掌握焦點與繪製管線。遇到編譯錯誤優先檢查 import 與介面契約,運行異常則用除錯器追蹤事件流向。