Java 画一个车轮
我有一个非常简单的问题。我正在学习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);
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
的坐标系内。结果是一个被剪裁的圆,我只看到圆的左上角。该图像显示在myJPanel的顶部中心
我知道如何绘制控制盘并在其内部移动,但如何在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();
}