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?
你的构造函数有一个小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)
你忘了存储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();
}
Run Code Online (Sandbox Code Playgroud)
因为你x和y为0,如果你不进行设置.
您能解释一下如何控制它在 JPanel 内的位置,而不是在其自身内吗?
JPanel 的默认 LayoutManager 是 a FlowLayout,因此组件将始终根据布局管理器的规则进行定位。
如果要将组件添加到随机位置,则需要使用空布局。但是,当您使用空布局时,您将负责设置组件的大小和位置。因此,实际上,自定义绘制应始终在自定义组件中的 (0, 0) 处完成。