1

我有一个主类在这个类中实现 MouseListener 和一个 TimerTask。如何在 MouseEnter 事件中运行此代码。我的意思是当鼠标悬停在框架上时 Timer 任务将执行指定的时间

public class NewClass extends JPanel implements MouseListener {

 public NewClass() {
    JFrame frame=new JFrame();
    addMouseListener(this);
    Timer t=new Timer();
    TimerTask task=new TimerTask() {

        @Override
        public void run() {
             System.out.println("heloo");
        }
    };
   t.schedule(task, 1000);

   }


@Override
public void mouseEntered(MouseEvent me) {

}


public static  void main(String[]args){

    JFrame frame=new JFrame();
    frame.add(new NewClass());
    frame.setSize(300,300);
    frame.setVisible(true);
}

}
4

1 回答 1

1

始终将Swing Timer用于与 GUI 相关的任务,如 javadoc 中提到的:

一般来说,我们建议使用 Swing 计时器而不是通用计时器来处理与 GUI 相关的任务,因为 Swing 计时器都共享相同的、预先存在的计时器线程,并且与 GUI 相关的任务会自动在事件调度线程上执行。但是,如果您不打算从计时器触摸 GUI,或者需要执行冗长的处理,则可以使用通用计时器。

阅读教程后,您将了解我所做的:

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

public class TimerDemo extends JFrame {

    private static final long serialVersionUID = 1L;
    private javax.swing.Timer timer;

    public TimerDemo() {
        super("Panel Timer Demo");
        //initialing swing timer
        timer = new javax.swing.Timer(100, getButtonAction());
        JPanel p = new JPanel ();
        p.addMouseListener(new MouseAdapter(){
            @Override
            public void mouseEntered(MouseEvent ev){
                timer.start();
            }
            @Override
            public void mouseExited(MouseEvent ev){
                timer.stop();
                }
            });

          p.setBackground(Color.blue);

          getContentPane().add(p,BorderLayout.CENTER);
          setDefaultCloseOperation(3);
          setLocationRelativeTo(null);
          pack();
    }

    private ActionListener getButtonAction() {
        ActionListener action = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Heloo");
            }
        };
        return action;
    }

    public static void main(String... args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TimerDemo().setVisible(true);
            }
        });
    }
}
于 2013-07-15T14:17:54.820 回答