Java Swing UIManger导致速度缓慢

Java Swing UIManger导致速度缓慢,java,swing,uimanager,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应用程序将变得非常缓慢

我在我的实时股票价格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线程调用代码

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

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

实际上,修复方法是从单独的线程调用处理逻辑,而不是
事件调度线程(EDT)
。EDT是负责响应事件和绘制GUI的Swing线程,因此它不应执行长时间运行的代码,否则GUI将失去响应


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

该应用程序速度非常快,每天用于许多期货和期权市场的交易。我们发现,当特定的按钮在焦点上时,空格键会导致意外的点击。因此,我们提供了焦点输入映射修复。然而,从非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();
        }
    }
}