在JTable
上,当反复按下向下箭头键时,会快速连续触发多个KeyEvent。我的要求是我只需要在最后KeyEvent
采取行动。我想在TimerTask
中使用KeySelectionListener
,但它会给出不确定的结果。
知道可以在KeyListener
中进行哪些更改吗?
示例代码 -
addKeyListener(new KeyListener() {
Timer t = new Timer();
TimerTask tt;
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
tt.cancel();
tt = null;
}
@Override
public void keyPressed(KeyEvent e) {
if (tt != null)
return;
tt = new TimerTask() {
@Override
public void run() {
System.out.println("Selected-- "+getModel().getValueAt(getSelectedRow(), 2));
}
};
// t.scheduleAtFixedRate(tt, 0, 500);
t.schedule(tt, 0, 200);
}
});
由于
答案 0 :(得分:2)
使用Timer
的想法(我强烈建议您使用javax.swing.Timer
类,因为您与Swing组件交互)应该有效。
只需将重复设置为false
,如果计时器未运行,则在收到击键时启动计时器,或者在计时器运行时重新启动计时器。这将导致最后一个键的处理稍有延迟(延迟=您在计时器上设置的延迟),但避免对每个键击做出反应
答案 1 :(得分:0)
我只使用了Timer。我在监听器中维护了KeyEvent的引用,如果在预定义的延迟中接收到另一个KeyEvent(为了测试保持1秒),则引用新事件。因此,当1秒没有新的keyEvent时,最后引用的事件用于进一步处理。它现在工作。随意提出您的意见。
addKeyListener(new KeyListener(){
KeyEvent eventToProcess;
Timer t = new Timer();
TimerTask tt;
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
if(tt != null){
tt.cancel();
tt = null;
}
}
@Override
public void keyReleased(KeyEvent e) {
eventToProcess = e;
tt = new TimerTask() {
@Override
public void run() {
System.out.println("Selected-- "+getModel().getValueAt(getSelectedRow(), 2)+" Key Event > "+eventToProcess.getKeyChar());
}
};
t.schedule(tt, 1000);
}
});