[英]How to trigger a second event handler after a delay
我正在嘗試制作一個“刪除”按鈕,以刪除a)如果連續快速按下並釋放文本區域中的單個字符,或者b)如果按下並按住2秒鍾以上則不刪除所有文本發布。
這在Java中可行嗎?
為了能夠從鍵盤輸入中檢測長按,您需要了解和使用2個概念:
1. KeyListener 。
2.如何獲取當前時間 。
理解了兩者之后,只需比較keyPressed和keyReleased之間的時間,然后調用適當的刪除操作即可。
另外,對於Swing- Timer
(例如, 在此處觀看),您可以使用一個簡單的SwingWorker
來實現延遲。 通常,您不應該在Swing EDT上執行Thread.sleep(1000)
延遲,因為這會阻塞gui( 以獲取更多信息... )。 此外,您應該使用MouseListener
捕獲所需的其他信息(在釋放鼠標或退出buttona區域時停止計時器)。 這是一個非常簡短的示例:
public class JButtonTest extends JFrame {
public static void main(String[] args) {
JButtonTest x = new JButtonTest();
JButton button = new JButton("Delete");
button.addMouseListener(new MouseAdapter() {
private static final long DELTA = 2000;
private SwingWorker<Void, Void> waitingWorker;
private Long timer;
@Override
public void mousePressed(MouseEvent e) {
timer = System.currentTimeMillis();
System.out.println("delete single char");//DO single delete here
if (waitingWorker != null && !waitingWorker.isDone())
waitingWorker.cancel(true);
waitingWorker = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
Thread.sleep(DELTA);
return null;
}
@Override
protected void done() {
if (timer != null && System.currentTimeMillis() >= timer + DELTA)
System.out.println("delete all text");//DO text delete here
}
};
waitingWorker.execute();
}
@Override
public void mouseReleased(MouseEvent e) {
timer = null;
}
@Override
public void mouseExited(MouseEvent e) {
timer = null;
}
});
x.add(button);
x.setSize(100, 100);
x.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
x.setVisible(true);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.