2012-05-30 4 views
1

В настоящее время я пытаюсь создать игру с меню. Меню выглядит так. http://puu.sh/xGoCИспользование CardLayout в Java

В идеале, когда я нажимаю кнопку, это приведет меня в игру. Игра выглядит так. http://puu.sh/xGoV

В настоящее время я инициализирую JFrame() в своем основном классе, который запускает либо класс меню, либо класс игры (оба из которых являются JPanels).

Как я могу использовать CardLayout, чтобы сделать так, чтобы я мог инициализировать меню игры, и когда я нажимаю кнопку, меняем панель на панель игры?

+2

* «Как я могу использовать CardLayout ..» * См. [Как использовать CardLayout] (http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html). –

ответ

3

У меня есть образец кода для вас, это не идеально, но он должен работать. В основном, вы хотите использовать СЛЕДУЮЩИЕ или ПРЕДЫДУЩИЕ вызовы в менеджере компоновки.

Поскольку есть только две панели, я просто использую вызов NEXT для их циклического переключения. Это, вероятно, лучше всего, если вы читаете документацию Swing, но это работает, но у вас могут быть и другие требования.

import java.awt.CardLayout; 


public class CardLayoutUsage extends javax.swing.JFrame { 

    public CardLayoutUsage() { 
     initComponents(); 
    } 

    /** 
    * This method is called from within the constructor to initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is always 
    * regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code"> 
    private void initComponents() { 

     containerPanel = new javax.swing.JPanel(); 
     menuPanel = new javax.swing.JPanel(); 
     jButton2 = new javax.swing.JButton(); 
     gamePanel = new javax.swing.JPanel(); 
     jButton1 = new javax.swing.JButton(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     containerPanel.setLayout(new java.awt.CardLayout()); 

     menuPanel.setBackground(new java.awt.Color(153, 255, 255)); 

     jButton2.setText("Go to Game"); 
     jButton2.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jButton2ActionPerformed(evt); 
      } 
     }); 

     javax.swing.GroupLayout menuPanelLayout = new javax.swing.GroupLayout(menuPanel); 
     menuPanel.setLayout(menuPanelLayout); 
     menuPanelLayout.setHorizontalGroup(
      menuPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, menuPanelLayout.createSequentialGroup() 
       .addContainerGap(135, Short.MAX_VALUE) 
       .addComponent(jButton2) 
       .addGap(149, 149, 149)) 
     ); 
     menuPanelLayout.setVerticalGroup(
      menuPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, menuPanelLayout.createSequentialGroup() 
       .addContainerGap(141, Short.MAX_VALUE) 
       .addComponent(jButton2) 
       .addGap(134, 134, 134)) 
     ); 

     containerPanel.add(menuPanel, "card2"); 

     gamePanel.setBackground(new java.awt.Color(255, 255, 204)); 

     jButton1.setText("Go to Menu"); 
     jButton1.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jButton1ActionPerformed(evt); 
      } 
     }); 

     javax.swing.GroupLayout gamePanelLayout = new javax.swing.GroupLayout(gamePanel); 
     gamePanel.setLayout(gamePanelLayout); 
     gamePanelLayout.setHorizontalGroup(
      gamePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, gamePanelLayout.createSequentialGroup() 
       .addContainerGap(138, Short.MAX_VALUE) 
       .addComponent(jButton1) 
       .addGap(147, 147, 147)) 
     ); 
     gamePanelLayout.setVerticalGroup(
      gamePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, gamePanelLayout.createSequentialGroup() 
       .addContainerGap(152, Short.MAX_VALUE) 
       .addComponent(jButton1) 
       .addGap(123, 123, 123)) 
     ); 

     containerPanel.add(gamePanel, "card3"); 

     getContentPane().add(containerPanel, java.awt.BorderLayout.CENTER); 

     pack(); 
    }// </editor-fold> 

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
     CardLayout cl = (CardLayout)(containerPanel.getLayout()); 
     cl.next(containerPanel); 
    } 

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { 
     CardLayout cl = (CardLayout)(containerPanel.getLayout()); 
     cl.next(containerPanel); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]) { 
     /* Set the Nimbus look and feel */ 
     //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
     /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */ 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(CardLayoutUsage.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(CardLayoutUsage.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(CardLayoutUsage.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(CardLayoutUsage.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
     //</editor-fold> 

     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new CardLayoutUsage().setVisible(true); 
      } 
     }); 
    } 
    // Variables declaration - do not modify 
    private javax.swing.JPanel containerPanel; 
    private javax.swing.JPanel gamePanel; 
    private javax.swing.JButton jButton1; 
    private javax.swing.JButton jButton2; 
    private javax.swing.JPanel menuPanel; 
    // End of variables declaration 
} 
2

Не используйте для этого CardLayout.

Вместо этого снимите панель меню с панели содержимого фрейма и добавьте игровую панель.
Запомните validate() раму. Что-то вроде этого:

public static final int VIEW_MENU = 0; 
public static final int VIEW_GAME = 1; 

private static Container content; 
... 
content = frame.getContentPane(); 

public static void setView(int view){ 
    if(view == VIEW_MENU){ 
     content.remove(menuPanel); 
     content.add(gamePanel); 
    } else { 
     content.remove(gamePanel); 
     content.add(menuPanel); 
    } 
    frame.validate(); 
} 

В программе, что я в настоящее время работает на меня есть класс с именем ViewManager, который создает статические экземпляры каждого вида, и добавляет их в массив с индексами, которые соответствуют постоянным полям , У меня также есть поля для отслеживания предыдущих просмотров для панировочных сухарей/возврата. Это может быть случай повторного создания колеса, но он позволяет вам контролировать все об этом. И это эффективно.

Смежные вопросы