我正在图像查看器应用程序中构建一个创建幻灯片的方法 - 它将在经过一段时间后按顺序转到下一个图像。除非用户按下“esc”键,否则我希望这种情况发生在无穷大。键绑定似乎是正确的解决方案,但我不能用我们的头脑。到目前为止,这是我的代码:
private void slideshow(){
JOptionPane.showMessageDialog(null, "Press 'esc' to stop the slideshow", "Slideshow", JOptionPane.INFORMATION_MESSAGE, slideshow);
// sets the action listener that the timer triggers
ActionListener slideshowPerformer = new ActionListener() {
public void actionPerformed( ActionEvent event )
{
//goes to the next image every x seconds
nextFile();
}
};
Timer slideshowTimer = new Timer(slideshowTime, slideshowPerformer);
while(true){
//label is a JLabel
label.getInputMap().//the key binding code
}
}
虽然我已经使用MouseListener来浏览图像,但我对替代解决方案持开放态度。
答案 0 :(得分:2)
这意味着三件事......
由于您已经使用Swing Timer
并且已经提到过使用键绑定,因此您已经在正确的轨道上,您错过的链接是{{1与键绑定相关联应该停止Action
。
或者,如本例所示,Timer
应该通知其他感兴趣的一方(即观察者),Action
已被触发,观察者应采取适当的行动。
Action
答案 1 :(得分:0)
感谢您的帮助!我完全沉迷于while循环,并忘记了如何使用Swing计时器进行一分钟。这最终成为我最后的工作代码:
ActionListener stopAction = new ActionListener(){
public void actionPerformed(ActionEvent e){
slideshowTimer.stop();
}
};
// listens for the esc key to stop the slideshow
label.getRootPane().registerKeyboardAction(stopAction,
KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0),
JComponent.WHEN_IN_FOCUSED_WINDOW);
slideshowTimer.start();
答案 2 :(得分:-2)
我认为更好的解决方案是将计时器设置为0,然后输入while循环并在每次迭代时将其递增1。然后用一个数来模数,每当模数等于0时,转到下一帧。这是永远运行的,直到一个动作监听器正在监听你按下的esc键,你将其从循环中断开。
总而言之,我认为只需使用一些较低级别的想法,它就会使您的问题更容易解决。