这是一个带有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);
}
}
答案 0 :(得分:2)
你的片段提出了几个重点:
组件对opacity的使用由用户选择的外观和视频提供的UI代表确定。感觉;除了在创建新的L& F。
当你真正想要similar时,不要使用setBounds()
或override getPreferredSize()
;或者,使用边框,如下所示。
应在event dispatch thread上仅构建和操作Swing GUI对象。
遵循这些指导原则,我看不到闪烁。
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();
}
});
}
}