Java Swing: Как я могу реализовать экран входа в систему перед отображением JFrame? - PullRequest
9 голосов
/ 06 сентября 2011

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

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

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

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

Ответы [ 4 ]

17 голосов
/ 06 сентября 2011

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

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

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

10 голосов
/ 29 ноября 2013

Вот пример диалога входа в систему, предложенный @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 голосов
/ 13 декабря 2013

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

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) Весь импорт (если вы не знали) идет вверху вашего кода.

2 голосов
/ 06 сентября 2011

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

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