【问题标题】:Exception in thread "main" java.lang.StackOverflowError JPanel线程“主”java.lang.StackOverflowError JPanel 中的异常
【发布时间】:2017-08-24 13:13:58
【问题描述】:

当我尝试运行在框架内创建面板的程序时遇到此错误

我没有粘贴变量声明之类的部分代码,因为我没有太多空间!

Exception in thread "main" java.lang.StackOverflowError
    at java.util.HashMap.hash(HashMap.java:338)
        at java.util.HashMap.get(HashMap.java:556)
        at javax.swing.UIDefaults$TextAndMnemonicHashMap.get(UIDefaults.java:1244)
        at javax.swing.UIDefaults.getFromResourceBundle(UIDefaults.java:288)
        at javax.swing.UIDefaults.get(UIDefaults.java:162)
        at javax.swing.MultiUIDefaults.get(MultiUIDefaults.java:64)
        at javax.swing.UIDefaults.getUI(UIDefaults.java:753)
        at javax.swing.UIManager.getUI(UIManager.java:1016)
        at javax.swing.JPanel.updateUI(JPanel.java:126)
        at javax.swing.JPanel.<init>(JPanel.java:86)

LoginWindow.java:

创建主面板,分为包含标签、文本字段和按钮的子面板

public class LoginWindow extends JPanel {

    public LoginWindow() {

        LoginWindow p1 = new LoginWindow();
        LoginWindow p2 = new LoginWindow();
        LoginWindow p3 = new LoginWindow();
        LoginWindow p4 = new LoginWindow();
        LoginWindow p5 = new LoginWindow();
        LoginWindow p0 = new LoginWindow();

        p1.setLayout(new BorderLayout());
        p2.setLayout(new BorderLayout());
        p3.setLayout(new GridLayout(3, 1, 1, 1));
        p4.setLayout(new GridLayout(3, 1, 1, 1));
        p5.setLayout(new GridBagLayout());
        p0.setLayout(new BorderLayout());

        password = new JPasswordField();
        email = new JTextField();
        label_password = new JLabel("Password");
        label_email = new JLabel("Email");

        setLayout(new BorderLayout());

        add(p0,BorderLayout.NORTH);
        add(p1,BorderLayout.CENTER);
        add(p2,BorderLayout.SOUTH);

        sign_in = new JLabel("Sign in");
        sign_in.setFont(new Font("Serif", Font.PLAIN, 25));
        sign_in.setForeground(Color.red);
        p0.add(sign_in,BorderLayout.CENTER);

        p1.add(p3, BorderLayout.SOUTH);
        p1.add(p4, BorderLayout.NORTH);     

        p1.setBorder(BorderFactory.createLineBorder(Color.gray, 1, true));

        p4.add(label_email);
        p4.add(email);

        p3.add(label_password);
        p3.add(password);

        button = new Button("Create Account");
        button.setPreferredSize(new Dimension(120, 30));
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if(blank.equals(password.getPassword().toString()) || blank.equals(email.getText())){
                    JOptionPane.showMessageDialog(null, "Email or password missing !");
                }else {
                    DataBase db = new DataBase();
                    db.insertData(password.getPassword().toString(), email.getText());
                }
            }
        });

        p5.add(button);
        p2.add(p5,BorderLayout.CENTER);
    }
}

window.java:

从窗口类创建一个对象,并将创建的面板添加到选项卡式窗格中,全部在主框架内

public class window extends JFrame {

    public window() {
        super("Window");
        setSize(300,230);
        setVisible(true);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        //setResizable(false);
        setLocation(600, 100);

        JTabbedPane tabPane = new JTabbedPane();
        LoginWindow panel = new LoginWindow();
        tabPane.addTab("Sign in",panel );

        add(tabPane);
        //pack();
    }

    public static void main(String[] args) {
        window frame = new window();
    }
}

【问题讨论】:

  • 解决方案:不要不必要的用户递归。
  • @Psychosis404 你能给我们完整的代码吗.. 缺少一些定义。另外,您到底想做什么? 6个不同的登录窗口? 1 页有 6 个重复登录部分? ...有点困惑。
  • 问题解决了,我只需要添加另一个构造函数

标签: java eclipse swing stack-overflow


【解决方案1】:
public class LoginWindow extends JPanel {

     public LoginWindow() {

                LoginWindow p1 = new LoginWindow();

您正在尝试在 LoginWindow 的构造函数中实例化 LoginWindow。因此递归。

可能你需要另一个类/面板并在这里使用它?

【讨论】:

    【解决方案2】:

    您正在为 LoginWindow 的构造函数中创建 6 个新的 LoginWindow。 这会导致无限循环。

    这个循环一直循环下去,直到出现堆栈溢出:

    public LoginWindow() {
    
                LoginWindow p1 = new LoginWindow();
                LoginWindow p2 = new LoginWindow();
                LoginWindow p3 = new LoginWindow();
                LoginWindow p4 = new LoginWindow();
                LoginWindow p5 = new LoginWindow();
                LoginWindow p0 = new LoginWindow();
    

    根据您的代码尝试以下操作:

    您所要做的就是添加适当的布局以正确定位您的元素:

    class LoginWindow extends JFrame{
    
    
        public LoginWindow() {
            JPasswordField password = new JPasswordField();
            JTextField email = new JTextField();
            JLabel label_password = new JLabel("Password");
            JLabel label_email = new JLabel("Email");
    
            JLabel sign_in = new JLabel("Sign in");
            sign_in.setFont(new Font("Serif", Font.PLAIN, 25));
            sign_in.setForeground(Color.red);
    
            Button button = new Button("Create Account");
            button.setPreferredSize(new Dimension(120, 30));
            button.addActionListener(new ActionListener() {
    
            String blank = "";
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    if(blank.equals(password.getPassword().toString()) || blank.equals(email.getText())){
                        JOptionPane.showMessageDialog(null, "Email or password missing !");
                    }else {
    
                    }
                }
            });
    
    
            setVisible(true);
            setSize(300,230);
            setLocation(600, 100);
    
            JPanel panel = new JPanel();
    
            panel.add(label_email);
            email.setPreferredSize(new Dimension(100,20));
            panel.add(email);
    
            panel.add(label_password);
            password.setPreferredSize(new Dimension(100,20));
            panel.add(password);
    
    
            panel.add(button);
    
            this.getContentPane().add(panel);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
    
    
        }
    
    }
    

    然后运行:

    public static void main(String[] args) {
        LoginWindow frame = new LoginWindow();    
       }
    

    【讨论】:

    • 有什么选择??
    • @Psychosis404 真的取决于你想在这里做什么。
    • @Psychosis404 您似乎想创建 6 个不同的登录面板并将它们全部放在同一个窗口上?还是我错了?还是要弹出 6 个不同的窗口?
    • @MenelaosBakopoulos 我想创建一个主面板,其中包含包含按钮、文本字段和标签的其他面板,所有这些都在一个窗口中
    【解决方案3】:

    我添加了一个新的构造函数:

    public LoginWindow(LayoutManager l) {
        //Constructor for the main panel
    }
    
    public LoginWindow() {
    
        setLayout(new BorderLayout());
    
        LoginWindow p1 = new LoginWindow(new BorderLayout());
        LoginWindow p2 = new LoginWindow(new BorderLayout());
        LoginWindow p3 = new LoginWindow(new GridLayout(2, 1, 1, 1));
        LoginWindow p4 = new LoginWindow(new GridLayout(2, 1, 1, 1));
        LoginWindow p5 = new LoginWindow(new GridBagLayout());
        LoginWindow p0 = new LoginWindow(new BorderLayout());
    
    ...
    }
    

    当你在 window.java 中创建主面板时:

    LoginWindow panel = new LoginWindow();
    

    【讨论】:

    • 为什么要在同一个类中创建同一个对象?为什么采用这种设计方法?
    猜你喜欢
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    相关资源
    最近更新 更多