【问题标题】:Jlabel not moving with mouse motion listenerJlabel 不随鼠标运动侦听器移动
【发布时间】:2017-12-17 11:59:33
【问题描述】:

我正在尝试实现一个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); 
            }
        });
    }
}

【问题讨论】:

  • l5.setBounds(p,l,150,50); 之后添加repaint(); 以便容器重新绘制自身及其组件(包括此JLabel)。
  • 如果您仍然需要帮助,请考虑改进您的问题:添加一段解释说明您的代码应该做什么以及您的错误的细节以及您尝试调试它的结果.还要删除许多不相关的代码,这些代码与您的问题无关。相反,创建一个新的小程序来编译、运行和说明您的问题,并且不执行任何其他操作,minimal reproducible example。否则您要求我们处理太多代码。
  • 也许你应该从Performing Custom Painting2D Graphics开始
  • 我第一次在 Stack..谢谢您的输入将编辑代码并且没有添加重绘也不起作用..

标签: java swing jframe mousemotionlistener


【解决方案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();
            }
        });
    }
}

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

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

【讨论】:

  • @VaibhavSetia 很高兴我能帮上忙!谢谢您!确保更改这些变量以获得最平滑的效果。
【解决方案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); 
        }
    }); 
}   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 2012-01-02
    • 1970-01-01
    • 2013-06-22
    • 2018-03-09
    • 2013-12-06
    • 1970-01-01
    相关资源
    最近更新 更多