點擊單選按鈕切換紅/黃/藍顏色,但畫布上的矩形顏色不變。程式碼中 `actionPerformed` 內呼叫 `canvas.setColor(Color.red)` 等,但未觸發重繪。
Swing 繪圖機制:`setColor()` 僅修改內部狀態,**不會自動觸發重繪**。必須顯式呼叫 `repaint()` 排程 `paintComponent()` 執行。
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if ("紅".equals(cmd)) {
canvas.setColor(Color.RED);
} else if ("藍".equals(cmd)) {
canvas.setColor(Color.BLUE);
} else if ("黃".equals(cmd)) {
canvas.setColor(Color.YELLOW);
} else if ("選擇顏色".equals(cmd)) {
Color c = JColorChooser.showDialog(this, "選擇顏色", Color.BLUE);
canvas.setColor(c);
}
canvas.repaint(); // 關鍵:排程重繪
}
class ColorCanvas extends JPanel {
private Color color = Color.BLACK;
public void setColor(Color c) { color = c; }
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); // 清除背景
g.setColor(color);
int x = getWidth() / 4;
int y = getHeight() / 4;
g.drawRect(x, y, 250, 100);
}
}
任何修改繪圖狀態(顏色、座標、形狀)後,必須呼叫 `repaint()` 通知 Swing 重繪。改用 `JPanel` + `paintComponent` 為現代 Swing 標準做法。