我正在尝试制作一个小游戏,首先会向玩家展示一个简单的登录界面,在那里他们可以输入他们的名字(我稍后会需要它来存储他们的游戏状态信息),让他们选择难度级别等,并且只有在玩家点击播放按钮后才会显示主游戏画面。我也想让玩家导航到一个(希望对于他们相当大的)奖杯收藏,同样在他们看来是新的屏幕。
到目前为止,我有一个带有网格布局的主游戏窗口和一个有效的游戏(对我而言!)。现在我想添加上述功能。
我该怎么做呢?我不认为我想要去多个JFrame路线,因为我一次只想在任务栏中看到一个图标(或者将它们的可见性设置为假图标也是如此?)我是否制作并销毁布局或面板或者这样的事情?
我有什么选择?如何控制正在显示的内容?特别是考虑到我的新手技能?
答案 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
。对登录屏幕执行相同操作:将所有内容添加到JPanel
(LoginPanel
)并将其添加到框架。当您的游戏开始时,您应该执行以下操作:
LoginPanel
添加到第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时)所有导入(如果你不知道)都在代码的顶部。