我正在制作一个计算器,目前有两个类。第一个是扩展 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/