java - 扩展类(其父类扩展了 JFrame)后出现 StackOverflowError

标签 java swing

我正在制作一个计算器,目前有两个类。第一个是扩展 JFrame 并创建计算器框架的主类,第二个类是为 JFrame 创建按钮布局。我希望能够将 ButtonPanel 类中的文本设置到包含文本区域的主类,但是当我让 ButtonPanel 类扩展主类时,扩展 JFrame 它会导致这些错误。

Exception in thread "main" java.lang.StackOverflowError
at sun.awt.Win32GraphicsConfig.getBounds(Native Method)
at sun.awt.Win32GraphicsConfig.getBounds(Unknown Source)
at java.awt.Window.init(Unknown Source)
at java.awt.Window.<init>(Unknown Source)
at java.awt.Frame.<init>(Unknown Source)
at javax.swing.JFrame.<init>(Unknown Source)

我的代码

public class Calculator extends JFrame {
    public Calculator() {
        super("Calculator");
        setSize(300,200);
        setResizable(false);
        setLocationRelativeTo(null);

        textBox = new JTextField();
        getContentPane().add(textBox,BorderLayout.NORTH);

        getContentPane().add(new ButtonPanel(), BorderLayout.CENTER);
        setVisible(true);

    }
    protected JTextField textBox;
    public void setString(String str) {
        textBox.setText(str);
    }

    public static void main(String[] args) {
        Calculator ge = new Calculator();
    }
}

class ButtonPanel extends Calculator {

    ButtonPanel() {
        JPanel pan = new JPanel();
        GridBagLayout gbl = new GridBagLayout();
        pan.setLayout(gbl);
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.HORIZONTAL;

        gbc.gridx = gbc.gridy = 0;
        gbc.gridheight = gbc.gridwidth = 1;
        JButton button = new JButton("7");
        pan.add(button,gbc);
        button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                    int num = 7;
                    performAct(num);
                }
            });

        gbc.gridx = 1;
        button = new JButton("8");
        pan.add(button, gbc);
        button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                    int num = 8;
                    performAct(num);
                }
            });

        //Other Buttons not included
        void performAct(int buttonNum) {
            switch (buttonNum) {
            case 0: setString("0");
            case 1: setString("1");
            case 2: setString("2");
            case 3: setString("3");
            case 4: setString("4");
            case 5: setString("5");
            case 6: setString("6");
            case 7: setString("7");
            case 8: setString("8");
            case 9: setString("9");
            case 10: setString(" + ");
            case 11: setString( " - ");
            case 12: setString(" * ");
            case 13: setString( " / ");
            case 14: setString(" % ");
            }
        }
    }

最佳答案

 class ButtonPanel extends Calculator 

ButtonPanel 不应扩展计算器。 ButtonPanel 不是 JFrame。

ButtonPanel 可以扩展 JPanel,因为您想向其中添加组件。

JPanel pan = new JPanel();

那么就不需要创建JPanel了。您只需设置类的布局并直接添加组件即可。

查看 Swing 教程中关于 How to Use GridBagLayout 的部分有关如何构建类的更好示例。

关于java - 扩展类(其父类扩展了 JFrame)后出现 StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33272650/

相关文章:

java - 扫描仪中的 URL 结果

java - 使用 Jmeter 将文件从本地计算机传输到服务器

java - 输出为 "NaN"

java - Android:在alarmmanager触发的服务中使用唤醒锁

Java 替换 Matcher

java - 以 JFrame 形式创建对象

java - 在Java中将变量返回到第二帧

java - 如何在 Swing 应用程序中编写更改窗口的逻辑?

java - 如何使用java.awt.Robot发送包含大写字母和小写字母以及特殊字符的字符串?

java - JFrame 布局帮助/指南,