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

我试图制作一个小游戏,首先向玩家展示一个简单的login屏幕,在这里他们可以input他们的名字(我稍后需要它来存储他们的游戏状态信息),让他们select难度等级,一旦玩家点击播放button就显示主游戏画面。 我也想让玩家导航到(有希望他们相当大)奖杯收集,同样在他们看来是一个新的屏幕。

到目前为止,我有一个主要的游戏窗口,其中有一个网格布局和一个游戏的作品(对我来说耶!)。 现在我想添加上面的function。

我怎么去做这个? 我不认为我想要去多个JFrame路线,因为我只想一次在任务栏中显示一个图标(或者将它们的可见性设置为false也会影响图标?)我是否要制作和销毁布局或面板或这样的事情?

我有什么select? 我怎样才能控制显示的内容? 特别是考虑到我的新手技能?

一个简单的模式对话框如JDialog应该在这里工作。 当调用对话框时,可能是JFrame的主GUI可能是不可见的,并且一旦对话完成,就设置为可见(假定login是成功的)。 如果对话框是modal dialog,您将确切知道用​​户何时closures了对话框,因为代码会在对话框中调用setVisible(true)的那一行之后继续。 请注意,由JDialog保存的GUI可以像JFrame所拥有的一样复杂和丰富。

另一个select是使用一个GUI / JFrame,但通过CardLayout在主GUI中交换视图(JPanels)。 这可以工作得很好,很容易实现。 查看CardLayout教程以获取更多信息。

哦,欢迎来到stackoverflow.com!

下面是@HovercraftFullOfEelsbuild议的一个login对话框的例子。

用户名: 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); } }); } } 

我build议你插入下面的代码:

 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时)所有的导入(如果你不知道的话)在你的代码的顶部。

您可以将您的内容添加到JPanel (我们称之为GamePanel ),并将此面板添加到框架,而不是直接添加到JFrame 。 对login屏幕做同样的事情:将所有内容添加到JPanelLoginPanel )并将其添加到框架。 当你的游戏开始时,你应该做以下的事情:

  1. LoginPanel添加到框架
  2. 获取用户input并加载它的详细信息
  3. 添加GamePanel并销毁LoginPanel (因为重新创build新的会非常快,所以你不需要保存它的内存)。