Search code examples
javaswingjtextarea

Detecting a hover over a JTextArea


I want to add a border to a JTextArea when the user hovers over it. This is all good, I do so by this:

public void mouseMoved(MouseEvent e) {
    Border border = BorderFactory.createLineBorder(Color.black);
    JTextArea component = (JTextArea) e.getComponent();
    component.setBorder(border);
}

My problem is: when the user isn't hovering over the JTextArea, I want to remove the border. Is there anyway I can do this? Will I have to do it from within the JPanel or can I do it in the listener class? You can see here, that when I move the mouse on the JPanel (but not on the JTextArea) the border stays:

enter image description here

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.border.Border;
import javax.swing.event.MouseInputAdapter;

public class Editor {

    public static void main(String[] args) {
        JFrame frame = new Window();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(30, 30, 1000, 700);
        frame.getContentPane().setBackground(Color.white);
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

class Window extends JFrame {
    MyPanel myPanel = new MyPanel();

    private static final long serialVersionUID = 1L;

    public Window() {
        addMenus();
    }

    public void addMenus() {

        getContentPane().add(myPanel);

        setSize(300, 200);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
}

class MyPanel extends JPanel {
    private static final long serialVersionUID = 1L;
    DragListener drag;

    public MyPanel() {
        drag = new DragListener();
        addBox();
    }

    public void addBox() {
        setLayout(new DragLayout());
        drag = new DragListener();
        JTextArea textArea2 = new JTextArea("Text Box Added");
        textArea2.setLineWrap(true);
        textArea2.setWrapStyleWord(true);
        add(textArea2);
        textArea2.addMouseListener(drag);
        textArea2.addMouseMotionListener(drag);
        repaint();
        revalidate();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
    }

    public class DragListener extends MouseInputAdapter {
        Point location;
        MouseEvent pressed;

        public void mousePressed(MouseEvent me) {
            pressed = me;
        }

        public void mouseDragged(MouseEvent me) {
            Component component = me.getComponent();
            location = component.getLocation(location);
            int x = location.x - pressed.getX() + me.getX();
            int y = location.y - pressed.getY() + me.getY();
            component.setLocation(x, y);
        }

        public void mouseMoved(MouseEvent e) {
            Border border = BorderFactory.createLineBorder(Color.black);
            JTextArea component = (JTextArea) e.getComponent();
            component.setBorder(border);
        }
    }

}

Solution

  • Use the MouseEntered and MouseExited events of the MouseListener, which will let you know when the mouse enters or exists you component

    See How to Write a Mouse Listener for more details