g.fillPolygon没有更新位置(整数数组不更新......?)

时间:2013-11-28 05:24:02

标签: java arrays swing jpanel paint

尝试使用鼠标在JPanel周围移动自定义多边形时遇到问题;多边形的位置永远不会更新,即使在重绘:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.util.ArrayList;
import java.util.List;

public class Figure extends JPanel{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    public int nPoints = 17, x = 120, y = -60;
    int MouseX, MouseY;
    final static int SIZE = 400;
    public int[] xPoints = {x + 100, x + 85, x + 70, x + 55, x + 40, x + 55, x + 55, x + 40, x + 25, x + 55, x + 55, x + 85, x + 85, x + 115, x + 100, x + 85, x + 85};
    public int[] yPoints = {y + 375, y + 385, y + 340, y + 385, y + 375, y + 335, y + 200, y+ 240, y + 225, y + 185, y + 175, y + 175, y + 185, y + 220, y + 240, y + 200, y + 335, y + 375};
    List<Integer> xList = new ArrayList<Integer>();
    List<Integer> yList = new ArrayList<Integer>();
    static final Figure m = new Figure();

    public static void main(String[] args){
        final JFrame frame = new JFrame();
        frame.setTitle("Figure");
        frame.getContentPane().add(m);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(SIZE, SIZE);
        frame.setResizable(true);
        frame.setVisible(true);
        m.setBackground(Color.darkGray);
    }

    public void mouseMovement(){
        addMouseMotionListener(new MouseMotionAdapter(){
            public void mouseDragged(MouseEvent e){
                if(((e.getX() >= xPoints[8] && e.getX() <= xPoints[13]) && (e.getY() >= yPoints[10] && e.getY() <= yPoints[1])) || ((e.getX() >= (x + 45) && e.getX() <= (x + 45 + SIZE / 8)) && (e.getY() >= (y + 102) && e.getY() <= (y + 102 + SIZE / (57 / 10))))){
                    x = e.getX() - 75;
                    y = e.getY() - 150;
                    repaint();
                }else{
                    repaint();
                }
            }
        });
    }

    public Figure(){
        mouseMovement();
    }

    @Override
    public void paint(Graphics g){
        super.paint(g);
        g.setColor(Color.black);
        g.fillPolygon(xPoints, yPoints, nPoints);
        g.fillPolygon(xPoints, yPoints, nPoints);
        g.setColor(Color.white);
        g.fillOval(x + 45, y + 102, SIZE / 8, SIZE / (57 / 10));
    }

}

我对此的想法是整数数组没有使用我预定义的变量正确更新,但后来我遇到了不知道如何正确更新它的问题。看起来它应该是这样,考虑到椭圆形的位置代表图形的“头部”,但显然我错了,所以我想知道为什么只使用fillPolygon中的数组不起作用,我如何得到更新的位置。非常感谢提前。

1 个答案:

答案 0 :(得分:4)

使用Polygon类使用数组点创建多边形。

然后在绘制方法中,您可以将Graphics对象强制转换为Graphics2D对象,并使用Graphics2D.fill(Shape)方法绘制多边形。

当您需要移动Polygon时,可以使用Polygon类的translate(...)方法。

此外,您不应该重写paint()方法。自定义绘画是通过覆盖paintComponent()方法完成的。