用Java填充单击区域
我正在做一个关于图形着色(使用GUI)的项目。我有一张分为小多边形的地图。当我点击其中一个多边形时,我希望它被特定的颜色填充。我该怎么做 我的事件监听器都准备好了。我能认出我点击的区域。所以,我对要给哪个多边形着色没有问题。我尝试了fillPolygon(Polygon p)方法来实现这一点,但没有成功。实际上,它填充了我想要的多边形;但是,当我点击另一个多边形时,它给新的多边形上色并擦除旧的多边形。我想我知道是什么导致了这一点:我在paintComponent(Graphics g)方法中放置了fillPolygon(Polygon p),每次启动程序时,它都会在我的面板上绘制完整的地图 我的Map类中有这个方法,用于在面板上绘制地图用Java填充单击区域,java,colors,polygon,fill,Java,Colors,Polygon,Fill,我正在做一个关于图形着色(使用GUI)的项目。我有一张分为小多边形的地图。当我点击其中一个多边形时,我希望它被特定的颜色填充。我该怎么做 我的事件监听器都准备好了。我能认出我点击的区域。所以,我对要给哪个多边形着色没有问题。我尝试了fillPolygon(Polygon p)方法来实现这一点,但没有成功。实际上,它填充了我想要的多边形;但是,当我点击另一个多边形时,它给新的多边形上色并擦除旧的多边形。我想我知道是什么导致了这一点:我在paintComponent(Graphics g)方法中放置
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 */
}
import java.awt.*;
导入javax.swing.JPanel;
导入javax.swing.*;
导入java.awt.event.*;
公共类映射面板扩展了JPanel{
private Map theMap;//要着色的区域集合
/*这里还有一些其他变量*/
公共地图面板(){
theMap=newmap();
这个.addMouseListener(新的ClickListener());
}
公共JMenuBar getMenu(){
/*主面板、菜单等的一系列线条*/
}
公共组件(图形g){
超级组件(g);
地图绘制(g);
如果(j!=null)
g、 fillPolygon(j.getPolygon());
}
私有类ClickListener实现MouseListener
{
公共无效鼠标按下(鼠标事件)
{
p点=event.getPoint();
对于(int i=0;i
如何单独使用fillPolygon(多边形p)方法
提前谢谢 听起来您需要将
多边形的颜色
保存为属性,以便将来进行渲染。如果不知道您的UI代码是如何构造的,或者没有一些您认为出错的地方的示例,很难回答。
正如Tim所说,您需要一个辅助数据结构来跟踪每个多边形的颜色和选择状态。看我的
packagepolygonexample;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Polygon;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.util.LinkedList;
导入java.util.List;
导入java.util.Random;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
/**
*
*@作者ndunn
*/
公共类PolygoneExample扩展了JPanel{
私有静态最终int NUM_多边形=20;
私有列表多边形;
专用静态最终整数宽度=600;
专用静态最终内部高度=600;
私有随机=新随机();
公共多边形示例(){
多边形=新的LinkedList();
对于(int i=0;ipackage 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;
}
}
}