画一个车轮

Jos*_*osa 9 java swing jcomponent jpanel paintcomponent

我有一个非常简单的问题.我正在学习Java,并获得了一个绘制汽车的任务.我在一个扩展的类中完成了这一切,并在其中JPanel进行了绘制paintComponent().

我意识到这是一个糟糕的面向对象编程,并决定尝试子类化一些部分来纠正这种情况.

我试图创建一个绘制轮子的类,但是没有成功.

从本质上讲,我希望能够做到这一点:

Main Class extends JPanel

paintComponent{
       Wheel leftWheel = new Wheel(0, 50, 100);
       this.add(leftWheel);
}
Run Code Online (Sandbox Code Playgroud)

这应该在该点内的点(0,50)处绘制一个轮子JPanel,并且直径为100.

但是,我不确定我应该如何控制中的位置JPanel.当我这样做时,在我窗口的顶部中心绘制轮子.这是我的轮类看起来像:

public class Wheel extends JComponent {

private int x, y, diameter;
private boolean clockwise;

Wheel(int x, int y, int size, boolean cw)
{
    this.setPreferredSize(new Dimension(size, size));
    this.x = x;
    this.y = y;
    diameter = size;
    clockwise = cw;
    repaint();
}

public void paintComponent(Graphics canvas)
{
    super.paintComponent(canvas);
    canvas.setColor(Color.gray);
    canvas.fillOval(x,y,diameter,diameter);
}

}
Run Code Online (Sandbox Code Playgroud)

x和y应该是它在父窗口中出现的位置,但是,在以下代码中不是这种情况(位于扩展JFrame的父类中):

Wheel leftWheel = new Wheel(0,0,WHEEL_DIAMETER,true);
this.add(leftWheel);
Run Code Online (Sandbox Code Playgroud)

轮子不会在窗口的左上方绘制,它会在我的窗口中央绘制.我做错了什么吗?很抱歉,如果我不遵守某些Java惯例,我还没有任何经验.这是我应该如何处理轮子的绘图,还是有更多公认的做法来进行这种类型的绘图?

例如,在我的JPanel课程中,如果我添加以下代码:

Wheel x = new Wheel(50,60,75,true);
this.add(x);
Run Code Online (Sandbox Code Playgroud)

我得到一个75x75的框架,其中在框架内的点(50,60)处绘制一个轮子(大小为75x75),而不是在父母JPanel的坐标系内.结果是一个被剪裁的圆圈,我只看到圆圈的左上角.该图像显示在我的顶部中心JPanel

我知道如何绘制轮子,并将其自身移动,但如何将轮子定位在JPanel

Ell*_*sch 6

你的构造函数有一个小bug,

Wheel(int x, int y, int size, boolean cw) {
  this.setPreferredSize(new Dimension(size, size));
  diameter = size;
  clockwise = cw;
  repaint();
}
Run Code Online (Sandbox Code Playgroud)

你忘了存储xy.我想你想要的,

Wheel(int x, int y, int size, boolean cw) {
  this.x = x;
  this.y = y;
  this.setPreferredSize(new Dimension(size, size));
  diameter = size;
  clockwise = cw;
  repaint();
}
Run Code Online (Sandbox Code Playgroud)

因为你xy为0,如果你不进行设置.


cam*_*ckr 3

您能解释一下如何控制它在 JPanel 内的位置,而不是在其自身内吗?

JPanel 的默认 LayoutManager 是 a FlowLayout,因此组件将始终根据布局管理器的规则进行定位。

如果要将组件添加到随机位置,则需要使用空布局。但是,当您使用空布局时,您将负责设置组件的大小和位置。因此,实际上,自定义绘制应始终在自定义组件中的 (0, 0) 处完成。