当前位置: 首页 > 知识库问答 >
问题:

单击按钮后,如何移动J组件的位置?

益和雅
2023-03-14

因此,我想在单击相应的按钮后更改图像的位置,我将其实现为JComponent,但是,当被单击时,它不会做任何事情。

我认为问题可能在于我的油漆组件方法,因为我希望图像在开始时绘制在面板的中心。

面板本身有一个GridBagLayout,尽管我认为将其锚定在中心也没有帮助,因为我想在单击按钮时移动图像,并且只希望它在打开框架时显示在面板的中心...

特别是对于这个按钮,我希望我的JComponent/图像向右移动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());
    }

共有1个答案

巢宏富
2023-03-14

目前,paintComponent方法总是使用相同的值来表示xy,因此图像不移动也就不足为奇了。

xy是需要记住的状态。这是通过定义实例字段来完成的:

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; 
}

请注意,您应该将这个(组件实例)传递给任何需要ImageObserver参数的方法,而不是null。

现在,paintComponent不需要进行任何计算。它只是在xy的任意位置绘制图像:

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(img, x, y, this);
}

现在,您的坐标是实例字段,您可以直接更改它们:

@Override
public void actionPerformed(ActionEvent event) {
    x += 50;
    repaint();
}

 类似资料:
  • 我正在制作一个棋盘游戏,8X8矩阵,在一个框架中有64个。到目前为止,我的代码是这样的: 我试图告诉哪个JButoon是使用此代码单击的: 然而,我不知道如何辨别点击了哪个Jbutton。

  • 编辑:底部的解决方案 这是一个跳棋游戏。单击一个按钮后,它等待单击第二个按钮与之交换。然而,有时你可能不想移动那个按钮,但一旦你点击了它,就没有回头路了,因为我无法禁用它。 在这里的其他帖子中,我看到人们使用 这只是使它在第一次单击后不可见。 这什么都干不了。 这也没什么用。编辑:所有这些方法都用true和false进行了尝试。 私有无效交换(){ 但你也需要 这样它就重新启用了它,或者其他什么,

  • 问题内容: 单击按钮如何只打印一个组件。 我知道这个解决方案: 但是React不想使用框架。 有什么办法吗?谢谢。 问题答案: 客户端上有两种解决方案。一种是像您张贴的框架。不过,您可以使用iframe: 这期望这个html存在 另一种解决方案是使用媒体选择器,并在样式上隐藏所有您不想打印的内容。 最后一种方法需要在服务器上进行一些工作。您可以将所有HTML + CSS发送到服务器,并使用许多组件

  • 在我点击提交按钮后,我如何使页面刷新或更新页面中的内容?我尝试将(我知道不是React方式,具有相同的结果)放入提交函数(、)中,但POST请求没有得到响应 OpenTickets.js CardConversation.jsx

  • 我正试图让JQuery在按下下一个按钮时自动单击该按钮。在互联网上,我发现应该是这样的(查看JQuery部分)。但由于某种原因,它不起作用。 它们必须在同一个代码中吗? 我尝试过的:JQuery: 表单中的按钮1 HTML: 表单中的按钮2 HTML:

  • 我正在用GridLayout做一个程序。在执行操作后,我尝试将按钮移动到另一个位置时出现问题。基本上,我在面板上有一个按钮大小的空白区域。我想把点击的按钮移到这个空白处,反过来,这个空白处会取代这个按钮。我正在使用一个数组来获得一个看起来像框架的模型。所以我知道空空间在我的数组中的位置(在JButton数组中是一个空值),我试图让这个按钮在数组中取空空间的位置,并反过来。但它并没有真正起作用。 任