关于在java中绘制多边形

嗨,我正在努力提高自己的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没有paintComponent(Graphics g)方法。 添加@Override注释 ,您将收到编译时错误。

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

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

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

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

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

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

这是你的代码与上面的修复(借口图片质量,但不得不resize或它是800×600):

在此处输入图像描述

 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以检查click是否在多边形内。

 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(); } }); } } 

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

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

更换

 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); }