当鼠标移动时,JTextarea会闪烁

时间:2014-06-17 21:27:18

标签: java swing mouseevent jtextarea

这是一个带有JTextarea的弹出式Jpanel,但我有一个问题。当我在JTextarea上移动鼠标时,它会闪烁。为什么会这样?

在调试模式下,鼠标移动会生成mouseExited事件。

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

1 个答案:

答案 0 :(得分:2)

你的片段提出了几个重点:

  • 组件对opacity的使用由用户选择的外观和视频提供的UI代表确定。感觉;除了在创建新的L& F。

  • 的过程中,不应修改它
  • 当你真正想要similar时,不要使用setBounds()override getPreferredSize();或者,使用边框,如下所示。

  • 应在event dispatch thread构建和操作Swing GUI对象。

遵循这些指导原则,我看不到闪烁。

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