我在实时股票价格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线程调用代码。
当错误的线程调用它时会发生什么?
答案 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();
}
}
}