使用IntelliJ GUI Designer在运行时将JComponent添加到JPanel

时间:2014-01-25 21:04:01

标签: java intellij-idea jpanel jcomponent gui-designer

我已经在GUI Designer的JPanel中初始化了我自己的JPanel但是当单击该按钮时,我仍然无法将此JTextField添加到我新创建的JPanel中。我没有错误,尝试重新验证,验证,重新绘制等等。我甚至按照其他用户的建议将布局设置为我的面板作为BoxLayout,但仍然无效。

fieldsPanel是使用GUI Designer创建的,但我尝试覆盖它。

panel是我自己想要添加到fieldsPanel的代码。

public class Form extends JFrame {

private JPanel rootPanel;
private JPanel fieldsPanel;
private JPanel panel;

public Form() {
    fieldsPanel = new JPanel();
    panel = new JPanel();
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

    setContentPane(rootPanel);

    pack();

    addFieldButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            JTextField skuField = new JTextField();
            panel.add(skuField);
            fieldsPanel.add(panel);
            pack();
            repaint();
        }
    });

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    setVisible(true);
}

1 个答案:

答案 0 :(得分:1)

首先评论GUI设计师。 GUI设计人员非常适合RAD和可以编写代码的人,但是在GUI开发方面缺乏经验,需要进行一次性GUI项目。在所有其他情况下,甚至在最后提到的情况下,学习如何仅使用代码而不是NetBeans和IntelliJ中的设计器工具来进行GUI开发是一个更好的长期策略。主要原因是它隐藏了开发人员的东西 - 所以当出现问题时,你无法看到问题所在,看到的是调试的第一步(也是最重要的)。这就是开发人员花费数小时实现日志文件并使用调试器逐步执行程序的原因。话虽如此,关于这个问题:

IntelliJ使用XML为您生成Java代码。使用设计器工具时,XML是在幕后构建的。运行程序时,有一个方法调用

$$$setupUI$$$(MainView.java)

创建Java代码(在这种情况下,MainView扩展了JDialog)。如果要手动初始化项目,正确的方法是选中设计器工具中显示自定义创建

的框。

enter image description here

选中此框后,会在代码中创建一个名为createUIComponents的方法。 在此方法中,您可以添加自定义创建代码,例如:

    private void createUIComponents() {
    // TODO: place custom component creation code here
     fieldsPanel = new JPanel();
     panel = new JPanel();
}

所以在与设计师合作时你必须记住的是你必须遵守他们的规则。使用提供的功能。最后要注意的是,createUIComponents方法会在此对象进入范围时被调用 - 不会立即也不会立即调用。

如果您遵循此路径,那么您的示例需要更改为:

    public class Form extends JFrame {

private JPanel rootPanel;
private JPanel fieldsPanel;
private JPanel panel;

public Form() {

    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
    setContentPane(rootPanel);
    pack();

    addFieldButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            JTextField skuField = new JTextField();
            panel.add(skuField);
            fieldsPanel.add(panel);
            pack();
            repaint();
        }
    });

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
    setVisible(true);
}

private void createUIComponents() {
        // TODO: place custom component creation code here
        fieldsPanel = new JPanel();
        panel = new JPanel();
    }