Java g、 fillPolygon未更新位置(整数数组未更新…?)

Java g、 fillPolygon未更新位置(整数数组未更新…?),java,arrays,swing,jpanel,paint,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; i

我在尝试用鼠标围绕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));
    }

}
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.event.MouseMotionAdapter;
导入java.awt.event.MouseMotionListener;
导入java.awt.event.MouseEvent;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入java.util.ArrayList;
导入java.util.List;
公共类数字扩展JPanel{
/**
* 
*/
私有静态最终长serialVersionUID=1L;
公共点nPoints=17,x=120,y=-60;
int MouseX,MouseY;
最终静态整数大小=400;
公共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};
公共整数[]y点={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 xList=new ArrayList();
List yList=新的ArrayList();
静态最终图形m=新图形();
公共静态void main(字符串[]args){
最终JFrame=新JFrame();
框架。设置标题(“图”);
frame.getContentPane().add(m);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架.设置尺寸(尺寸,尺寸);
frame.setresizeable(true);
frame.setVisible(true);
m、 挫折背景(颜色:暗灰色);
}
公共无效鼠标移动(){
addMouseMotionListener(新的MouseMotionAdapter(){
公共无效鼠标标记(鼠标事件e){

如果((e.getX()>=xPoints[8]&&e.getX()=yPoints[10]&&e.getY()=(x+45)&&e.getX()=(y+102)&&e.getY()使用
Polygon
类使用点数组创建多边形

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

需要移动多边形时,可以使用多边形类的
translate(…)
方法


另外,您不应该重写paint()方法。自定义绘制是通过重写
paintComponent()
方法来完成的。

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

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

需要移动多边形时,可以使用多边形类的
translate(…)
方法



另外,您不应该重写paint()方法。自定义绘制是通过重写
paintComponent()来完成的
方法。

列表不是数组……你永远不会改变你的观点。@Polywhill先生:我还没有使用
xList
yList
,如果你指的是这两个
int[]
,我开始理解这些被称为数组。或者我错了,我应该编辑掉吗?你必须自己做。:/array不会自动更新。当你说
={x+100…
这与声明函数不同,它只是执行加法并分配元素。更改
x
不会更改数组。每次都必须重新计算它们。
={…}
仅在声明后立即工作,即
int[]someArray={…}
。否则,您必须声明
新的
,如
someArray=newint[]{…}
。最好逐个检查并分配每个元素,因为这样你就不会每次坐标改变时都实例化一个新对象。更妙的是@camickr建议使用多边形。列表不是数组……你永远不会改变你的点。@polywhill先生:我没有使用
xList
yList
但是,如果这就是你所指的。如果你指的是两个
int[]
,我开始理解它们被称为数组。或者我错了,我应该把它们编辑掉吗?你必须自己去做。:/array不会自我更新。当你说
={x+100…
这与声明函数不同,它只是执行加法并分配元素。更改
x
不会更改数组。每次都必须重新计算它们。
={…}
仅在声明后立即工作,即
int[]someArray={…}
。否则,您必须声明
新的
,如
someArray=newint[]{…}
。最好逐个检查并分配每个元素,因为这样你就不会每次坐标改变时都实例化一个新对象。更妙的是@camickr建议使用多边形。我该如何做呢?只需
Graphics2D g2d=new Graphics2D();
Graphics2D g2d=(Graphics2D)g.create();
是“正确”的方法。然后在
paintComponent
的末尾调用
g2d.dispose();
。根据您正在执行的操作,您也可以将其强制转换为
Graphics2D=(Graphics2D)g;
(如果这样做,请不要调用dispose)。我假设“适当”是指传统的,效果最好。如果我只是使用
paint
而不是
paintComponent
,这是个问题吗?似乎这两种方法都应该有效……当你通过变换和旋转等方式更改图形对象的属性时,你会创建一个新的图形对象。如果你只是使用tGraphics object to paint您不需要创建副本。
如果我只使用paint而不使用paintComponent会有问题吗?
-正确的方法是覆盖paintComponent(),这就是为什么我花时间提到它。请阅读Swing教程中关于的部分。我将如何进行此操作?只需
Graphics2D g2d=new