【问题标题】:Adding JComponent to JPanel at runtime with IntelliJ GUI Designer使用 IntelliJ GUI Designer 在运行时将 JComponent 添加到 JPanel
【发布时间】:2014-01-25 21:04:00
【问题描述】:

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

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

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);
}

【问题讨论】:

  • 你没有显示足够的代码让任何人真正看到发生了什么。尝试将其缩减为仅相关的内容,但仍将其设为SSCCE。 (例如,panel 是什么,fieldsPanel 是什么,它们如何适合您的布局?)
  • 感谢您的回复,我更新了更多信息。 fieldsPanel 是使用 GUI 设计器创建的,我尝试覆盖它。 panel 是纯代码。
  • 如果这是Form 类的完整源代码,您永远不会初始化rootPaneladdFieldButton,并且fieldsPanelpanel 都不会被添加到框架中。
  • 我想通了。一切都通过 GUI 设计器正确初始化,例如,fieldsPanelrootPaneladdFieldButton 都是通过设计器创建的,并在运行时在那里初始化。不需要覆盖任何其他内容,但您提示我 panel 没有被添加到框架并事先对其进行初始化。非常感谢!
  • 没问题;乐意效劳。但是,如果您将来遇到更复杂的事情,还可以查看 GUI Designer 为您生成的类的相关部分,以便我们可以看到您如何与生成的内容进行交互。

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


【解决方案1】:

首先是对 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();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 2019-04-02
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多