4

JComponent and mouseListener very strange behavior

 3 years ago
source link: https://www.codesd.com/item/jcomponent-and-mouselistener-very-strange-behavior.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

JComponent and mouseListener very strange behavior

advertisements

I have created a simply program that show a JFram Window when your mouse is on a JLabel. It seems to work perfectly, until you pass the mouse over JLabel many times: JComponents begin to get broken like in this picture:

JComponents start to appear anywhere, and JLabel that is supposed to be shown, has a "strange bold" font. I think it could happen because the program never "exit" the little window, so memory is never freed?! I may be wrong too... but surely i don't know why this happen!

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

}


OK, I really don't know why your code is misbehaving, as it's not misbehaving for me, but consider using either a tool tip for this functionality, or else a modeless undecorated JDialog as both are shown here:

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




About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK