9

您好,我正在努力提高自己对 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();

    }

}
4

3 回答 3

17

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

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

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

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

4) 阅读有关事件调度​​线程的 Swing 中的并发

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

6)你extend JFrame也有一个变量JFrame?拿走extend JFrame并保留JFrame变量,因为我们不想要 2 s,除非添加功能,否则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();
            }
        });
    }
}

根据您的评论:

我正在准备一张包含许多多边形的地图,昨天我在 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();
            }
        });
    }
}
于 2013-03-03T17:20:09.193 回答
3

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

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

于 2013-03-03T17:12:08.180 回答
0

代替

protected void paintComponent(Graphics g){

    super.paintComponents(g);

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

}   

protected void paint(Graphics g){

    super.paint(g);

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

}  
于 2013-03-03T17:13:51.747 回答