簡體   English   中英

延遲后如何觸發第二個事件處理程序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM