嗨,我正在尝试改进自己的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();
}
}
答案 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):
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);
}