Java JInternalFrame

Java JInternalFrame,java,jframe,jinternalframe,Java,Jframe,Jinternalframe,我正在制作一个程序,但我不知道如何让它工作: 我有一个主机: package itneizapenoitseg; public class mainFrame extends JFrame { private dbconnection database = new dbconnection(); // DB connetion data (login , passw ..) private JDesktopPane desktop = new JDesktopPane();

我正在制作一个程序,但我不知道如何让它工作: 我有一个主机:

package itneizapenoitseg;

public class mainFrame extends JFrame {

    private dbconnection database = new dbconnection(); // DB connetion data (login , passw ..)
    private JDesktopPane desktop = new JDesktopPane(); // Need this to make Frame inside Frame

    public mainFrame() {
        super("");
        setLayout(null);
        setSize(850, 700);
        setLocation(500, 280);
        Login login = new Login(database);// I want to perform a login
        desktop.add(login);
        try {
            login.setSelected(true);
        }
        catch (Exception e) {
            // TODO: handle exception
        }
        setContentPane(desktop);
        /////////////////////////////////////////

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);

    }

    public static void main(String [] args) {
        new mainFrame();
    }
}
登录类:

package itneizapenoitseg;

import... //

public class Login extends JInternalFrame {

    // User and password fields
    JTextField usernameForm = new JTextField(15);
    JPasswordField passwordForm = new JPasswordField(15);
    JButton login = new JButton("Login");

    public Login(dbconnection database) {

        super("Login", true, true, true, true);

        setSize(300, 200);

        // The login panel
        JPanel panel = new JPanel();
        panel.setLayout(null);
        JLabel username = new JLabel("username :");
        JLabel password = new JLabel("password :");

        // Position
        username.setBounds(70, 10, 80, 11);
        password.setBounds(70, 55, 80, 17);
        usernameForm.setBounds(70, 30, 150, 20);
        passwordForm.setBounds(70, 75, 150, 20);
        login.setBounds(105, 100, 80, 20);

        // Addings elements to display panel
        panel.add(usernameForm);
        panel.add(passwordForm);
        panel.add(login);
        panel.add(password);
        panel.add(username);
        getContentPane().add(panel);

        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);// Doens't work
        setVisible(true);
        actionLogin(database);
    }

    // When pressing Login button...

    private void actionLogin(dbconnection database) {
        login.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                //TODO Have to change to MySql query
                String usname = usernameForm.getText();
                String passw = new String(passwordForm.getPassword());

                // Checking credencial
                if(usname.equals("test") && passw.equals("1234")){
                    // Here i want to call a mainFrame funcion (createGUI)
                    dispose();Destroy this panel
                } else{
                    JOptionPane.showMessageDialog(null, "Username or password wrong!");
                    usernameForm.setText("");
                    passwordForm.setText("");
                    usernameForm.requestFocus();
                }
            }
        });

    }
}  
我希望当有人成功登录时,调用大型机的函数createGui,或者以一种方式通知大型机。我的意图是使大型机为空,直到sombody成功登录并下一次显示其内容

非常类似于

您可以调用
((大型机)SwingUtilities.getWindow祖先((组件)(e.getSource())).createGUI()

希望有帮助

编辑: 我刚刚测试了一个示例:

private void setHandlers() {
    jButton2.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            ((mainFrame) SwingUtilities.getWindowAncestor((Component)(e.getSource()))).showAlert();
        }
    });
}
public void showAlert() {
    JOptionPane.showConfirmDialog(this, "Confirming !!");
}
还有另一种选择(不太常用-至少我是这样):

重新编辑: 您也可以尝试:

((mainFrame) ((JComponent) (e.getSource())).getTopLevelAncestor()).createGUI();

它不起作用,因为我在actionListener中:(好的-那是因为你使用了一个匿名类-这很糟糕,但不是世界末日!使用
(Component)e.getSource()
而不是
这个
,并检查它是否起作用。编辑了答案:)你对匿名类的意思是什么?但是现在我可以执行了,但是我得到了null指针异常;请检查我编辑的答案-我的评论有括号问题。要了解有关匿名类的更多信息,请参阅。
((mainFrame) ((JComponent) (e.getSource())).getTopLevelAncestor()).createGUI();