Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 画一个车轮_Java_Swing_Jpanel_Paintcomponent_Jcomponent - Fatal编程技术网

Java 画一个车轮

Java 画一个车轮,java,swing,jpanel,paintcomponent,jcomponent,Java,Swing,Jpanel,Paintcomponent,Jcomponent,我有一个非常简单的问题。我正在学习Java,并被指派画一辆汽车。我在一个扩展了JPanel的类中完成了这一切,并在paintComponent()中完成了绘图 我意识到这是糟糕的面向对象编程,并决定尝试对某些部分进行子类化以纠正这种情况 我试图创建一个绘制轮子的类,但没有成功 基本上,我希望能够做到这一点: Main Class extends JPanel paintComponent{ Wheel leftWheel = new Wheel(0, 50, 100);

我有一个非常简单的问题。我正在学习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的父类中):

轮子不是在我窗口的左上角画的,而是在我窗口的中心画的。我做错什么了吗?抱歉,如果我没有遵循一些Java约定,我还没有任何经验。这是我应该如何处理车轮的图纸,还是有一个更被接受的做法来做这种类型的图纸

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

Wheel x = new Wheel(50,60,75,true);
this.add(x);
我得到一个尺寸为75x75的框架,其中一个轮子(尺寸为75x75)在该框架内的点(50,60)处绘制,而不是在父
JPanel
的坐标系内。结果是一个被剪裁的圆,我只看到圆的左上角。该图像显示在my
JPanel的顶部中心


我知道如何绘制控制盘并在其内部移动,但如何在
JPanel上定位控制盘?

您的构造函数有一个小错误

Wheel(int x, int y, int size, boolean cw) {
  this.setPreferredSize(new Dimension(size, size));
  diameter = size;
  clockwise = cw;
  repaint();
}
您忘记存储
x
y
。我想你想要

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();
}
因为如果不进行设置,则您的
x
y
为0

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

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


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

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


另一种方法是使用其他方法定义和返回形状,并使用
paintComponent()

Hmmm中的图形对象简单地绘制它们。我添加了我忘记的线,但现在根本没有绘制控制盘。我没有更改任何其他代码。@JosueEspinosa也许您应该确保x和y没有超过窗口的边缘。是的,就是这样,但坐标控制轮子在自己的窗口中绘制的位置,而不是父窗口。你能解释一下如何控制它在JPanel中的位置,而不是它本身吗?从封装的角度来看,我将把定位逻辑完全移出
Wheel
类之外。将汽车装配到正确的位置,我同意。如何控制父类中的位置?这就是我不明白的。我不熟悉Java及其语法。您可以使用重载的
add
方法接受约束对象来控制定位。如何做到这一点完全取决于您所使用的。另外,如果您使用的是Eclipse,您可能会发现使用WindowBuilder很有用,例如,在不必重新编译和逐点运行的情况下查看渲染效果。我需要将JPanel的布局设置为null,然后使用wheel.setBounds(坐标)作为位置。谢谢
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();
}