java - Swing 鼠标进入奇怪的行为

标签 java swing mouse

我有一个带有一些 JComponent 的 jframe 和一些 mouseListener。我的目标是当鼠标进入 jlabel 时显示一个带有指定文本的小 jframe,并在鼠标退出时显示它。 Jframe 应该显示在鼠标附近。 无论如何,这不会发生,并且该程序的行为方式非常奇怪。 为什么? the bug 这是我的代码

package finestrina;

import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class finestra implements MouseListener{

    private JFrame finestra = new JFrame();
    private JFrame pagina = new JFrame();
    private JButton submit1 = new JButton("press");
    private JTextField text = new JTextField();
    finestra(){

        pagina.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pagina.setSize(500, 500);

        JPanel cont = new JPanel();
        cont.setLayout(new GridLayout(3,4));

            JLabel label = new JLabel();
            label.setText("ON MOUSEROVER THIS");
                cont.add(label);
            label.addMouseListener(this);   


            submit1.addMouseListener(this);
            text.addMouseListener(this);

        cont.add(submit1);
        cont.add(text);
        pagina.add(cont);
        pagina.setVisible(true);

        finestra.setUndecorated(true);
    }

    @Override
    public void mouseClicked(MouseEvent arg0) {}

    @Override
    public void mouseEntered(MouseEvent event) {
        if(event.getSource() instanceof JLabel){
            JLabel event_casted = (JLabel)event.getSource();

            if(event_casted.getText().equals("ON MOUSEROVER THIS")){
                Point punto = event.getLocationOnScreen();
                punto.setLocation(punto.getX()+20, punto.getY()+20);

                JLabel littlelabel = new JLabel();

                littlelabel.setText("your mouse is on the jlabel");
                finestra.add(littlelabel);
                finestra.setLocation(punto);
                finestra.setSize(100,100);
                finestra.setVisible(true);
            }
        }
    }

    @Override
    public void mouseExited(MouseEvent event) {
        if(event.getSource() instanceof JLabel){
            JLabel event_casted = (JLabel)event.getSource();
                if(event_casted.getText().equals("ON MOUSEROVER THIS")){
                    finestra.setVisible(false);
                }
        }
    }

    @Override
    public void mousePressed(MouseEvent event) {

    }

    @Override
    public void mouseReleased(MouseEvent arg0) {}

    public static void main(String[] args0){
        new finestra();
    };

}

最佳答案

存在许多(可能的)问题

  • GridLayout 会导致组件占据容器的大部分空间,这可能会导致窗口“出现”得比您期望的更早弹出
  • finestra.add(event_casted); 导致标签从其当前父容器(主窗口)中删除,因为组件只能属于单个容器

通常,使用 API 提供的工具提示支持会更好。也许看看How to Use Tool Tips ,请记住,它们还可以支持 HTML。

如果这不是您想要的功能,那么 JPopupMenu 可能会更好

关于java - Swing 鼠标进入奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34898673/

相关文章:

Java setBackground() 混淆

c# - 用鼠标移动图像 wpf c#

c# - 单击中键可滚动

java - JSoup 解析 Webview 的 HTML

java - 使用编辑器验证表格的单元格

Java:什么对象比较合适?

java - Spring 5缓存不适用于@Cachable(CacheInterceptor不在调用堆栈中)?

java - JLabel 数组中的空指针异常

java - 我想在 JLabel(s) 之间创建空间并将 JButtons 对齐到同一行

events - 当 mousedown 和 mouseup 事件不等于单击时