1

我有一个 JDialog 类:

public class Test extends JDialog {
private JPanel panel = new JPanel ( new BorderLayout() );
 public Test () {
   super(frame,"Evidenziatore");
   setDefaultCloseOperation(HIDE_ON_CLOSE);
   setVisible(true);
   add( panel, BorderLayout.CENTER );
 }
}

我想做的是JDIalog在用户退出JDialog或退出JPanel几秒钟后消失,例如使用mouseEnteredmouseExited事件或用户点击其他地方后。我的意思是 chrome 或 firefox 搜索窗口之类的东西,可以使用ctrl-f.

我怎样才能做到这一点?

谢谢

4

3 回答 3

2

您可以使用在 a或Timer上触发的 a 。您还可以使用 a来处理 Dialog 失去焦点(计时器启动)或获得焦点(计时器停止,不会触发与计时器相关的事件)时发生的情况。mouseEnteredmouseExitedFocusListener

于 2013-08-23T07:40:17.713 回答
2

首先看一下如何编写鼠标侦听器

这实际上是一个复杂的问题。

基本上,当您将鼠标侦听器添加到视觉层次结构中较高的组件时,它的子组件(较高的组件覆盖)将不再接收鼠标事件......

所以一个基本的例子可能看起来像这样......

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class AutoHide {

    public static void main(String[] args) {
        new AutoHide();
    }

    private Timer autoHideTimer;

    public AutoHide() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                final JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new JLabel("Auto Hide"));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

                autoHideTimer = new Timer(1000, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        frame.dispose();
                    }
                });
                autoHideTimer.setRepeats(false);

                frame.addMouseListener(new MouseAdapter() {
                    @Override
                    public void mouseExited(MouseEvent e) {
                        System.out.println("Restart...");
                        autoHideTimer.restart();
                    }

                    @Override
                    public void mouseEntered(MouseEvent e) {
                        System.out.println("Stop");
                        autoHideTimer.stop();
                    }
                });

            }
        });
    }

}

现在这将起作用,因为JLabel它没有MouseListener附加,但是如果您要添加JPanel到内容窗格并添加一个MouseListener,它将阻止鼠标事件进入框架......

于 2013-08-23T07:41:11.873 回答
0

使用带有 JTextField 的面板!您应该编写自己的 TextField 并覆盖该focusLost(FocusEvent e)方法。像这样工作:

public class MyTextField extends JTextField implements FocusListener

Eclipse(或 NetBeans)应该警告您必须重写某些方法,这样做!

使用时钟或其他东西让它在几秒钟后消失。例如:

Thread.sleep(5000);

现在你的程序应该休眠 5 秒。请记住,您应该使用其他线程,因为如果使用一个线程,只要计时器运行,gui 就会冻结

于 2013-08-23T07:41:01.783 回答