2

我有一个 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();
  }
}
4

0 回答 0