关于在java中绘制多边形

关于在java中绘制多边形,java,swing,polygon,java-2d,paintcomponent,Java,Swing,Polygon,Java 2d,Paintcomponent,大家好,我正在努力提高自己关于java2D的知识,首先我要处理的是绘制多边形。但是,我看不到框架上的多边形。我读了一些教程和例子,但正如我所说,我面临着一些问题。下面是绘制多边形的示例代码 import java.awt.Color; import java.awt.Graphics; import java.awt.Polygon; import javax.swing.JFrame; public class jRisk extends JFrame { private JF

大家好,我正在努力提高自己关于java2D的知识,首先我要处理的是绘制多边形。但是,我看不到框架上的多边形。我读了一些教程和例子,但正如我所说,我面临着一些问题。下面是绘制多边形的示例代码

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Polygon;

import javax.swing.JFrame;

public class jRisk extends JFrame {


    private JFrame mainMap;
    private Polygon poly;

    public jRisk(){

        initComponents();

    }

    private void initComponents(){

        mainMap = new JFrame();
        mainMap.setSize(800, 600);
        mainMap.setResizable(false);

        mainMap.setVisible(true);
        mainMap.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        int xPoly[] = {150,250,325,375,450,275,100};
        int yPoly[] = {150,100,125,225,250,375,300};

        poly = new Polygon(xPoly, yPoly, xPoly.length);

    }

    protected void paintComponent(Graphics g){

        super.paintComponents(g);

        g.setColor(Color.BLUE);
        g.drawPolygon(poly);

    }   

    /**
     * @param args
     */
    public static void main(String[] args) {

        new jRisk();

    }

}

JFrame
不会扩展
JComponent
,因此不会覆盖
paintComponent
。您可以通过添加
@Override
注释来检查这一点

要获得此功能,请将
paintComponent
提取到扩展
JComponent
的新类中。不要忘记调用
super.paintComponents(g)
而不是
super.paintComponents(g)

替换

protected void paintComponent(Graphics g){

    super.paintComponents(g);

    g.setColor(Color.BLUE);
    g.drawPolygon(poly);

}   


JFrame
没有方法。添加,您将得到一个编译时错误

1) 使用
JPanel
并覆盖
paintComponent
(您需要将
JPanel
添加到
JFrame
viad
JFrame\add(…)

2) 重写
getPreferredSize()
以返回适合图形对象上图形的正确
尺寸
s,否则它们不会被视为
JPanel
无组件的尺寸为0,0

3) 不要在
JFrame
上调用
setSize
。。。而是使用正确的
LayoutManager
和/或覆盖
getPreferedSize()
并在添加所有组件后但在将其设置为可见之前调用
JFrame上的
pack()

4) 读一读关于

5) 手表类命名方案应以大写字母开头,其后每个新词的第一个字母都应大写

6) 您还可以
扩展JFrame
并拥有一个变量
JFrame
?去掉
extend JFrame
并保留
JFrame
变量,因为我们不需要2个
JFrame
s,除非添加功能,否则扩展
JFrame
不是一个好做法

以下是您的代码和上述修复(请原谅图片质量问题,但必须调整大小,否则它将变为800x600):

根据你的评论:

我正在准备一张包含很多多边形的地图,昨天我 在JFrame上使用JPanel,我试图检查鼠标是否在里面 使用MouseListener创建多边形的。后来我看到mouseListener给我的 false响应(就像鼠标不在多边形内部,但它会起作用一样) 就像它在多边形中一样)。所以我删除了JPanel,然后 工作

下面是使用
MouseAdapter
更新的代码,并覆盖
mouseClicked
以检查单击是否在多边形内

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 javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class JRisk {

    private JFrame mainMap;
    private Polygon poly;

    public JRisk() {
        initComponents();
    }

    private void initComponents() {

        mainMap = new JFrame();
        mainMap.setResizable(false);

        mainMap.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        int xPoly[] = {150, 250, 325, 375, 450, 275, 100};
        int yPoly[] = {150, 100, 125, 225, 250, 375, 300};

        poly = new Polygon(xPoly, yPoly, xPoly.length);

        JPanel p = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.setColor(Color.BLUE);
                g.drawPolygon(poly);
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(800, 600);
            }
        };

        MouseAdapter ma = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent me) {
                super.mouseClicked(me);

                if (poly.contains(me.getPoint())) {
                    System.out.println("Clicked polygon");
                }

            }
        };
        p.addMouseListener(ma);//add listener to panel
        mainMap.add(p);

        mainMap.pack();
        mainMap.setVisible(true);

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new JRisk();
            }
        });
    }
}

好的,但在这里
http://stackoverflow.com/questions/15167342/arrayindexoutofboundsexception-error-while-drawing-a-polygon
@camickr说如果我要使用swing,我应该使用paintComponent()?我当时使用的是paint()方法,但有人告诉我,如果我要使用swing而不是awt,我应该重写
paintComponent()
好了,现在它说我覆盖了绘制方法,但它没有显示多边形。实际上,我正在准备一张包含许多多边形的地图,昨天我在JFrame上使用了JPanel,我试图用MouseStener检查鼠标是否在多边形内。后来我看到MouseStener给出了错误的响应(就像鼠标不在多边形内,但它的行为就像它在多边形内一样)。所以我删除了JPanel,然后它就工作了。@quartaela问题不在JPanel IMO,而在其他地方,你是完美的。非常感谢。我可以再问一个问题吗?。调用
new JRisk()有什么区别
并在
run()
方法中调用它。它有这么大的不同吗?我想它与并发性有关?很高兴提供帮助…是的,它与并发性有关。所有Swing组件都应该在事件调度线程上创建和操作。
SwingUtilities.invokeXXX
块为我们这样做:)
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Polygon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class JRisk {

    private JFrame mainMap;
    private Polygon poly;

    public JRisk() {

        initComponents();

    }

    private void initComponents() {

        mainMap = new JFrame();
        mainMap.setResizable(false);

        mainMap.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        int xPoly[] = {150, 250, 325, 375, 450, 275, 100};
        int yPoly[] = {150, 100, 125, 225, 250, 375, 300};

        poly = new Polygon(xPoly, yPoly, xPoly.length);
        JPanel p = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.setColor(Color.BLUE);
                g.drawPolygon(poly);
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(800, 600);
            }
        };
        mainMap.add(p);
        mainMap.pack();
        mainMap.setVisible(true);

    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new JRisk();
            }
        });
    }
}
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 javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class JRisk {

    private JFrame mainMap;
    private Polygon poly;

    public JRisk() {
        initComponents();
    }

    private void initComponents() {

        mainMap = new JFrame();
        mainMap.setResizable(false);

        mainMap.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        int xPoly[] = {150, 250, 325, 375, 450, 275, 100};
        int yPoly[] = {150, 100, 125, 225, 250, 375, 300};

        poly = new Polygon(xPoly, yPoly, xPoly.length);

        JPanel p = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.setColor(Color.BLUE);
                g.drawPolygon(poly);
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(800, 600);
            }
        };

        MouseAdapter ma = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent me) {
                super.mouseClicked(me);

                if (poly.contains(me.getPoint())) {
                    System.out.println("Clicked polygon");
                }

            }
        };
        p.addMouseListener(ma);//add listener to panel
        mainMap.add(p);

        mainMap.pack();
        mainMap.setVisible(true);

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new JRisk();
            }
        });
    }
}