0

我目前正在为学校开发一款游戏,但我遇到了障碍。我创建了一个设置 JFrame 的主类,在该 JFrame 中有 JPanel 按钮,这些按钮可以打开一个服务器 JPanel 类、一个客户端 JPanel 类,以及用于选项和退出游戏的按钮。现在我卡住的地方是我应该如何使用服务器/客户端 JPanel 类上的后退按钮使按钮返回到主 JPanel。这是我目前拥有的代码:

MainUI.class(一个不同的类运行它):

public class MainUI extends JFrame {
private JPanel contentPane;
private JTextField textField;

public MainUI() {
    // Sets up the frame
    setTitle("Pong Legacy | Prototype v0.1.0");
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(300, 500);
    setLocationRelativeTo(null);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    // Starts the Server window
    JButton btnStartServer = new JButton("Start Server");
    btnStartServer.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            JPanel server = new ServerUI();
            getContentPane().removeAll();
            getContentPane().setLayout(new BorderLayout());
            getContentPane().add(server);
            getContentPane().validate();
            getContentPane().repaint();
        }
    });
    btnStartServer.setBounds(97, 364, 100, 25);
    contentPane.add(btnStartServer);

    // Starts the Client window
    JButton btnStartClient = new JButton("Start Client");
    btnStartClient.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            JPanel client = new ClientUI();
            getContentPane().removeAll();
            getContentPane().setLayout(new BorderLayout());
            getContentPane().add(client);
            getContentPane().validate();
            getContentPane().repaint();
        }
    });
    btnStartClient.setBounds(97, 400, 100, 25);
    contentPane.add(btnStartClient);

    // Opens the Options menu 
    // (To Do)
    JButton btnOptions = new JButton("Options");
    btnOptions.setBounds(37, 436, 100, 25);
    contentPane.add(btnOptions);

    // Quits the game
    JButton btnQuitGame = new JButton("Quit Game");
    btnQuitGame.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            System.exit(0);
        }
    });
    btnQuitGame.setBounds(157, 436, 100, 25);
    contentPane.add(btnQuitGame);

    // Username Field
    JLabel lblUsername = new JLabel("Username:");
    lblUsername.setBounds(121, 45, 52, 14);
    contentPane.add(lblUsername);

    textField = new JTextField();
    textField.setBounds(104, 67, 86, 20);
    contentPane.add(textField);
    textField.setColumns(10);
}
}

服务器UI.class:

public class MainUI extends JFrame {
private JPanel contentPane;
private JTextField textField;

public MainUI() {
    // Sets up the frame
    setTitle("Pong Legacy | Prototype v0.1.0");
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(300, 500);
    setLocationRelativeTo(null);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    // Starts the Server window
    JButton btnStartServer = new JButton("Start Server");
    btnStartServer.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            JPanel server = new ServerUI();
            getContentPane().removeAll();
            getContentPane().setLayout(new BorderLayout());
            getContentPane().add(server);
            getContentPane().validate();
            getContentPane().repaint();
        }
    });
    btnStartServer.setBounds(97, 364, 100, 25);
    contentPane.add(btnStartServer);

    // Starts the Client window
    JButton btnStartClient = new JButton("Start Client");
    btnStartClient.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            JPanel client = new ClientUI();
            getContentPane().removeAll();
            getContentPane().setLayout(new BorderLayout());
            getContentPane().add(client);
            getContentPane().validate();
            getContentPane().repaint();
        }
    });
    btnStartClient.setBounds(97, 400, 100, 25);
    contentPane.add(btnStartClient);

    // Opens the Options menu 
    // (To Do)
    JButton btnOptions = new JButton("Options");
    btnOptions.setBounds(37, 436, 100, 25);
    contentPane.add(btnOptions);

    // Quits the game
    JButton btnQuitGame = new JButton("Quit Game");
    btnQuitGame.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            System.exit(0);
        }
    });
    btnQuitGame.setBounds(157, 436, 100, 25);
    contentPane.add(btnQuitGame);

    // Username Field
    JLabel lblUsername = new JLabel("Username:");
    lblUsername.setBounds(121, 45, 52, 14);
    contentPane.add(lblUsername);

    textField = new JTextField();
    textField.setBounds(104, 67, 86, 20);
    contentPane.add(textField);
    textField.setColumns(10);
}
 }

客户端UI.class:

public class ClientUI extends JPanel {

private JTextField textField;

public ClientUI() {
    setLayout(null);

    JButton btnConnect = new JButton("Connect");
    btnConnect.setBounds(47, 400, 200, 25);
    add(btnConnect);

    JButton btnBack = new JButton("Back");
    btnBack.setBounds(117, 436, 60, 25);
    add(btnBack);

    JRadioButton rdbtnSelectAServer = new JRadioButton("Select a server from the list:");
    rdbtnSelectAServer.setBounds(66, 25, 161, 25);
    add(rdbtnSelectAServer);

    JRadioButton rdbtnManualConnection = new JRadioButton("Manual Connection:");
    rdbtnManualConnection.setBounds(87, 325, 120, 25);
    add(rdbtnManualConnection);

    textField = new JTextField();
    textField.setBounds(47, 355, 200, 25);
    add(textField);
    textField.setColumns(10);
}
}

我听说我也可以使用 CardLayout,但我想看看我是否可以这样做。

4

0 回答 0