如果用戶在JList組件上按下超過3秒,是否有任何方法捕獲事件?Java檢測長按鼠標
我發現的困難部分是事件需要在用戶放開鼠標左鍵之前觸發。 (可以通過mousePressed和mouseReleased輕鬆完成)
如果用戶在JList組件上按下超過3秒,是否有任何方法捕獲事件?Java檢測長按鼠標
我發現的困難部分是事件需要在用戶放開鼠標左鍵之前觸發。 (可以通過mousePressed和mouseReleased輕鬆完成)
我有一個想法。它不完全是一個聽衆,但你可以做的是在mousePressed
你可以做一個定時器開始。當計時器達到3秒時,您的活動開始,或者如果他們放開,在mouseReleased
計時器停止。
繼承人什麼我使用對於類似的情況:
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;
}
通過調用label.addMouseListener添加到您的JLabel(新播放器());
所以現在你有一個控制變量可以在多個線程上訪問,如果你想在UI中做任何事情(這可能是因爲用戶做了一些代碼應該反應的東西),你需要從該線程回到UI線。與簡單的Swing'Timer'相比,所有這些優點有什麼好處? – Robin
您可以在您的mouseDown事件偵聽器中設置一個計時器,並在初始延遲3000毫秒後每500毫秒執行一次。在你的鼠標釋放你可以取消該計時器。在與Timer
關聯的TimerTask
對象的運行方法上,您可以執行所需任務的計算。這裏是我的解決方案:
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);
}
}
);
}
}
您的代碼有效!只是好奇...爲什麼我們需要把f.setvisible(true);在SwingUtilities.invokeLater()中? – Reusable
這很好,另外一個好的補充是,第一次點擊應該執行任務,然後在3秒後用戶仍然是鼠標按下,然後每500ms啓動一次計劃任務 –
兩種不同的解決方案(幾乎相同,以前的):
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;
}
}
有了這個代碼,你可以檢測和管理壓長或短(如點擊),一個事件排除另一個事件。
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;
}
所有答案(截至2016年)都含有微妙的錯誤,絕不應該原樣使用。 –