我有一个 Swing GUI,允许用户根据需要将 JTextFields 添加到 GUI。当我在控制台(在 ubuntu 上)本地运行它时,一切正常。当我在使用 X11 转发的 Windows 机器上从 Cygwin 运行 GUI 时,一切开始正常,但是当我单击“添加”按钮放置一个GUI上新建JTextField,文本字段按预期显示,但我很长一段时间无法点击或修改它等。实际上,我也无法单击原始文本字段.. 30 多秒后,文本字段恢复生机并正常工作,直到我再次单击“添加”。
我在下面包含了一个 SSCCE 来演示该问题。同样,这似乎只在使用 X11-forwarding 运行时发生,如果我直接在 Ubuntu 控制台上运行,它会按预期工作,所以我不确定这是否可以对其他人进行重现。
最后一条信息——在我的真实程序中,单击添加按钮会导致添加一个 JComboBox 和两个 JTextField。组合框会立即响应,但 GUI 上的所有文本字段(新的和旧的)都不是。
HmmFrame.java:
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
public class HmmFrame extends JFrame
{
ArrayList< JTextField > fields;
JPanel mainPan;
JButton addButton;
HmmFrame()
{
super("Hmmm");
JTextField curField;
fields = new ArrayList< JTextField >();
setLayout(new FlowLayout());
mainPan = new JPanel(new FlowLayout());
this.add(mainPan);
addButton = new JButton("Add");
addButton.addActionListener(new HmmListener());
this.add(addButton);
curField = new JTextField("Try");
fields.add(curField);
updateGUI();
setVisible(true);
}
public void updateGUI()
{
mainPan.removeAll();
for (JTextField curField : fields)
{
mainPan.add(curField);
}
pack();
}
public class HmmListener implements ActionListener
{
public void actionPerformed(ActionEvent actEv)
{
JTextField curField;
curField = new JTextField("New One" + fields.size());
fields.add(curField);
updateGUI();
}
}
}
嗯.java(驱动程序)
public class Hmm
{
public static void main(String [] args)
{
HmmFrame hmmFrame;
hmmFrame = new HmmFrame();
}
}