java - Java中填充点击区域

标签 java colors polygon fill

我正在开发一个关于图形着色(使用 GUI)的项目。我有一张 map ,分为小多边形。当我单击其中一个多边形时,我希望它用特定的颜色填充。我怎样才能做到这一点?

我的事件监听器已全部设置完毕。我可以识别我点击的区域。所以,我对要为哪个多边形着色没有问题。我尝试了 fillPolygon(Polygon p) 方法来做到这一点,但它不起作用。实际上,它填充了我想要的多边形;但是,当我单击另一个多边形时,它会为新多边形着色并删除旧多边形。我想我知道是什么原因造成的:我将 fillPolygon(Polygon p) 放置在 PaintComponent(Graphics g) 方法中,每次启动程序时,该方法都会在面板上绘制完整的 map 。

我的 Map 类中有这个方法,用于在面板上绘制 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) 方法?

提前致谢。

最佳答案

alt text

正如 Tim 所说,您需要一个辅助数据结构来跟踪每个多边形的颜色和选择状态。看我的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;
        }
    }

}

关于java - Java中填充点击区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4405037/

相关文章:

delphi - 为什么我的自定义绘制 ListView 上会出现白色的列分隔符?

javascript - 如何通过连接 Google map 中的外部点来创建多边形

java - 如何在 Eclipse 编辑器中实现 ' Search Google for "Text"' 之类的功能

java - 如何使用依赖注入(inject)模式实现类常量静态字段声明

java - 使用 JComboBox Java Swing 选择颜色

r - 按固定距离缩小 SF 多边形

algorithm - 任何形状四边形的最小边界框或凸包?

Java 线程 - 线程局部变量

Java 将 'Excel Date Serial Number' 转换为 'DateTime'

qt - 进度条周围有不同的文字颜色?