Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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 动态移动带有ImageIcon的JLabel时,会在帧周围跳跃_Java_Swing_Jlabel_Mouselistener - Fatal编程技术网

Java 动态移动带有ImageIcon的JLabel时,会在帧周围跳跃

Java 动态移动带有ImageIcon的JLabel时,会在帧周围跳跃,java,swing,jlabel,mouselistener,Java,Swing,Jlabel,Mouselistener,我有一个Java Swing问题。我目前正在编写游戏跳棋作为练习。我用棋子的ImageIcon将棋子创建为JLabels。我添加了一个MouseListener来更新框架上标签的x和y位置,并使用ActionListener根据计时器每5毫秒设置一次标签位置。它的工作原理是,当我用鼠标拖动标签(而不是用鼠标跟踪)时,标签会在屏幕上跳跃 有人知道这是什么原因吗?根据我目前的代码,有没有一个简单的解决方案 我不熟悉摇摆舞,所以我意识到我可能完全采取了错误的方法。我无法附加图像,但它只是一个80 x

我有一个Java Swing问题。我目前正在编写游戏跳棋作为练习。我用棋子的
ImageIcon
将棋子创建为
JLabels
。我添加了一个
MouseListener
来更新框架上标签的x和y位置,并使用
ActionListener
根据计时器每5毫秒设置一次标签位置。它的工作原理是,当我用鼠标拖动标签(而不是用鼠标跟踪)时,标签会在屏幕上跳跃

有人知道这是什么原因吗?根据我目前的代码,有没有一个简单的解决方案

我不熟悉摇摆舞,所以我意识到我可能完全采取了错误的方法。我无法附加图像,但它只是一个80 x 80 px的正方形,前景是一个实心的黑色圆圈,背景是透明的。非常感谢

package checkers;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.*;

public class Piece2 extends JLabel implements
    ActionListener, MouseListener, MouseMotionListener{

    ImageIcon checkerIcon;
    String color = null;
    Timer t = new Timer(5, this);
    int x, y, width = 80, height = 80;

    public Piece2(int initX, int initY, String color){

        this.x = initX;
        this.y = initY;
        this.color = color;

        t.start();
        setLocation(x, y);
        setSize(width, height);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
        addMouseMotionListener(this);
        addMouseListener(this);

        if(color.equals("Red")){
            checkerIcon = new ImageIcon("/RedChecker.png");
        }
        else if(color.equals("Black")){
            checkerIcon = new ImageIcon("/BlackChecker.png");
        }

        setIcon(checkerIcon);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        setLocation(x, y);
    }

    /**
     * Mouse Event Listeners
     * 
     */
    @Override
    public void mouseDragged(MouseEvent e) { 
        this.x = e.getX(); 
        this.y = e.getY(); 
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        x = x - (x % 50);
        y = y - (y % 50);           
    }

    @Override
    public void mouseMoved(MouseEvent e) {}

    @Override
    public void mouseClicked(MouseEvent e) {}

    @Override
    public void mousePressed(MouseEvent e) {}

    @Override
    public void mouseEntered(MouseEvent e) {}

    @Override
    public void mouseExited(MouseEvent e) {}

    //To test Piece
    public static void main(String[] args){
        Piece2 p1 = new Piece2(0, 0, "Black");
        JFrame frame1 = new JFrame("Test");
        frame1.setSize(800, 800);
        frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame1.add(p1);

        frame1.setVisible(true);
    }
}

为什么需要计时器来设置位置?此外,鼠标事件与生成的源相关,这意味着鼠标事件提供的位置相对于源(即0x0是生成鼠标事件的组件的左上角)…是的,不要轮询JLabel的位置。而是让MouseListener和MouseMotionListener调用repaint并重新绘制您的图标。“…我添加了一个MouseListener来更新JFrame上JLabel的x和y位置…”这似乎很复杂!我会使用
JButton
实例来显示带有
GridLayout
的线路板位置,并在工件移动时将
setIcon(…)
简单地应用于两个按钮(from/to)。如图所示,我会使用JLabel,但在接受棋盘格图像图标的固定网格中使用,但拖动的JLabel除外,它将显示在玻璃窗格中的板上方。请看一个如何做到这一点的例子。谢谢你的信息。我正在使用计时器根据更新的坐标周期性地重新绘制棋盘格对象。我最感兴趣的是找出为什么JLabel组件在拖动帧时会在帧周围“跳跃”,即使MouseeEvent返回准确的getX和getY信息。这是否与使用setLocation()作为重新绘制时更新位置的方式有关?有什么想法吗?我已经有了一个解决方案,可以把这些碎片放在黑板上。我只是希望棋盘格拖动动画看起来不错。