关于在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); }