Java обнаруживает долгое нажатие мыши - PullRequest
1 голос
/ 22 июля 2011

Есть ли способ перехватить событие, если пользователь нажмет на компонент JList более чем на 3 секунды?

Трудная часть, которую я нахожу, - это событие, которое должно быть запущено даже до того, как пользователь отпустит левую кнопку мыши. (что может быть легко сделано парой mousePressed и mouseReleased)

Ответы [ 5 ]

4 голосов
/ 09 января 2012

Два разных решения (почти такие же, как и предыдущие):

    new MouseAdapter() {
        Date pressedTime;
        long timeClicked;

        @Override
        public void mousePressed(MouseEvent e) {
            pressedTime = new Date();
        }
        @Override
        public void mouseReleased(MouseEvent e) {
            timeClicked = new Date().getTime() - pressedTime.getTime();
            if (timeClicked >= 3000) {
                // DO YOUR ACTION HERE
            }
        }
    };

или

new MouseAdapter() {
    boolean mousePressed = false;

    @Override
    public void mousePressed(MouseEvent e) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                mousePressed = true;
                while (mousePressed) {
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    if (mousePressed) {
                        // DO YOUR ACTION HERE
                    }
                }
            }
        }).start();
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        mousePressed = false;
    }
}
4 голосов
/ 22 июля 2011

Вот что я использую для подобных ситуаций:

public class Player implements Runnable, MouseListener
{
    public void mousePressed(MouseEvent e)
    {
        holding = true;
        thread = new Thread(this);
        thread.start();
    }

    public void mouseReleased(MouseEvent e)
    {
        holding = false;
        System.out.println("Held for: "+seconds);
    }
    public void mouseClicked(MouseEvent e){}

    public void run()
    {
        try
        {
            while(holding)
            {
                seconds++;
                // put some code here
                if(seconds==3)
                {
                    holding = false;
                    System.out.println("Held for maximum time!");
                }
            }
        }catch(Exception e){e.printStackTrace();}

    private boolean holding;
    private int seconds;
    private Thread thread;
}

добавьте это в свой JLabel, вызвав label.addMouseListener (new Player ());

4 голосов
/ 22 июля 2011

Вы можете установить таймер в прослушивателе событий mouseDown и запускать его каждые 500 мс после начальной задержки 3000 мс. В вашей выпущенной мыши вы можете отменить этот таймер. В методе запуска объекта TimerTask, связанного с вашим Timer, вы можете выполнить расчет требуемой задачи. Вот мое предложение по решению:

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

public class Test
{
    public static void main(String[] args)
    {
        final JFrame f = new JFrame();
        String[] data = {"one", "two", "three", "four"};
        JList myList = new JList(data);
        f.add(myList);
        myList.addMouseListener(
            new MouseAdapter()
            {
                private java.util.Timer t;
                public void mousePressed(MouseEvent e)
                {
                    if(t == null)
                    {
                        t = new java.util.Timer();
                    }
                    t.schedule(new TimerTask()
                    {
                        public void run()
                        {
                            System.out.println("My importan task goes here");
                        }
                    },3000,500);
                }

                public void mouseReleased(MouseEvent e)
                {
                    if(t != null)
                    {
                        t.cancel();
                        t = null;
                    }
                }
            }
            );
            f.pack();
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    f.setVisible(true);
                }
            }
        );
    }
}
1 голос
/ 22 июля 2011

У меня есть идея.Это не совсем слушатель, но вы можете сделать на mousePressed запуск таймера.Когда таймер достигает 3 секунд, ваше событие начинается или, если они отпускаются, на mouseReleased таймер останавливается.

0 голосов
/ 26 марта 2014

С помощью этого кода вы можете обнаруживать нажатые длинные или короткие нажатия (например, щелчки) и управлять ими, одно событие исключает другое.

private int pressStatus = 0; // TO DETECT IF LONG IS REAL LONG OR SHORT PRESSED
private Timer t;

...

@Override
public void mousePressed(final MouseEvent arg0) {
    pressStatus = 0; // to manage simple click or long

    if (t == null) {
        t = new Timer();
    }
    t.schedule(new TimerTask() {
        public void run() {
            pressStatus = 1;

            if (t != null) {
                t.cancel();
                t = null;
            }

            // PRESSED LONG
            int modifiers = arg0.getModifiers();
            if ((modifiers & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK) {
                ...
            } else if ((modifiers & InputEvent.BUTTON1_MASK) == InputEvent.BUTTON1_MASK) {
                ....
            }
        }
    }, 700, 1);
}

@Override
public void mouseReleased(MouseEvent arg0) {
    if (t != null) {
        t.cancel();
        t = null;
    }

    // PRESSED SHORT LIKE CLICK
    if (pressStatus == 0) {
        int modifiers = arg0.getModifiers();
        if ((modifiers & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK) {
            ...
        } else if ((modifiers & InputEvent.BUTTON1_MASK) == InputEvent.BUTTON1_MASK) {
            ...
        }
    }

    pressStatus = 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...