2010-12-10 5 views
1

Я работаю над проектом о графическом оформлении (с графическим интерфейсом). У меня есть карта, разделенная на маленькие полигоны. Когда я нажал на один из этих полигонов, я хочу, чтобы он был заполнен определенным цветом. Как я могу это сделать?Заполнение области щелчка в 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

Похоже, что вам необходимо сохранить ColorPolygon в качестве атрибута для будущих визуализаций. Не зная, как вы структурировали свой код пользовательского интерфейса или имеете пример того, что, по вашему мнению, все пошло не так, на него трудно ответить.

+0

Я только что добавил несколько строк в свое первое сообщение. – 629 2010-12-10 02:30:49

+0

Итак, как вы можете видеть выше, цвет сначала установлен на черный, в классе Map, а метод paintComponent() в классе MapPanel использует этот цвет. Когда я добавил строку g.fillPolygon в этот метод, я не могу управлять цветом. Итак, есть ли другой способ, более эффективно использовать метод paintComponent()? – 629 2010-12-10 02:35:20

Смежные вопросы