我有一个Swing GUI,允许用户根据需要将JTextField添加到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();
}
}
}
Hmm.java(司机)
public class Hmm
{
public static void main(String [] args)
{
HmmFrame hmmFrame;
hmmFrame = new HmmFrame();
}
}