单击按钮后如何移动 Jcomponent 的位置?
How can I move the position of my Jcomponent after I click a button?
所以我想在单击相应按钮后更改作为 JComponent 实现的图像的位置,但是,单击相应按钮时它不会执行任何操作。
我认为问题可能出在我的 paintComponent 方法中,因为我希望图像一开始就绘制在面板的中央。
面板本身有一个 GridBagLayout,虽然我认为将它锚定在中心也无济于事,因为我想在单击按钮时移动图像并且只希望它显示在中心打开框架时的面板...
特别是对于这个按钮,我希望我的 JComponent/image 向右移动 50 个像素。
无论如何,这就是我所做的:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int x = (this.getWidth() - img.getWidth(null))/2;
int y = (this.getHeight() - img.getHeight(null))/2;
g.drawImage(img, x, y, null);
}
@Override
public void actionPerformed(ActionEvent e) {
img.repaint(img.getX()+50, img.getY(), img.getHeight(), img.getWidth());
}
目前,您的 paintComponent 方法始终对 x
和 y
使用相同的值,因此图像不动也就不足为奇了。
x
和y
是需要记住的状态。这是通过定义实例字段来完成的:
private int x;
private int y;
你不能在构造时初始化它们,因为组件在创建时(通常)的宽度和高度为零。幸运的是,有一种方法可以告诉您何时为组件指定了宽度和高度;该方法是 addNotify,您可以而且应该覆盖它:
@Override
public void addNotify() {
super.addNotify();
x = (this.getWidth() - img.getWidth(this)) / 2;
y = (this.getHeight() - img.getHeight(this)) / 2;
}
请注意,您应该将 this
(您的组件实例)传递给需要 ImageObserver 参数的任何方法,而不是 null。
现在paintComponent不需要做任何计算。它只是在任何 x
和 y
碰巧是的地方绘制图像:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img, x, y, this);
}
现在您的坐标是实例字段,您可以直接更改它们:
@Override
public void actionPerformed(ActionEvent event) {
x += 50;
repaint();
}
所以我想在单击相应按钮后更改作为 JComponent 实现的图像的位置,但是,单击相应按钮时它不会执行任何操作。
我认为问题可能出在我的 paintComponent 方法中,因为我希望图像一开始就绘制在面板的中央。
面板本身有一个 GridBagLayout,虽然我认为将它锚定在中心也无济于事,因为我想在单击按钮时移动图像并且只希望它显示在中心打开框架时的面板...
特别是对于这个按钮,我希望我的 JComponent/image 向右移动 50 个像素。
无论如何,这就是我所做的:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int x = (this.getWidth() - img.getWidth(null))/2;
int y = (this.getHeight() - img.getHeight(null))/2;
g.drawImage(img, x, y, null);
}
@Override
public void actionPerformed(ActionEvent e) {
img.repaint(img.getX()+50, img.getY(), img.getHeight(), img.getWidth());
}
目前,您的 paintComponent 方法始终对 x
和 y
使用相同的值,因此图像不动也就不足为奇了。
x
和y
是需要记住的状态。这是通过定义实例字段来完成的:
private int x;
private int y;
你不能在构造时初始化它们,因为组件在创建时(通常)的宽度和高度为零。幸运的是,有一种方法可以告诉您何时为组件指定了宽度和高度;该方法是 addNotify,您可以而且应该覆盖它:
@Override
public void addNotify() {
super.addNotify();
x = (this.getWidth() - img.getWidth(this)) / 2;
y = (this.getHeight() - img.getHeight(this)) / 2;
}
请注意,您应该将 this
(您的组件实例)传递给需要 ImageObserver 参数的任何方法,而不是 null。
现在paintComponent不需要做任何计算。它只是在任何 x
和 y
碰巧是的地方绘制图像:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img, x, y, this);
}
现在您的坐标是实例字段,您可以直接更改它们:
@Override
public void actionPerformed(ActionEvent event) {
x += 50;
repaint();
}