关于在java中绘制多边形
大家好,我正在努力提高自己关于java2D的知识,首先我要处理的是绘制多边形。但是,我看不到框架上的多边形。我读了一些教程和例子,但正如我所说,我面临着一些问题。下面是绘制多边形的示例代码关于在java中绘制多边形,java,swing,polygon,java-2d,paintcomponent,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 JF
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
不会扩展JComponent
,因此不会覆盖paintComponent
。您可以通过添加@Override
注释来检查这一点
要获得此功能,请将paintComponent
提取到扩展JComponent
的新类中。不要忘记调用super.paintComponents(g)
而不是super.paintComponents(g)
替换
protected void paintComponent(Graphics g){
super.paintComponents(g);
g.setColor(Color.BLUE);
g.drawPolygon(poly);
}
与
JFrame
没有方法。添加,您将得到一个编译时错误
1) 使用JPanel
并覆盖paintComponent
(您需要将JPanel
添加到JFrame
viadJFrame\add(…)
)
2) 重写getPreferredSize()
以返回适合图形对象上图形的正确尺寸
s,否则它们不会被视为JPanel
无组件的尺寸为0,0
3) 不要在JFrame
上调用setSize
。。。而是使用正确的LayoutManager
和/或覆盖getPreferedSize()
并在添加所有组件后但在将其设置为可见之前调用JFrame上的pack()
4) 读一读关于
5) 手表类命名方案应以大写字母开头,其后每个新词的第一个字母都应大写
6) 您还可以扩展JFrame
并拥有一个变量JFrame
?去掉extend JFrame
并保留JFrame
变量,因为我们不需要2个JFrame
s,除非添加功能,否则扩展JFrame
不是一个好做法
以下是您的代码和上述修复(请原谅图片质量问题,但必须调整大小,否则它将变为800x600):
根据你的评论:
我正在准备一张包含很多多边形的地图,昨天我
在JFrame上使用JPanel,我试图检查鼠标是否在里面
使用MouseListener创建多边形的。后来我看到mouseListener给我的
false响应(就像鼠标不在多边形内部,但它会起作用一样)
就像它在多边形中一样)。所以我删除了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();
}
});
}
}
好的,但在这里http://stackoverflow.com/questions/15167342/arrayindexoutofboundsexception-error-while-drawing-a-polygon
@camickr说如果我要使用swing,我应该使用paintComponent()?我当时使用的是paint()方法,但有人告诉我,如果我要使用swing而不是awt,我应该重写paintComponent()
好了,现在它说我覆盖了绘制方法,但它没有显示多边形。实际上,我正在准备一张包含许多多边形的地图,昨天我在JFrame上使用了JPanel,我试图用MouseStener检查鼠标是否在多边形内。后来我看到MouseStener给出了错误的响应(就像鼠标不在多边形内,但它的行为就像它在多边形内一样)。所以我删除了JPanel,然后它就工作了。@quartaela问题不在JPanel IMO,而在其他地方,你是完美的。非常感谢。我可以再问一个问题吗?。调用new JRisk()有什么区别
并在run()
方法中调用它。它有这么大的不同吗?我想它与并发性有关?很高兴提供帮助…是的,它与并发性有关。所有Swing组件都应该在事件调度线程上创建和操作。SwingUtilities.invokeXXX
块为我们这样做:)
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();
}
});
}
}
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();
}
});
}
}