关于在java中绘制Polygon

qua*_*ela 9 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 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();

    }

}
Run Code Online (Sandbox Code Playgroud)

Dav*_*amp 16

JFrame没有paintComponent(Graphics g)方法.添加@Override注释,您将收到编译时错误.

1)使用JPanel和覆盖paintComponent(你可以添加JPanelJFrameviad JFrame#add(..))

2)覆盖getPreferredSize()以返回Dimension适合您在Graphics对象上绘制的正确s,否则它们将不会被视为JPanel没有组件的大小为0,0

3)不要叫setSizeJFrame......而用正确的LayoutManager和/或覆盖getPrefferedSize(),并呼吁pack()JFrame添加所有组件之后,但其设置可见之前

4)特别关于事件调度线程读取Swing中的并发

5)监视类命名方案应以大写字母开头,此后新单词的每个首字母都应大写

6)你extend JFrame还有变量JFrame吗?拿走extend JFrame并保留JFrame变量,因为我们不想要2 JFrame秒,JFrame除非添加功能,否则不是扩展的好习惯

这是你的代码与上面的修复(借口图片质量,但不得不调整大小或它是800x600):

在此输入图像描述

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();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

根据你的评论:

我正在准备一个包含大量多边形的地图,昨天我在JFrame上使用了JPanel,我试图用MouseListener检查鼠标是否在多边形内部.后来我看到mouseListener给出了错误的响应(就像鼠标不在多边形内部,但它就像在多边形内部一样).所以我删除了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();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 很高兴帮忙......是的,它与并发性有关.应在Event Dispatch Thread上创建和操作所有Swing组件.`SwingUtilities.invokeXXX`块为我们做了:) (3认同)