0

This is a popup Jpanel with a JTextarea, but I have one problem. When I move the mouse on the JTextarea it blinks. Why does this happen?

In debug mode a mouse move generates a mouseExited event.

public class PopUpPanel extends JPanel {

    public PopUpPanel(final String info, int x_pos, int y_pos) {

        final JTextArea textArea = new JTextArea(info);
        add(textArea);
        setBackground(Color.WHITE);
        textArea.setVisible(false);
        setBounds(x_pos, y_pos, 20, 20);
        setOpaque(false);
        setVisible(true);
        final Rectangle bounds = getBounds();

        MouseInputAdapter mouseHandler = new MouseInputAdapter() {

            @Override
            public void mouseEntered(final MouseEvent e) {
                Rectangle bound = getBounds();
                bound.width = textArea.getPreferredSize().width;
                bound.height = textArea.getPreferredSize().height;
                setBounds(bound);
                textArea.setOpaque(true);
                textArea.setVisible(true);
            }
            @Override
            public void mouseExited(final MouseEvent e) {
                textArea.setOpaque(false);
                textArea.setVisible(false);
                setOpaque(false);
                setBounds(bounds);
            }
        };
        addMouseListener(mouseHandler);
    }
}
Don't Panic
  • 41,125
  • 10
  • 61
  • 80
Tkachuk_Evgen
  • 1,334
  • 11
  • 17

1 Answers1

2

Your fragment raises several l important points:

  • A component's use of opacity is the determined by UI delegate supplied by the user's chosen Look & Feel; it should not be modified except in the course of creating a new L&F.

  • Don't use setBounds(), or similar, when you really mean to override getPreferredSize(); alternatively, use a border, as shown below.

  • Swing GUI objects should be constructed and manipulated only on the event dispatch thread.

Following these guidelines, I see no flickering.

image

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.MouseEvent;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.event.MouseInputAdapter;

/**
 * @see https://stackoverflow.com/a/24275262/230513
 */
public class Test {

    private void display() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new PopUpPanel("Test popup panel"));
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    private static class PopUpPanel extends JPanel {

        public PopUpPanel(final String info) {
            final JTextArea textArea = new JTextArea(info);
            setBackground(Color.WHITE);
            setBorder(BorderFactory.createTitledBorder("Test"));
            add(textArea);
            MouseInputAdapter mouseHandler = new MouseInputAdapter() {

                @Override
                public void mouseEntered(final MouseEvent e) {
                    System.out.println(e);
                }

                @Override
                public void mouseExited(final MouseEvent e) {
                    System.out.println(e);
                }
            };
            addMouseListener(mouseHandler);
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Test().display();
            }
        });
    }
}
Community
  • 1
  • 1
trashgod
  • 203,806
  • 29
  • 246
  • 1,045