绘制固定多边形的java程序

绘制固定多边形的java程序,java,eclipse,Java,Eclipse,我正在写一个程序,它可以画一个带有特定点的固定多边形,并告诉你鼠标点是在多边形的内部还是外部。我不知道我需要将代码移到哪里才能修复这些错误。我敢肯定有些东西放错地方了。这就是我现在拥有的: import javax.swing.JFrame; import javax.swing.JPanel; import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; impor

我正在写一个程序,它可以画一个带有特定点的固定多边形,并告诉你鼠标点是在多边形的内部还是外部。我不知道我需要将代码移到哪里才能修复这些错误。我敢肯定有些东西放错地方了。这就是我现在拥有的:

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.BorderLayout;
import java.awt.Point;
import java.awt.Polygon;

public class Ch3PA extends JFrame {

    Polygon polygon = new Polygon();
    Point point = new Point(0, 0);
    boolean inside = false;
    private PaintPanel paintPanel = new PaintPanel();

    public PaintPanel()
    {
        add(paintPanel);

        static class PaintPanel extends JPanel
        {       
            polygon.addPoint(40, 20);
            polygon.addPoint(70, 40);
            polygon.addPoint(60, 80);
            polygon.addPoint(45, 45);
            polygon.addPoint(20, 60);

             @addMouseMotionListener(new MouseAdapter()
             {
                public void mouseMoved(MouseEvent e)
                {
                    point.x = e.getX();
                    point.y = e.getY();
                    if (polygon.contains(e.getX(), e.getY()))
                    {
                        inside = true;
                        repaint();
                    }
                    else 
                    {
                        inside = false;
                        repaint();              
                    }
                }
            });
        }
    }

    protected void paintComponent(Graphics g){
        super.paintComponents(g);
        g.drawPolygon(polygon);
        if (inside)
        {
            g.drawString(inside ? "Mouse point is in the polygon"    :          "Mouse point is not in the polygon", point.x, point.y);
            repaint();
        }               
    }

    public static void main(String[] args) {
        Ch3PA frame = new Ch3PA();
        frame.setTitle("Ch3PA");
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(200, 200);
        frame.setVisible(true);         
    }   
}
这个

public class Ch3PA extends JFrame {

    //...
    public PaintPanel()
毫无意义。您已经定义了一个名为Ch3PA的类,但为它定义了一个名为PaintPanel的构造函数

然后在构造函数中定义一个类

static class PaintPanel extends JPanel
{

    polygon.addPoint(40, 20);
    polygon.addPoint(70, 40);
    polygon.addPoint(60, 80);
    polygon.addPoint(45, 45);
    polygon.addPoint(20, 60);



 @addMouseMotionListener(new MouseAdapter()
 {
    public void mouseMoved(MouseEvent e)
    {
        point.x = e.getX();
        point.y = e.getY();

        if (polygon.contains(e.getX(), e.getY()))
        {
            inside = true;
            repaint();
        }
            else 
            {
                inside = false;
                repaint();

        }
    }

});
即使这是合法的,polygon.addPoint也不会工作,因为您试图在可执行上下文方法、构造函数和静态块之外执行代码

@addMouseMotionListener是非法语法,您不应该使用@

不要叫重新油漆;在任何绘制方法中,这都会消耗CPU,导致无休止的重新绘制


你在调用super.paintComponents你的代码毫无意义。您定义了一个名为Ch3PA的类,然后为这个类定义了一个名为PaintPanel的构造函数,这个类似乎是您试图在其中使用的一个内部类……看起来她在复制其他人的代码,但做得很差,而且没有经过思考。这永远不会成为学习编程的一种方法。相反,尝试复制其他程序中的想法,但编写自己的代码。你在哪里添加鼠标侦听器?我会将它添加到JPanel中,没有必要使用未使用的方法。
public class PaintPanel extends JPanel {

    Polygon polygon = new Polygon();
    Point point = new Point(0, 0);
    boolean inside = false;

    public PaintPanel() {

        polygon.addPoint(40, 20);
        polygon.addPoint(70, 40);
        polygon.addPoint(60, 80);
        polygon.addPoint(45, 45);
        polygon.addPoint(20, 60);

        addMouseMotionListener(new MouseAdapter() {
            public void mouseMoved(MouseEvent e) {
                point.x = e.getX();
                point.y = e.getY();

                if (polygon.contains(e.getX(), e.getY())) {
                    inside = true;
                    repaint();
                } else {
                    inside = false;
                    repaint();

                }
            }

        });
    }

    protected void paintComponent(Graphics g) {

        super.paintComponent(g);

        g.drawPolygon(polygon);

        if (inside) {
            g.drawString(inside ? "Mouse point is in the polygon" : "Mouse point is not in the polygon", point.x, point.y);
        }

    }

}
EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
            ex.printStackTrace();
        }

        JFrame frame = new JFrame("Testing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new PaintPanel());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
});
import java.awt.EventQueue;
import java.awt.Graphics;
import javax.swing.JFrame;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Ch3PA extends JFrame {

    public static void main(String[] args) {
        new Ch3PA();
    }

    public Ch3PA() {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                ex.printStackTrace();
            }

            JFrame frame = new JFrame("Testing");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new PaintPanel());
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    });
    }

    public class PaintPanel extends JPanel {

        Polygon polygon = new Polygon();
        Point point = new Point(0, 0);
        boolean inside = false;

        public PaintPanel() {

            polygon.addPoint(40, 20);
            polygon.addPoint(70, 40);
            polygon.addPoint(60, 80);
            polygon.addPoint(45, 45);
            polygon.addPoint(20, 60);

            addMouseMotionListener(new MouseAdapter() {
                public void mouseMoved(MouseEvent e) {
                    point.x = e.getX();
                    point.y = e.getY();

                    if (polygon.contains(e.getX(), e.getY())) {
                        inside = true;
                        repaint();
                    } else {
                        inside = false;
                        repaint();

                    }
                }

            });
        }

        @Override
        protected void paintComponent(Graphics g) {

            super.paintComponent(g);

            g.drawPolygon(polygon);

            if (inside) {
                g.drawString(inside ? "Mouse point is in the polygon" : "Mouse point is not in the polygon", point.x, point.y);
            }

        }

    }
}