Java Swing:如何在显示JFrame之前实现登录屏幕?

时间:2011-09-06 16:22:15

标签: java swing user-interface login jframe

我正在尝试制作一个小游戏,首先会向玩家展示一个简单的登录界面,在那里他们可以输入他们的名字(我稍后会需要它来存储他们的游戏状态信息),让他们选择难度级别等,并且只有在玩家点击播放按钮后才会显示主游戏画面。我也想让玩家导航到一个(希望对于他们相当大的)奖杯收藏,同样在他们看来是新的屏幕。

到目前为止,我有一个带有网格布局的主游戏窗口和一个有效的游戏(对我而言!)。现在我想添加上述功能。

我该怎么做呢?我不认为我想要去多个JFrame路线,因为我一次只想在任务栏中看到一个图标(或者将它们的可见性设置为假图标也是如此?)我是否制作并销毁布局或面板或者这样的事情?

我有什么选择?如何控制正在显示的内容?特别是考虑到我的新手技能?

4 个答案:

答案 0 :(得分:17)

简单的模态对话框(例如JDialog)在这里应该可以正常工作。在调用对话框时,可能是JFrame的主GUI可以是不可见的,然后在对话框完成后设置为可见(假设登录成功)。如果对话框是模态的,您将确切知道用​​户何时关闭对话框,因为代码将在对话框中调用setVisible(true)的行之后继续。请注意,JDialog所拥有的GUI可以像JFrame所拥有的那样复杂和丰富。

另一个选择是使用一个GUI / JFrame,但通过CardLayout在主GUI中交换视图(JPanels)。这可以很好地工作,并且易于实现。查看CardLayout tutorial了解更多信息。

哦,欢迎来到stackoverflow.com!

答案 1 :(得分:10)

以下是@HovercraftFullOfEels建议的登录对话框示例。

  

用户名: stackoverflow 密码: stackoverflow

import java.awt.*;
import java.awt.event.*;
import java.util.Arrays;
import javax.swing.*;

public class TestFrame extends JFrame {

    private PassWordDialog passDialog;

    public TestFrame() {
        passDialog = new PassWordDialog(this, true);
        passDialog.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new TestFrame();
                frame.getContentPane().setBackground(Color.BLACK);
                frame.setTitle("Logged In");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLocationRelativeTo(null);
                frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
            }
        });
    }
}

class PassWordDialog extends JDialog {

    private final JLabel jlblUsername = new JLabel("Username");
    private final JLabel jlblPassword = new JLabel("Password");

    private final JTextField jtfUsername = new JTextField(15);
    private final JPasswordField jpfPassword = new JPasswordField();

    private final JButton jbtOk = new JButton("Login");
    private final JButton jbtCancel = new JButton("Cancel");

    private final JLabel jlblStatus = new JLabel(" ");

    public PassWordDialog() {
        this(null, true);
    }

    public PassWordDialog(final JFrame parent, boolean modal) {
        super(parent, modal);

        JPanel p3 = new JPanel(new GridLayout(2, 1));
        p3.add(jlblUsername);
        p3.add(jlblPassword);

        JPanel p4 = new JPanel(new GridLayout(2, 1));
        p4.add(jtfUsername);
        p4.add(jpfPassword);

        JPanel p1 = new JPanel();
        p1.add(p3);
        p1.add(p4);

        JPanel p2 = new JPanel();
        p2.add(jbtOk);
        p2.add(jbtCancel);

        JPanel p5 = new JPanel(new BorderLayout());
        p5.add(p2, BorderLayout.CENTER);
        p5.add(jlblStatus, BorderLayout.NORTH);
        jlblStatus.setForeground(Color.RED);
        jlblStatus.setHorizontalAlignment(SwingConstants.CENTER);

        setLayout(new BorderLayout());
        add(p1, BorderLayout.CENTER);
        add(p5, BorderLayout.SOUTH);
        pack();
        setLocationRelativeTo(null);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);

        addWindowListener(new WindowAdapter() {  
            @Override
            public void windowClosing(WindowEvent e) {  
                System.exit(0);  
            }  
        });


        jbtOk.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (Arrays.equals("stackoverflow".toCharArray(), jpfPassword.getPassword())
                        && "stackoverflow".equals(jtfUsername.getText())) {
                    parent.setVisible(true);
                    setVisible(false);
                } else {
                    jlblStatus.setText("Invalid username or password");
                }
            }
        });
        jbtCancel.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                setVisible(false);
                parent.dispose();
                System.exit(0);
            }
        });
    }
}

答案 2 :(得分:2)

您可以将内容添加到JFrame(让我们称之为JPanel)并将此面板添加到框架中,而不是将游戏直接添加到GamePanel。对登录屏幕执行相同操作:将所有内容添加到JPanelLoginPanel)并将其添加到框架。当您的游戏开始时,您应该执行以下操作:

  1. LoginPanel添加到第
  2. 获取用户输入并加载其详细信息
  3. 添加GamePanel并销毁LoginPanel(因为重新创建新版本会非常快,因此您无需保留内存)。

答案 3 :(得分:2)

我建议您插入以下代码:

JFrame f = new JFrame();
JTextField text = new JTextField(15);   //the 15 sets the size of the text field
JPanel p = new JPanel();
JButton b = new JButton("Login");

f.add(p);   //so you can add more stuff to the JFrame
f.setSize(250,150);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

当您要添加内容时插入。接下来我们将所有内容添加到JPanel:

p.add(text);
p.add(b);

现在我们添加ActionListeners以使JButtons工作:

b.addActionListener(this);
public void actionPerforemed(ActionEvent e)
{
    //Get the text of the JTextField
    String TEXT = text.getText();
}

如果您还没有,请不要忘记导入以下内容:

import java.awt.event*;
import java.awt.*;    //Just in case we need it
import java.x.swing.*;

我希望我所说的一切都有意义,因为有时候我没有(特别是当我在谈论编码/ Java时)所有导入(如果你不知道)都在代码的顶部。