2

我正在尝试使用 Swing 组件(Boggle 类型的游戏)在 Java 上制作一个小游戏。我现在设置它的方式,它基本上会立即打开游戏 - 但我想要一个带有两个按钮的启动窗口 - “Tutorial”和“Play”。我已经有了这个功能(我的教程按钮只是打开一个包含所有东西的新窗口)我只是不确定如何创建第二个 JFrame,然后在我按下 Play 时切换到它(或者更确切地说,创建一个 JFrame,然后切换到按下 JButton 时我已经创建的那个)。我想我可能会导致一个新的 JFrame 在同一位置打开,而旧的 JFrame 变得不可见 - 但我希望有一个更简单的解决方案。

我也想在游戏完成时这样做,再次自动切换到一个小的统计页面 - 所以任何信息都会受到赞赏。

这是我到目前为止所拥有的,以防你们想查看我的代码(我还没有连接 Enter 键发送 userWord 以在我的其他课程中进行验证和评分,或者用 Tile 对象填充 tileGrid,或者计时器....但这一切都将在以后出现!)

public class Game implements Runnable {
public void run(){

    final JFrame frame = new JFrame("Boggle");
    frame.setLocation(500,200);

    // Input - holds typing box

    final JLetterField typingArea = new JLetterField(1); 
    typingArea.setFocusTraversalKeysEnabled(false);
    typingArea.setEditable(true);
    typingArea.setFocusable(true);
    typingArea.requestFocusInWindow(); //also this request isn't being granted.. 
                                       //if anyone could explain why i would love you
                                       // I want the focus on the TextField on startup


    frame.add(typingArea, BorderLayout.SOUTH);
    typingArea.addKeyListener(new KeyAdapter() {
        public void keyPressed (KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_ENTER) { // enter key is pressed
                String userWord = typingArea.getText().toLowerCase();
                typingArea.setText("");

            }
        }
    });


    final JLabel status = new JLabel("Running...");

    // Main playing area

    GridLayout tileGrid = new GridLayout(4,4);
    final JPanel grid = new JPanel(tileGrid);
    frame.add(grid, BorderLayout.CENTER);

    // Reset button
    final JPanel control_panel = new JPanel();
    frame.add(control_panel, BorderLayout.NORTH);


    final ImageIcon img = new ImageIcon("Instructions.png", "My Instructions...");
    final JButton info = new JButton("Help");
    info.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            final JFrame infoFrame = new JFrame("Tutorial");
            infoFrame.setLocation(500,50);
            JLabel tutorialImg = new JLabel(img);
            int w = img.getIconWidth();
            int h = img.getIconHeight();
            infoFrame.setSize(w, h);
            infoFrame.add(tutorialImg);
            infoFrame.setVisible(true);
        }
    });
    control_panel.add(info);

    // Put the frame on the screen
    frame.pack();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

}

public static void main(String[] args){
    SwingUtilities.invokeLater(new Game());
}

}
4

1 回答 1

5
  1. 使用CardLayout而不是第二个 JFrame您的概念将走向 OutOfMemory

  2. 如果您想在运行时更改 JFrames 边界,请使用JFrame.pack(在 CardLayout 中的卡片之间切换后) ,

于 2013-04-23T08:24:57.287 回答