1

現在、2 つのフレームがあります。アプリケーションを実行すると、最初に表示される JFrame はログインであり、2 つの入力フィールドと 1 つのボタンがあります。ユーザーがログインして認証されたら、フレームを閉じて 2 つ目のフレームを起動したいと思います。

したがって、私が考えられる唯一のことはsetVisible(false)、ログインフレームとフレームに対してsetVisible(true)行うことMainです。

これを行うためのより良い方法はありますか、それとも唯一の方法ですか?

4

2 に答える 2

2

個人的には、すぐに 2 番目のフレームを起動し、最初のフレームをが所有するJFrameモーダルに置き換えます。JDialogJFrame

The Use of Multiple JFrames, Good/Bad Practice?に対するこの回答も参照してください。

これが私が提案するものの基本的なデモです:

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestLogin {
    private JFrame frame;
    private boolean authenticated;
    private JTextField login;
    private JPasswordField password;

    protected void initUI() {
        frame = new JFrame(TestLogin.class.getSimpleName());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 600);
        frame.setVisible(true);
    }

    protected void showLoginDialog() {
        authenticated = false;
        final JDialog dialog = new JDialog(frame, "Please provide your credentials");
        dialog.setModal(true);
        JPanel panel = new JPanel(new GridBagLayout());
        JPanel buttonPanel = new JPanel();
        login = new JTextField(40);
        password = new JPasswordField(20);
        JLabel loginLabel = new JLabel("Login:");
        JLabel passwordLabel = new JLabel("Password:");
        JButton ok = new JButton("OK");
        ok.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // Here perform authentication and set authentication flag to appropriate value
                authenticated = true;
                if (authenticated) {
                    setUpFrame();
                    dialog.dispose();
                }
            }
        });
        JButton cancel = new JButton("Cancel");
        cancel.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        dialog.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosed(WindowEvent e) {
                if (!authenticated) {
                    System.exit(0);
                }
            }
        });
        dialog.getRootPane().setDefaultButton(ok);
        buttonPanel.add(ok);
        buttonPanel.add(cancel);
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets = new Insets(5, 5, 5, 5);
        gbc.fill = GridBagConstraints.HORIZONTAL;
        panel.add(loginLabel, gbc);
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        gbc.weightx = 1.0;
        panel.add(login, gbc);
        gbc.gridwidth = 1;
        gbc.weightx = 0;
        panel.add(passwordLabel, gbc);
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        gbc.weightx = 1.0;
        panel.add(password, gbc);
        panel.add(buttonPanel, gbc);
        dialog.add(panel);
        dialog.pack();
        dialog.setLocationRelativeTo(frame);
        while (!authenticated) {
            dialog.setVisible(true);
        }
    }

    protected void setUpFrame() {
        frame.add(new JLabel("Successfully authenticated"));
        frame.revalidate();
        frame.repaint();
    }

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException,
            UnsupportedLookAndFeelException {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                TestLogin testLogin = new TestLogin();
                testLogin.initUI();
                testLogin.showLoginDialog();
            }

        });
    }

}
于 2013-01-18T22:54:34.370 に答える
0

それにはいくつかの方法があります。
たとえば、 1st を再利用できますJFrame。したがって、最初のフレームで取得したコンポーネントを削除し、2 番目のコンポーネントを追加してからフレームを追加しますrepaint()
しかし、私はそれを良い習慣とは考えていません。
Andrew Thompson が提案したように、 aCardLayoutを使用して 1 つを初期化しJFrame、ログイン カードを表示してから、完全に初期化された 2 番目のフル アプリケーション カードに切り替えることもできます。このようにして、それらの再描画を取り除きます。
2 番目のフレーム (最初にアプリケーション) を表示してから、モーダルJDialogを使用してユーザーをログインさせることもできます。

于 2013-01-18T22:56:14.463 に答える