JFrame
没有paintComponent(Graphics g)
方法。添加@Override
注释,您将收到编译时错误。
1)使用JPanel
和覆盖paintComponent
(你会比添加JPanel
到JFrame
viad 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):
![在此处输入图像描述](https://i.stack.imgur.com/MAChL.png)
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();
}
});
}
}