Java Swing: как я могу реализовать экран входа в систему, прежде чем показывать JFrame?

Я пытаюсь сделать небольшую игру, которая сначала покажет игроку простой экран входа в систему, где они смогут ввести свое имя (мне нужно будет позже, чтобы сохранить информацию о состоянии игры), пусть они выберут уровень сложности и т. Д. покажите основной экран игры, как только игрок нажал кнопку воспроизведения. Я также хотел бы позволить игроку перейти к сборке трофеев (надеюсь, для них довольно большой), аналогично тому, что будет выглядеть для них как новый экран.

Пока у меня есть основное игровое окно с макетом сетки и игра в нем, которая работает (Yay for me!). Теперь я хочу добавить вышеуказанные функции.

Как мне это сделать? Я не думаю, что хочу пойти по нескольким маршрутам JFrame, так как мне нужен только один значок, видимый на панели задач за раз (или установил бы их видимость на ложный эффект икона тоже?) Я вместо этого делаю и уничтожаю макеты или панели или что-то вроде того?

Какие у меня варианты? Как я могу контролировать, какой контент отображается? Особенно учитывая мои навыки новичка?

Простой модальный диалог, такой как JDialog, должен хорошо работать здесь. Основной графический интерфейс, который, скорее всего, будет JFrame, может быть невидимым при вызове диалога, а затем установить на видимый (при условии, что вход в систему был успешным) после завершения диалога. Если диалог является модальным, вы точно узнаете, когда пользователь закрыл диалоговое окно, поскольку код будет продолжен сразу после строки, в которой вы вызываете setVisible (true) в диалоговом окне. Обратите внимание, что графический интерфейс, поддерживаемый JDialog, может быть таким же сложным и насыщенным, как и JFrame.

Другой вариант – использовать один GUI / JFrame, но swap-представления (JPanels) в главном графическом интерфейсе через CardLayout. Это может работать довольно хорошо и легко реализовать. Ознакомьтесь с учебным пособием CardLayout для получения дополнительной информации.

О, и добро пожаловать в stackoverflow.com!

Ниже приведен пример диалогового windows входа в систему с предложением @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); } }); } } 

Я предлагаю вам вставить следующий код:

 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 вы можете добавить свой контент в JPanel (назовем его GamePanel ) и добавить эту панель в рамку. Сделайте то же самое для экрана входа в систему: добавьте весь контент в JPanel ( LoginPanel ) и добавьте его в фрейм. Когда ваша игра начнется, вы должны сделать следующее:

  1. Добавить LoginPanel в кадр
  2. Получить пользовательский ввод и загрузить его детали
  3. Добавьте GamePanel и уничтожьте LoginPanel (так как будет довольно быстро воссоздать новый, так что вам не нужно хранить его в памяти).
Давайте будем гением компьютера.