Java Swing UIManger导致缓慢

时间:2017-07-25 21:28:41

标签: java swing uimanager

我在实时股票价格GUI java应用程序中遇到了一个奇怪的问题。 问题是这段代码:

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

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

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

2 个答案:

答案 0 :(得分:1)

  

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

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

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

答案 1 :(得分:0)

该应用程序非常快,每天用于许多期货和期权市场的交易。我们发现当特定按钮处于焦点上时,空格键会导致意外点击。因此我们带来了焦点输入图修复。不过要称之为"修复"从非EDT线程将导致整个应用程序在" limp"模式,这很疯狂。

这与任何处理或比赛无关。以下是更多背景信息:

//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();
        }
    }
}