Java JInternalFrame

я делаю программу, и я понятия не имею, как заставить эту вещь работать: у меня есть mainFrame:

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 mainFrame или способ уведомить mainFrame. Мое намерение состоит в том, чтобы сделать mainFrame пустым до тех пор, пока кто-нибудь не войдет в систему и не отобразит его содержимое.


person HaZe    schedule 02.10.2014    source источник


Ответы (1)


Очень похоже на этот вопрос SO.

Вы можете позвонить ((mainFrame) SwingUtilities.getWindowAncestor((Component)(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) SwingUtilities.getAncestorOfClass(mainFrame.class, ((Component)(e.getSource())))).createGUI();

REEDIT: Вы также можете попробовать:

((mainFrame) ((JComponent) (e.getSource())).getTopLevelAncestor()).createGUI();
person Gurusharan S    schedule 02.10.2014
comment
Это не работает, потому что я внутри actionListener :( - person HaZe; 02.10.2014
comment
Хорошо — это потому, что вы использовали анонимный класс — это плохо, но не конец света! Используйте (Component)e.getSource() вместо this и проверьте, работает ли это. - person Gurusharan S; 02.10.2014
comment
Также отредактировал ответ :) - person Gurusharan S; 02.10.2014
comment
Что вы имеете в виду под анонимным классом? однако теперь я могу выполнить, но получаю исключение nullPointer; - person HaZe; 02.10.2014
comment
Пожалуйста, проверьте мой отредактированный ответ - в моем комментарии есть проблема со скобками. Чтобы узнать больше об анонимных классах, см. документы. - person Gurusharan S; 02.10.2014
comment
Я проверил, я могу выполнить, но я получил nullPointerExeption, есть идеи, почему? (спасибо за ссылку на документы) - person HaZe; 02.10.2014
comment
Действительно? Это странно. Я добавил пример, который только что протестировал, и еще два способа сделать это. Похоже, проблема может заключаться в том, что кнопка находится на панели внутри фрейма, который находится внутри другой панели, которая является панелью содержимого корневого фрейма. Хотя я не пробовал такую ​​большую глубину, я бы сказал, что это должно сработать. Один из трех методов должен работать. - person Gurusharan S; 03.10.2014