1

我正在尝试JLabel在带有 的容器中实现一个用鼠标指针移动的mouseMotionListener,但JLabel没有出现在屏幕上。有什么建议么?

public class Ships extends JFrame implements ActionListener{

    private JPanel contentPane;

    int x=418,p=75,l=10;


    public static void main(String[] args) {
        Ships m = new Ships();

    }

    JLabel lblNewLabel = new JLabel();

    JLabel l5 = new JLabel();

    Container container;
    /**
    * Create the frame.
    */
    public Ships() {
         Container container= getContentPane();


        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(0, 0, 1363, 730);
        contentPane = new JPanel();
        setContentPane(contentPane);
        contentPane.setLayout(null);
        setVisible(true);

        l5.setIcon(new ImageIcon("C:\\Users\\The Wimpster\\Desktop\\images22.png"));
        container.add(l5);
        l5.setBounds(0, 10, 75, 50);//this label is supposed to move with mouse pointer
        container.addMouseMotionListener(new MouseAdapter(){ 
            public void mouseMoved(MouseEvent e){
                p = e.getX();
                l = e.getY();
                l5.setBounds(p,l,150,50); 
            }
        });
    }
}
4

2 回答 2

2

您正在创建您的Ships类的两个实例 - 构造函数调用它们setVisible(true)以便出现两个实例 - 这可能是不希望的。

但是问题确实出现了,因为您正在获取表单的内容窗格,然后创建一个新面板,将其设置为新内容窗格,然后将标签添加到旧窗格,然后将鼠标侦听器添加到旧内容窗格.

只需删除对现有窗格的引用,它就会起作用。

public Ships() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(0, 0, 1363, 730);
    contentPane = new JPanel();
    setContentPane(contentPane);
    contentPane.setLayout(null);
    setVisible(true);

    l5.setIcon(new ImageIcon("C:\\Users\\The Wimpster\\Desktop\\images22.png"));
    // 
    contentPane .add(l5);
    l5.setBounds(0, 10, 75, 50);//this label is supposed to move with mouse pointer
    contentPane .addMouseMotionListener(new MouseAdapter(){ 
        public void mouseMoved(MouseEvent e){
            p = e.getX();
            l = e.getY();
            l5.setBounds(p,l,150,50); 
        }
    }); 
}   
于 2017-07-12T22:45:06.250 回答
1

您的代码非常“蓬松”。我已将其缩短为仅相关部分并对其进行了修复,它看起来像这样:

import java.awt.EventQueue;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.ImageIcon;

public class Ships extends JFrame{
    private static final long serialVersionUID = 1L;
    private JLabel l5 = new JLabel();

    public Ships() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500, 500);

        l5.setIcon(new ImageIcon("C:\\Users\\The Wimpster\\Desktop\\images22.png"));
        add(l5);
        l5.setBounds(0, 10, 75, 50);
        addMouseMotionListener(new MouseAdapter(){ 
            public void mouseMoved(MouseEvent e){
                int x = e.getX();
                int y = e.getY();
                int imgWidth = 50; //change to width of image
                int imgHeight = 50; //change to height of image
                l5.setBounds(x-(imgWidth/2), y-(imgHeight/2), imgWidth, imgHeight); 
                l5.repaint();
            }
        });
        setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Ships();
            }
        });
    }
}

我让它尽可能短,删除所有不必要的变量和其他东西。它现在可以工作,并提供更平滑的输出。一旦您更改了这两个变量(我评论了哪些变量),鼠标始终位于图标的中心。

您的主要问题是您将标签添加到错误的位置,但我在回答中解决了这个问题。我没有将其添加到 aJPanel中,而是直接将其添加到 中JFrame,这样简单得多,并且产生相同的效果

于 2017-07-12T23:00:30.763 回答