2017-07-25 116 views
0

我在我的实时股票GUI GUI应用程序中遇到了一个奇怪的问题。 问题是这样的代码:Java Swing UIManger导致速度缓慢

InputMap im = (InputMap)UIManager.get("Button.focusInputMap"); 
im.put(KeyStroke.getKeyStroke("pressed SPACE"), "none"); 
im.put(KeyStroke.getKeyStroke("released SPACE"), "none"); 

如果从主线程中调用它的整个GUI应用程序变得很慢,滚动表时向上/向下滞后。 修复似乎是从Swing线程调用代码。

当错误的线程调用它时发生了什么?

回答

1

该修复似乎是从Swing线程调用代码。

其实修复是从一个单独的线程调用处理逻辑,而不是Event Dispatch Thread (EDT)。 EDT是负责响应事件并绘制GUI的Swing线程,因此它不应该执行长时间运行的代码或GUI变得无响应。

阅读有关Concurrency的Swing教程的部分以获取更多信息。您可以使用SwingWorker执行长时间运行的代码。

+0

看到我上面的答案,谢谢 – vmuser

0

该应用程序非常快速,每天用于许多期货和期权市场的交易。我们发现,当特定按钮聚焦时,空格键会导致意外点击。因此我们附带了焦点输入贴图修复。然而,从非EDT线程调用这个“修复”会导致整个应用程序以“跛行”模式运行,这很疯狂。

这与任何处理或比赛无关。这里是更多的上下文:

//SLOW: 
public static void main(String[] args) 
{ 
    InputMap im = (InputMap)UIManager.get("Button.focusInputMap"); 
    im.put(KeyStroke.getKeyStroke("pressed SPACE"), "none"); 
    im.put(KeyStroke.getKeyStroke("released SPACE"), "none"); 

    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      //just GUI no processing, no changes 
      startAndRunGUI(); 
     } 
    } 
} 
//FAST: 
public static void main(String[] args) 
{ 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 

      InputMap im = (InputMap)UIManager.get("Button.focusInputMap"); 
      im.put(KeyStroke.getKeyStroke("pressed SPACE"), "none"); 
      im.put(KeyStroke.getKeyStroke("released SPACE"), "none"); 


      //just GUI no processing, no changes 
      startAndRunGUI(); 
     } 
    } 
} 
+0

这段代码的重点是什么?我什么也没做。 – camickr