在Netbeans中使用Jinput和Java,我正在开发一个非常小的项目,只需弹出一个JFrame
警报窗口,当我们让用户按下'K'
时当用户放开JFrame
时,键盘会终止'k'
警报窗口。在我的代码中,我似乎陷入了while循环,因为JFrame
在第一次按下时打开,似乎无法关闭。我研究过,发现使用javax.swing.Timer
是更好的方法。然而,由于我是这方面的新手,使用计时器的所有不同方式让我更加困惑。有人可以看看我的代码并指出我正确的方向吗?
这是我的代码;
public void startPolling() {
while(true) {
ControllerEnvironment.getDefaultEnvironment().getControllers();
ca[index].poll();
EventQueue queue = ca[index].getEventQueue();
Event event = new Event();
while(queue.getNextEvent(event)) {
StringBuffer buffer = new StringBuffer(ca[index].getName());
buffer.append(" at ");
buffer.append(event.getNanos()).append(", ");
Component comp = event.getComponent();
buffer.append(comp.getName()).append(" changed to ");
float value = event.getValue();
if(comp.isAnalog()) {
buffer.append(value);
} else {
if(value==1.0f) {
buffer.append("On");
if ("K".equals(comp.getName())){
alarmBox();
}
} else {
buffer.append("Off");
if ("K".equals(comp.getName())){
alarmBox.setVisible(false);
}
}
}
System.out.println(buffer.toString());
}
}
}
alarmBox()是我的JFrame。
我正在研究它,这是我的更新代码:
public void startPolling(){
Timer timer = new Timer(50, new ActionListener() {
public void actionPerformed(ActionEvent e) {
ca[index].poll();
EventQueue queue = ca[index].getEventQueue();
Event event = new Event();
while(queue.getNextEvent(event)) {
StringBuffer buffer = new StringBuffer(ca[index].getName());
buffer.append(" at ");
buffer.append(event.getNanos()).append(", ");
Component comp = event.getComponent();
buffer.append(comp.getName()).append(" changed to ");
float value = event.getValue();
if(comp.isAnalog()) {
buffer.append(value);
} else {
if(value==1.0f) {
buffer.append("On");
if ("K".equals(comp.getName())){
alarmBox();
}
} else {
buffer.append("Off");
if ("K".equals(comp.getName())){
alarmBox.dispose();
}
}
}
System.out.println(buffer.toString());
}
try {
Thread.sleep(20);
} catch (InterruptedException f) {
f.printStackTrace();
}
}
}); timer.start();
答案 0 :(得分:0)
如果你只想打开和关闭窗口,是否要使用计时器? 对于一项简单的任务,你有一个非常复杂的代码。 您可以向JFrame添加一个组件侦听器来隐藏,如下所示:
frame.addComponentListener(new ComponentAdapter(){
public void componentMoved(ComponentEvent e) {
if (popup.isVisible()){
popup.setVisible(false);
}
}
});