关于在java中绘制Polygon

时间:2013-03-03 17:09:25

标签: 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();

    }

}

3 个答案:

答案 0 :(得分:16)

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

1)使用JPanel并覆盖paintComponent(您只需将JPanel添加到JFrame viad JFrame#add(..)

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

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

4)请Concurrency in Swing专门阅读Event Dispatch Thread

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

6)您还JFrame并拥有变量extend JFrame?取消JFrame并保留extend JFrame变量,因为我们不想要2 JFrame s,除非添加功能

,否则不宜扩展JFrame

以下是您的代码以上修复(借口图片质量,但不得不调整大小或者是800x600):

enter image description here

JFrame

根据你的评论:

  

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

以下是使用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(); } }); } } 和覆盖MouseAdapter的更新代码,以检查点击是否在多边形内。

mouseClicked

答案 1 :(得分:3)

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

要使此功能将paintComponent提取到扩展JComponent的新类。不要忘记致电super.paintComponent(g)而不是super.paintComponents(g)

答案 2 :(得分: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);

}