画一个车轮

时间:2014-09-18 20:06:27

标签: java swing jpanel paintcomponent jcomponent

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

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

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

基本上,我希望能够做到这一点:

Main Class extends JPanel

paintComponent{
       Wheel leftWheel = new Wheel(0, 50, 100);
       this.add(leftWheel);
}

这应该在JPanel内的点(0,50)处绘制一个轮子,直径为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);
}

}

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

Wheel leftWheel = new Wheel(0,0,WHEEL_DIAMETER,true);
this.add(leftWheel);

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

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

Wheel x = new Wheel(50,60,75,true);
this.add(x);

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

的顶部中心

我理解如何绘制轮子并将其移动到自身内部,但如何将轮子放在JPanel上?

3 个答案:

答案 0 :(得分:6)

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

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

您忘记存储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();
}

如果您未设置xy为0,则为{

}。

答案 1 :(得分:3)

  

你能解释一下如何控制它在JPanel中的位置,而不是自己吗?

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

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

答案 2 :(得分:0)

不是添加多个JPanel来创建车辆,我只需使用一个扩展JPanel的类,并创建多个方法来创建诸如轮子之类的东西,以便在重写的paintComponent方法中调用。您可以将新方法传递给图形对象的引用,使用g.create()创建图形对象的副本,或者从方法本身内部使用getGraphics()。在创建方向盘的方法中,您可以使用面板的尺寸计算它的位置并正确放置。

另一种方法是在其他方法中定义和返回形状,然后使用paintComponent()中的图形对象绘制它们。