首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么swing表单生成器不生成二进制类文件/java源代码?

为什么swing表单生成器不生成二进制类文件/java源代码?
EN

Stack Overflow用户
提问于 2020-01-24 12:32:06
回答 1查看 576关注 0票数 0

这是我的项目:https://github.com/Kolyall/GUIExample

MainClass

代码语言:javascript
复制
import javax.swing.*;

public class MainClass {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(MainFrame::new);
    }

}

MainFrame

代码语言:javascript
复制
import javax.swing.*;
import java.awt.*;

public class MainFrame extends JFrame {

    public MainFrame() {
        super("MainFrame");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setMinimumSize(new Dimension(850, 650));
        setSize(new Dimension(850, 650));


        JPanel rootPanel = new JPanel();
        rootPanel.setLayout(new BoxLayout(rootPanel, BoxLayout.X_AXIS));
        getContentPane().add(rootPanel);
        setLocationRelativeTo(null);
        setVisible(true);

        ButtonsFrame buttonsFrame = new ButtonsFrame()
        rootPanel.add(buttonsFrame.buttonsPanel);//java.lang.NullPointerException in this line
    }

}

ButtonsFrame

代码语言:javascript
复制
import javax.swing.*;

public class ButtonsFrame {
    public JButton button1Button;
    public JButton button2Button;
    public JPanel buttonsPanel;
}

ButtonsFrame.form

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.github.kolyall.test.ButtonsFrame">
  <grid id="27dc6" binding="buttonsPanel" layout-manager="GridLayoutManager" row-count="2" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
    <margin top="0" left="0" bottom="0" right="0"/>
    <constraints>
      <xy x="20" y="20" width="500" height="400"/>
    </constraints>
    <properties/>
    <border type="none"/>
    <children>
      <component id="70295" class="javax.swing.JButton" binding="button1Button" default-binding="true">
        <constraints>
          <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
        </constraints>
        <properties>
          <text value="Button1"/>
        </properties>
      </component>
      <vspacer id="3d1dd">
        <constraints>
          <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
        </constraints>
      </vspacer>
      <component id="76c52" class="javax.swing.JButton" binding="button2Button" default-binding="true">
        <constraints>
          <grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
        </constraints>
        <properties>
          <text value="Button2"/>
        </properties>
      </component>
    </children>
  </grid>
</form>

但是在运行MainClass.main()之后,会发生以下错误:

代码语言:javascript
复制
Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException
    at java.awt.Container.addImpl(Container.java:1095)
    at java.awt.Container.add(Container.java:419)
    at com.github.kolyall.test.MainFrame.<init>(MainFrame.java:29)

似乎IntelliJ IDEA不生成二进制类文件,但选项是打开的,我还尝试了使用“Java源代码”

更新:这是“Idea Why swing GUI form builder doesn't generate binary class files/java source code?”的已知问题

EN

回答 1

Stack Overflow用户

发布于 2020-01-24 13:53:34

这与二进制代码的归纳无关。你的代码看起来又丑又错。

代码语言:javascript
复制
ButtonsFrame buttonsFrame = new ButtonsFrame()
rootPanel.add(buttonsFrame.buttonsPanel);

这里有一个NPE,因为您还没有在buttonsPanel类中初始化ButtonsFrame

例如:

代码语言:javascript
复制
public class ButtonsFrame {
    public JButton button1Button = new JButton("OK");
    public JButton button2Button = new JButton("Cancel");
    public JPanel buttonsPanel = new JPanel();
}

但是在OOP中,公共成员变量是不受欢迎的。更好的方法是提供创建现成按钮面板的方法。

代码语言:javascript
复制
public class ButtonsFrame {
    private JButton button1Button = new JButton("OK");
    private JButton button2Button = new JButton("Cancel");
    private JPanel buttonsPanel = new JPanel();

    public JPanel createButtonsPanel() {
        buttonsPanel.removeAll();
        buttonsPanel.add(button1Button);
        buttonsPanel.add(button2Button);
        return buttonsPanel;
    }
}

稍后再使用,以便:

代码语言:javascript
复制
rootPanel.add(buttonsFrame.createButtonsPanel());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59896471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档