问题描述
我正在尝试向我的 JPanel 添加一个圆圈,但它不会绘制圆圈。 下面的代码创建一个 JFrame,创建一个 JPanel 并调用一个函数来向 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,100);
}
}
解决方法
首先,变量名不应以大写字符开头。你们大多数人的名字是正确的,但不是全部。学习 Java 约定并保持一致!
您创建一个 GridLayout
pgame.setLayout(new GridLayout(3,10));
这将尝试为框架中的 3 个组件垂直分配空间。
然后你创建一个边框:
pgame.setBorder(BorderFactory.createEmptyBorder(309,460,150,460));
这将使您的组件高度为 459,宽度为 920。
最后,您尝试在面板左上角 (500,500) 处绘制椭圆。
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));
pgame.setBorder(BorderFactory.createEmptyBorder(50,50,50));
您将看到椭圆的一部分,因为您为边框保留的空间较少。
下一个变化:
//g.fillOval(500,100);
g.fillOval(0,100);
您将在面板顶部看到椭圆形。
重点是指定:
- 网格大小
- 边框大小
- 椭圆位置
都会影响组件的大小及其绘制方式。
其他问题:
- 覆盖 Circle 类的
getPreferredSize()
方法以返回所需的面板大小 - 自定义绘画是通过覆盖
paintComponent()
而不是paint()来完成的; - 您需要在方法开始时调用
super.paintComponent(..)
。
阅读关于 Custom Painting 的 Swing 教程中的部分,了解更多信息和工作示例。