2010-12-10 112 views
1

我正在開發一個關於圖形着色(使用GUI)的項目。我有一張分成小多邊形的地圖。當我點擊其中一個多邊形時,我希望它填充特定的顏色。我怎樣才能做到這一點?在Java中填充單擊的區域

我得到了我的事件監聽器全部設置。我可以識別我點擊的區域。所以,我對將要着色的多邊形沒有問題。我嘗試了fillPolygon(Polygon p)方法來做到這一點,但沒有奏效。實際上,它填充了我想要的多邊形;但是,當我點擊另一個多邊形時,它爲新的多邊形着色並擦除較舊的多邊形。我想我知道是什麼導致了這種情況:我將fillPolygon(Polygon p)放置在paintComponent(Graphics g)方法中,該方法每次啓動程序時都會在面板上繪製完整的地圖。

我在我的Map類中有這個方法來在面板上繪製地圖。

public void draw (Graphics screen) { 
    screen.setColor (Color.BLACK); 
    for (Polygon thePoly : theShapes) 
     screen.drawPolygon (thePoly.getPolygon()); 
} 

此外,我在我的MapPanel類中有以下幾行。

import java.awt.*; 
import javax.swing.JPanel; 
import javax.swing.*; 
import java.awt.event.*; 

public class MapPanel extends JPanel { 

    private Map theMap;   // collection of Regions to be colored 

    /* Some other variables here */ 

    public MapPanel() { 
     theMap = new Map(); 
     this.addMouseListener(new ClickListener()); 
    } 

    public JMenuBar getMenu() { 
     /* Bunch of lines for the main panel, menus etc... */ 
    } 

    public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    theMap.draw (g); 
    if(j != null) 
     g.fillPolygon(j.getPolygon()); 
    } 

    private class ClickListener implements MouseListener 
    { 
     public void mousePressed (MouseEvent event) 
     { 
     Point p = event.getPoint(); 

     for(int i = 0; i < theMap.theShapes.size(); i++){ 
      if(theMap.theShapes.get(i).getPolygon().contains(p)) { 
       j = theMap.theShapes.get(i); 
      } 
     } 
     repaint(); 
     } 
     public void mouseClicked (MouseEvent event) {} 
     public void mouseReleased (MouseEvent event) {} 
     public void mouseEntered (MouseEvent event) {} 
     public void mouseExited (MouseEvent event) {} 
    } 

    /* Other listener classes */ 
} 

如何分別使用fillPolygon(Polygon p)方法?

在此先感謝。

回答

1

alt text

蒂姆說,你需要一個輔助數據結構來跟蹤每個多邊形的顏色和選擇狀態的。看我example code here

package polygonexample; 

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Polygon; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.util.LinkedList; 
import java.util.List; 
import java.util.Random; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

/** 
* 
* @author ndunn 
*/ 
public class PolygonExample extends JPanel { 

    private static final int NUM_POLYGONS = 20; 

    private List<MapPolygon> polygons; 

    private static final int WIDTH = 600; 
    private static final int HEIGHT = 600; 
    private Random random = new Random(); 
    public PolygonExample() { 

     polygons = new LinkedList<MapPolygon>(); 
     for (int i = 0; i < NUM_POLYGONS; i++) { 
      int x1 = random.nextInt(WIDTH); 
      int x2 = random.nextInt(WIDTH); 
      int x3 = random.nextInt(WIDTH); 

      int y1 = random.nextInt(HEIGHT); 
      int y2 = random.nextInt(HEIGHT); 
      int y3 = random.nextInt(HEIGHT); 

      int r = random.nextInt(255); 
      int g = random.nextInt(255); 
      int b = random.nextInt(255); 
      Color randomColor = new Color(r,g,b); 

      polygons.add(new MapPolygon(new int[]{x1,x2,x3}, new int[]{y1,y2,y3}, 3, randomColor)); 
     } 

     addMouseListener(new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       for (MapPolygon mapPiece : polygons) { 
        if (mapPiece.contains(e.getPoint())) { 
         mapPiece.setSelected(!mapPiece.isSelected()); 
         repaint(); 
         break; 
        } 
       } 
      } 
     }); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(WIDTH, HEIGHT); 
    } 



    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     final Color outlineColor = Color.BLACK; 
     for (MapPolygon mapPiece : polygons) { 
      if (mapPiece.isSelected()) { 
       g.setColor(mapPiece.getFillColor()); 
       g.fillPolygon(mapPiece); 
      } 
      else { 
       g.setColor(outlineColor); 
       g.drawPolygon(mapPiece); 
      } 
     } 
    } 



    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     JPanel panel = new PolygonExample(); 
     frame.getContentPane().add(panel); 
     frame.pack(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    private class MapPolygon extends Polygon { 

     private boolean selected; 
     private Color fillColor; 

     public MapPolygon(int[] xpoints, int[] ypoints, int npoints, Color color) { 
      super(xpoints, ypoints, npoints); 
      this.fillColor = color; 
      this.selected = false; 
     } 

     public Color getFillColor() { 
      return fillColor; 
     } 

     public void setFillColor(Color fillColor) { 
      this.fillColor = fillColor; 
     } 

     public boolean isSelected() { 
      return selected; 
     } 

     public void setSelected(boolean selected) { 
      this.selected = selected; 
     } 
    } 

} 
1

聽起來好像您需要保存PolygonColor作爲未來渲染的屬性。不知道你是如何構建你的UI代碼的,或者是你認爲事情發生錯誤的地方的樣本,這很難回答。

+0

我剛剛在我的第一條消息中添加了一些行。 – 629 2010-12-10 02:30:49

+0

因此,正如您在上面看到的那樣,Map類中的顏色最初設置爲黑色,MapPanel類中的paintComponent()方法使用該顏色。當我在該方法中添加g.fillPolygon行時,我無法控制顏色。那麼,有沒有其他方法可以更有效地使用paintComponent()方法? – 629 2010-12-10 02:35:20