用键绑定打破循环

时间:2017-12-02 01:22:43

标签: java swing while-loop key-bindings

我正在图像查看器应用程序中构建一个创建幻灯片的方法 - 它将在经过一段时间后按顺序转到下一个图像。除非用户按下“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来浏览图像,但我对替代解决方案持开放态度。

3 个答案:

答案 0 :(得分:2)

与大多数UI框架一样,Swing是事件驱动的。与大多数UI框架一样,Swing也是单线程的,而不是线程安全的。

这意味着三件事......

  1. 您永远不应该在事件调度线程的上下文中执行长时间运行或阻塞操作(如无限循环)
  2. 您不应该在EDT上下文之外更新UI的状态
  3. 当某种状态发生变化时,你应该使用某种观察者模式来采取行动。
  4. 由于您已经使用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键,你将其从循环中断开。

总而言之,我认为只需使用一些较低级别的想法,它就会使您的问题更容易解决。