java - 当鼠标在 JTextarea 上移动时,JTextarea 会闪烁

标签 java swing mouseevent jtextarea

这是一个带有 JTextarea 的弹出 Jpanel,但我有一个问题。当我将鼠标移到 JTextarea 上时,它会闪烁。为什么会出现这种情况?

在 Debug模式下,鼠标移动会生成 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);
    }
}

最佳答案

您的片段提出了几个重要的观点:

  • 组件对 opacity 的使用由用户选择的外观和感觉提供的 UI 委托(delegate)确定;除非在创建新的 L&F 过程中,否则不应对其进行修改。

  • 不要使用setBounds(),或similar ,当你真的想override getPreferredSize()时;或者,使用边框,如下所示。

  • Swing GUI 对象应该event dispatch thread 上构建和操作。 .

遵循这些准则,我没有看到闪烁。

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

关于java - 当鼠标在 JTextarea 上移动时,JTextarea 会闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24273589/

相关文章:

java - ItemWriter 仅提交第一个提交间隔

java.lang.NoClassDefFoundError : okhttp3. OkHttpClient$Builder

Java tic tac toe 问题与极小极大算法

cocoa - 拖动时未在嵌套 View 上调用 NSView mouseEntered - 黑客攻击是唯一的选择吗?

javascript - 检测鼠标点击位置

c# - WPF DataGrid PreviewMouseDown 未按预期处理右键单击

java - OOP - 一个类(class)如何变成另一个类(class)?

java - 添加到 BorderLayout 的 JTextArea 不可见

java - 如何在JPanel中设置背景图片

java - 是否可以根据使用一个 MouseListener 单击哪一个文本字段来删除两个单独的文本字段中的文本?