Java JTextField停止GUI

时间:2014-04-14 17:37:29

标签: java jframe

目前我的代码看起来像这样

public Frame(String title, Integer x, Integer y)
{
    gui = new JFrame(title);

    // Give style to the GUI

    this.Style(x, y);

    // Build our GUI

    new Builder(gui);
}

public void Style(Integer width, Integer height)
{
    gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    gui.setVisible(true);
    gui.setResizable(false);
    gui.setSize(new Dimension(width, height));
    gui.setLayout(new GridLayout(5, 4));
}

Builder.java

public class Builder 
{
    public Builder(JFrame frame)
    {
        Build gui = new Build(frame);
        JTextField input = gui.buildInput("aaaaa");
        JButton button1 = gui.buildButton("aaa");
        JButton button21 = gui.buildButton("aaa");
    }
}

Build.java

public class Build 
{
    private JFrame frame;

    public Build(JFrame frame)
    {
        this.frame = frame;
    }

    public JButton buildButton(String text)
    {
        JButton button = new JButton(text);
        frame.add(button);

        return button;
    }

    public JTextField buildInput(String text)
    {
        JTextField textArea = new JTextField(text);
        frame.add(textArea);

        return textArea;
    }
}

一切正常,除非我尝试添加JTextField,如果我这样做,JTextField不会出现,其余的GUI元素会消失,例如我在Builder类上尝试以下内容

   Build gui = new Build(frame);
   //JTextField input = gui.buildInput("aaaaa");
   JButton button1 = gui.buildButton("aaa");
   JButton button21 = gui.buildButton("aaa");

在我的框架上工作并显示2个按钮,但是我取消注释JTextField输入,GUI按钮不会像TextField一样显示。

1 个答案:

答案 0 :(得分:1)

我没有找到有关您的问题的任何官方文档,但问题似乎是您的框架没有无效并在您向其添加组件时重新验证自己。我能够解决这两种不同的方式。

  1. 在构建GUI后,将frame.setVisible(true)的呼叫转移到。这将强制框架在显示之前重新验证其布局。
  2. 构建GUI后调用frame.validate() ,这也解决了问题。
  3. 在这两种情况下,将其中任何一个放在Builder构造函数的最后一行中都能正常工作。

    通常,将组件添加到另一个组件应该强制重新验证,但由于某种原因,这种情况不会发生。但是,我通常会尝试将所有组件添加到我的框架中,然后再将它们显示出来,这可能是一个很好的做法。

    修改:我在java.awt.Containter中的add(Component comp)方法的API文档中找到了这一点(强调我的):

      

    此方法更改与布局相关的信息,因此使组件层次结构无效。 如果容器已经显示,则必须在此后验证层次结构才能显示添加的组件。

    因此,如果组件已经可见,则必须对其进行验证。调用setVisible(true)将导致验证,这就是为什么在添加所有内容后调用它会解决问题。