Java 使用IntelliJ GUI设计器在运行时向JPanel添加JComponent

Java 使用IntelliJ GUI设计器在运行时向JPanel添加JComponent,java,intellij-idea,jpanel,jcomponent,gui-designer,Java,Intellij Idea,Jpanel,Jcomponent,Gui Designer,我已经在GUI设计器的JPanel中初始化了我自己的JPanel,但是当单击按钮时,我似乎仍然无法将这个JTextField添加到我新创建的JPanel中。我没有收到任何错误,尝试过重新验证、验证、重新喷漆等。我甚至按照另一位用户的建议,将面板的布局设置为BoxLayout,但仍然不起作用 fieldsPanel是使用GUI设计器创建的,但我试图覆盖它 面板是我自己想要添加到fieldsPanel的代码 public class Form extends JFrame { private JP

我已经在GUI设计器的JPanel中初始化了我自己的JPanel,但是当单击按钮时,我似乎仍然无法将这个JTextField添加到我新创建的JPanel中。我没有收到任何错误,尝试过重新验证、验证、重新喷漆等。我甚至按照另一位用户的建议,将面板的布局设置为BoxLayout,但仍然不起作用

fieldsPanel
是使用GUI设计器创建的,但我试图覆盖它

面板
是我自己想要添加到
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);
}

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

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

$$$setupUI$$$(MainView.java)
这将创建Java代码(在本例中,MainView扩展了JDialog)。如果要手动初始化项目,正确的方法是选中设计器工具中的“自定义创建”框

选中此框后,将在代码中创建一个名为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();
    }

您没有向任何人显示足够的代码来真正了解发生了什么。试着把它缩减到只有相关的部分,但仍然使它成为一个重要的部分。(例如,what's
面板
,what's
fieldsPanel
,以及它们如何适合您的布局?)。
fieldsPanel
是使用GUI设计器创建的,我尝试覆盖它
panel
是纯代码。如果这是
表单
类的完整源代码,那么您永远不会初始化
rootPanel
addFieldButton
,也不会将
fieldsPanel
panel
添加到框架中。我弄明白了。一切都是通过GUI设计器正确初始化的,因此,例如,
fieldsPanel
rootPanel
addFieldButton
都是通过设计器创建的,并在运行时在那里初始化。不需要覆盖任何其他内容,但您向我通风报信,
面板
未被添加到帧中并预先初始化。非常感谢你!没问题;很乐意帮忙。不过,如果您将来遇到更复杂的问题,还可以查看GUI设计器为您生成的类的相关部分,这样我们就可以看到您是如何与生成的类交互的。