我正试图在我的JPanel中添加一个圆圈,但它不会画出这个圆圈。下面的代码创建一个JFrame,创建一个JPanle,并调用一个函数向JPanel(pgame(添加一个圆圈,但实际上并没有添加。感谢的帮助
fgame = new JFrame("Backgammon");
fgame.setSize(1000, 1000);
pgame = new JPanel();
pgame.setPreferredSize(new Dimension(1000, 687));
pgame.setLayout(new GridLayout(3, 10));
pgame.setBorder(BorderFactory.createEmptyBorder(309,460,150,460));
Circle Circlepanel = new Circle();
pgame.add(Circlepanel);
Circlepanel.setVisible(true);
fgame.add(pgame,BorderLayout.CENTER);
fgame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fgame.setTitle("Backgammon");
fgame.pack();
fgame.setVisible(true);
public class Circle extends JPanel {
public void paint(Graphics g) {
g.drawOval(500, 500, 100, 100);
g.setColor(Color.RED);
g.fillOval(500, 500, 100, 100);
}
}
首先,变量名不应以大写字符开头。你们大多数人的名字都是正确的,但不是所有人。学习Java惯例并保持一致!
您创建的GridLayout
pgame.setLayout(new GridLayout(3, 10));
它将尝试为框架中的3个垂直组件分配空间。
然后创建一个边界:
pgame.setBorder(BorderFactory.createEmptyBorder(309,460,150,460));
这将使您的组件具有459的高度和920的宽度。
最后,您尝试在面板左上角(500500(处绘制椭圆。
g.drawOval(500, 500, 100, 100);
问题是,你有奇怪的随机数,而你的组件的大小不足以在组件的空间中绘制椭圆形。
为了证明这种添加和重新测试:
Circlepanel.setBackground( Color.YELLOW );
您将看到一个黄色面板。下一个变化:
//pgame.setLayout(new GridLayout(3, 10));
pgame.setLayout(new GridLayout(1, 0));
你会在框架中间看到一个更高的黄色面板,因为你只为单个组件分配空间。
下一个变化:
//pgame.setBorder(BorderFactory.createEmptyBorder(309,460,150,460));
pgame.setBorder(BorderFactory.createEmptyBorder(50,50,50,50));
你会看到椭圆形的一部分,因为你为边界预留了更少的空间。
下一个变化:
//g.fillOval(500, 500, 100, 100);
g.fillOval(0, 0, 100, 100);
你会看到面板顶部的椭圆形。
重点是指定:
- 网格大小
- 边框大小
- 椭圆形位置
都会影响组件的大小和绘制方式。
其他问题:
- 覆盖Circle类的
getPreferredSize()
方法以返回所需的面板大小 - 自定义绘制是通过重写
paintComponent()
而不是paint((来完成的 - 您需要在方法开始时调用
super.paintComponent(..)
阅读Swing教程中关于自定义绘画的部分,了解更多信息和工作示例。