2

Swing コンポーネント (Boggle タイプのゲーム) を使用して Java で小さなゲームを作ろうとしています。私が現在セットアップしている方法では、基本的にすぐにゲームが開きますが、「チュートリアル」と「プレイ」の 2 つのボタンがあるスタートアップ ウィンドウが必要です。私はすでに機能を持っています(私のチュートリアルボタンは、すべてのものを含む新しいウィンドウを開くだけです)2番目のJFrameを作成し、再生を押したときにそれに切り替える方法がわかりません(または、JFrameを作成し、次に、JButton が押されたときに作成済みのものに切り替えます)。新しい JFrame を同じ場所で開き、古い JFrame を非表示にすることができると思いますが、より簡単な解決策を望んでいました。

また、ゲームの完了時にこれを行い、自動的に小さな統計ページに再び切り替えたいと考えています。そのため、情報をいただければ幸いです。

これは、皆さんが私のコードを見たい場合に備えて、これまでのところ持っているものです (Enter キーを接続して userWord を送信し、他のクラスで検証およびスコアリングするか、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. 2番目の JFrameの代わりにCardLayoutを使用すると、コンセプトは OutOfMemory に向かっています

  2. 実行時に JFramesの境界を変更する場合は、JFrame.pack (CardLayout でカードを切り替えた後) を使用します。

于 2013-04-23T08:24:57.287 に答える