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

Java Swing 繪圖顏色變更需呼叫 repaint()

     編輯:程式設計綜合問答

問題

點擊單選按鈕切換紅/黃/藍顏色,但畫布上的矩形顏色不變。程式碼中 `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(); // 關鍵:排程重繪
}

補充最佳實踐

  1. 繼承 `JPanel` 而非 `Canvas`:`JPanel` 雙緩衝、輕量、支援 `paintComponent(Graphics g)`,`Canvas` 是 AWT 重量級元件,混用易出問題。
  2. 覆寫 `paintComponent` 而非 `paint`:
    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);
        }
    }
  3. 使用 `ButtonGroup` 管理單選按鈕:已正確使用。

結論

任何修改繪圖狀態(顏色、座標、形狀)後,必須呼叫 `repaint()` 通知 Swing 重繪。改用 `JPanel` + `paintComponent` 為現代 Swing 標準做法。

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