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

JavaSwing:如何在显示JFrame之前实现登录屏幕?,java,swing,user-interface,login,jframe,Java,Swing,User Interface,Login,Jframe,我正在尝试制作一个小游戏,首先向玩家显示一个简单的登录屏幕,在那里他们可以输入自己的名字(我稍后需要它来存储他们的游戏状态信息),让他们选择难度等级等,并且只在玩家点击play按钮后显示游戏主屏幕。我还想让玩家导航到一个(对他们来说,希望是相当大的)奖杯集合,同样在他们看来是一个新的屏幕 到目前为止,我有一个带有网格布局的主游戏窗口,其中有一个可以运行的游戏(对我来说太棒了!)。现在我想添加上述功能 我该怎么做呢?我不想走多个JFrame路线,因为我一次只想在任务栏上看到一个图标(或者将它们的可

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

到目前为止,我有一个带有网格布局的主游戏窗口,其中有一个可以运行的游戏(对我来说太棒了!)。现在我想添加上述功能

我该怎么做呢?我不想走多个JFrame路线,因为我一次只想在任务栏上看到一个图标(或者将它们的可见性设置为false也会影响图标吗?),我会制作和销毁布局或面板之类的东西吗


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

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

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


哦,欢迎来到stackoverflow.com

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

  • LoginPanel
    添加到框架
  • 获取用户输入并加载其详细信息
  • 添加
    GamePanel
    并销毁
    LoginPanel
    (因为重新创建新的会非常快,所以您不需要保留内存)

  • 下面是@HovercraftFullOfEels建议的登录对话框示例

    用户名:
    stackoverflow
    密码:
    stackoverflow


    我建议您插入以下代码:

    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时)并不是所有的导入(如果您不知道)都放在代码的顶部。

    将所有内容保存在JFrame中比创建复杂的JDialog更容易。另外,当您在奖杯/游戏/菜单之间切换时,您将能够重用面板更改代码。。一切取决于实施;)是的,但我认为他想要一个相当复杂的登录屏幕——我认为在JFrame中这样做更干净。“在JFrame中保存所有内容比创建复杂的JDialog更容易”JDialog的复杂之处是什么?另一个答案中建议的
    CardLayout
    是在单个容器中交换组件的更好(IMO)方法。CPU周期可能很便宜,但RAM也很便宜。
    getText()
    方法已被弃用且不安全。
    import java.awt.event*;
    import java.awt.*;    //Just in case we need it
    import java.x.swing.*;