gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:43:54 26 4
gpt4 key购买 nike

这是一个带有 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com