java - JComponent 和 mouseListener 的行为非常奇怪

标签 java swing mouseevent

我创建了一个简单的程序,当鼠标位于 JLabel 上时,它会显示 JFram 窗口。它似乎工作得很好,直到您多次将鼠标移到 JLabel 上:JComponent 开始像下面的图片一样损坏:

enter image description here

JComponents 开始出现在任何地方,并且应该显示的 JLabel 具有“奇怪的粗体”字体。我认为这可能会发生,因为程序永远不会“退出”小窗口,所以内存永远不会释放?!我也可能错了......但我肯定不知道为什么会发生这种情况!

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

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

}

最佳答案

好吧,我真的不知道为什么你的代码行为不当,因为它对我来说不是行为不当,但请考虑使用此功能的工具提示,或者使用无模式未修饰的 JDialog,如下所示:

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.Dialog.ModalityType;
import java.awt.Window;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;
import javax.swing.border.Border;

public class Finestra2 extends JPanel {
    private static final int EB = 20;
    private JLabel dialogLabel = new JLabel("Dialog hover label");
    private JLabel toolTipLabel = new JLabel("Tooltip hover label");

    public Finestra2() {
        // tool tip text will appear if the mouse hovers over component
        toolTipLabel.setToolTipText("This is tooltipLabel's text");
        dialogLabel.addMouseListener(new DialogLabelMouseListener());

        // a one column grid with a variable number of rows
        setLayout(new GridLayout(0, 1));

        addWithBorder(dialogLabel);
        add(new JButton("Some Button")); // just a component to show possible visual misbehaviors
        add(new JLabel("Do nothing label"));  // ditto
        addWithBorder(toolTipLabel);
        add(new JButton("Some Button"));
        add(new JLabel("Do nothing label"));

        setBorder(BorderFactory.createEmptyBorder(EB, EB, EB, EB));
    }

    // put a border around our labels of interest
    private void addWithBorder(JComponent component) {
        Border innerBorder = BorderFactory.createEmptyBorder(EB, EB, EB, EB);
        Border outerBorder = BorderFactory.createLineBorder(Color.BLACK);
        Border compoundBorder = BorderFactory.createCompoundBorder(outerBorder, innerBorder);
        component.setBorder(compoundBorder);
        add(component);
    }

    private class DialogLabelMouseListener extends MouseAdapter {
        private JDialog hoverDialog;

        @Override
        public void mouseEntered(MouseEvent e) {
            // only create the dialog once in a lazy fashion
            if (hoverDialog == null) {
                Window win = SwingUtilities.getWindowAncestor(Finestra2.this);
                hoverDialog = new JDialog(win, "", ModalityType.MODELESS);
                JLabel label = new JLabel("Dialog label hover window");
                hoverDialog.add(label);
                hoverDialog.setUndecorated(true);
                hoverDialog.pack();
            }
            Point punto = e.getLocationOnScreen();
            punto.setLocation(punto.getX() + 20, punto.getY() + 20);
            hoverDialog.setLocation(punto);
            hoverDialog.setVisible(true);
        }

        @Override
        public void mouseExited(MouseEvent e) {
            if (hoverDialog != null) {
                hoverDialog.setVisible(false);
            }
        }
    }

    private static void createAndShowGui() {
        Finestra2 mainPanel = new Finestra2();

        JFrame frame = new JFrame("Finestra2");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            createAndShowGui();
        });
    }
}

关于java - JComponent 和 mouseListener 的行为非常奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34902831/

相关文章:

java - 我想更改 JButton 的 Tab 键的键绑定(bind)

javascript - jquery mouseenter 和 mouseleve 不适用于新注入(inject)的 dom 元素

javascript - jquery 鼠标事件的多种函数

java - 如何使 JSplitPane 在鼠标悬停时自动展开?

java - 如何连接到远程HDFS

java - FileNotFound 错误,但我的 txt 文件与 java 文件位于同一位置

java - 关于地理标记视频和视频在 gis 方面提供的信息

java - Android Java 上传图像,然后等待完成 asynctask

java - JUNG:将图形保存到图像文件中

java - 需要 jTable 在时间延迟后显示 10 行,然后在所有显示后加载新记录