【问题标题】:why isn't an oval displayed in my jPanel? [duplicate]为什么我的 jPanel 中没有显示椭圆? [复制]
【发布时间】:2021-04-04 01:29:04
【问题描述】:

我正在尝试在我的 JPanel 中添加一个圆圈,但它不会绘制 cricle。 下面的代码创建了一个 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);
}

}

【问题讨论】:

  • 容器在调用paint之前将图形对象的坐标系转换为孩子的位置,因此您可以假设(0,0)是您的Circle面板的左上角。
  • 你应该重写paintComponent()而不是paint()。

标签: java swing graphics jframe jpanel


【解决方案1】:

首先,变量名称不应以大写字符开头。你们中的大多数名字都是正确的,但不是全部。学习 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,150,460));
pgame.setBorder(BorderFactory.createEmptyBorder(50,50,50,50));

您将看到椭圆的一部分,因为您为边框保留的空间较少。

下一个变化:

//g.fillOval(500, 500, 100, 100);
g.fillOval(0, 0, 100, 100);

您会在面板顶部看到椭圆形。

重点是指定:

  1. 网格大小
  2. 边框大小
  3. 椭圆形位置

所有这些都会影响组件的大小以及它的绘制方式。

其他问题:

  1. 覆盖 Circle 类的 getPreferredSize() 方法以返回所需的面板大小
  2. 自定义绘画是通过覆盖paintComponent(),而不是paint()来完成的;
  3. 您需要在方法开始时调用super.paintComponent(..)

阅读 Custom Painting 上的 Swing 教程部分,了解更多信息和工作示例。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-24
相关资源
最近更新 更多