class ShowRadioButton extends JFrame {
// ...
class MessagePanel extends JPanel {
// 繪製邏輯
protected void left() { x -= 50; repaint(); }
public void right() { x += 50; repaint(); }
}
class CreateButtonPanel extends JPanel {
public CreateButtonPanel() {
JButton leftBtn = new JButton("left");
leftBtn.addActionListener(e -> {
MessagePanel mp = new MessagePanel(); // 每次新建實例!
mp.left();
});
// rightBtn 同理
}
}
}
MessagePanel 定義為內部類,但在按鈕事件中 **每次點擊都 `new MessagePanel()`** 創建新實例。這導致:
MessagePanel 實例未收到 repaint() 調用。class ShowRadioButton extends JFrame {
private MessagePanel messagePanel = new MessagePanel(); // 唯一實例
// ...
class CreateButtonPanel extends JPanel {
public CreateButtonPanel() {
leftBtn.addActionListener(e -> messagePanel.left());
rightBtn.addActionListener(e -> messagePanel.right());
}
}
}
repaint() 只是請求重繪,實際繪製在 EDT 執行 paintComponent,確保調用者是可見組件實例。revalidate()。