我正在尝试制作一个'删除'按钮,删除a)文本区域中的单个字符,如果按下并快速连续释放,或b)所有文本如果按下并按住超过2秒没有释放。
这在Java中是否可行?
答案 0 :(得分:0)
为了能够从键盘输入中检测长按键,您需要理解并使用2个概念:
1. KeyListener。
2.如何获得current time
一旦理解了两者,只需比较keyPressed和keyReleased之间的时间并调用正确的删除操作。
答案 1 :(得分:0)
与Swing交替 - Timer
(例如,观看here)您可以使用简单的SwingWorker
来实现延迟。通常,你不应该在Swing EDT上执行延迟,即Thread.sleep(1000)
,因为这会阻止gui(for further information ...)。此外,您应该使用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);
}
}