2011-04-14 6 views
6

Estoy escribiendo un programa para un juego de Black Jack. Es una tarea que no debemos usar, pero lo estoy haciendo para obtener crédito adicional. He creado dos cuadros y están trabajando. En el segundo cuadro quiero poder volver al primero cuando se presiona un botón. ¿Cómo hago esto?Interruptor de marcos múltiples GUI

primera ventana .............

import javax.swing.* ; 
import java.awt.event.* ; 
import java.awt.* ; 
import java.util.* ; 


public class BlackJackWindow1 extends JFrame implements ActionListener 
{ 
    private JButton play = new JButton("Play"); 
    private JButton exit = new JButton("Exit"); 
    private JPanel pane=new JPanel(); 
    private JLabel lbl ; 

    public BlackJackWindow1() 
    { 
    super(); 
    JPanel pane=new JPanel(); 
    setTitle ("Black Jack!!!!!") ; 
    JFrame frame = new JFrame(""); 

    setVisible(true); 
    setSize (380, 260) ; 
    setLocation (450, 200) ; 
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE) ; 

    setLayout(new FlowLayout()); 
    play = new JButton("Start"); 
    exit = new JButton("exit"); 
    lbl = new JLabel ("Welcome to Theodores Black Jack!!!!!"); 

    add (lbl) ; 
    add(play, BorderLayout.CENTER); 
    play.addActionListener (this); 
    add(exit,BorderLayout.CENTER); 
    exit.addActionListener (this); 
    } 
    @Override 
    public void actionPerformed(ActionEvent event) 
    { 
    // TODO Auto-generated method stub 
    BlackJackWindow2 bl = new BlackJackWindow2(); 
    if (event.getSource() == play) 
    { 
     bl.BlackJackWindow2(); 
    } 
    else if(event.getSource() == exit){ 
     System.exit(0); 
    } 
    } 

segunda ventana ....

import javax.swing.* ; 

import java.awt.event.* ; 
import java.awt.* ; 
import java.util.* ; 

public class BlackJackWindow2 extends JFrame implements ActionListener 
{ 
    private JButton hit ; 
    private JButton stay ; 
    private JButton back; 
    //private JLabel lbl; 

    public void BlackJackWindow2() 
    { 
    // TODO Auto-generated method stub 
    JPanel pane=new JPanel(); 
    setTitle ("Black Jack!!!!!") ; 
    JFrame frame = new JFrame(""); 

    setVisible(true); 
    setSize (380, 260) ; 
    setLocation (450, 200) ; 
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE) ; 

    setLayout(new FlowLayout()); 
    hit = new JButton("Hit"); 
    stay = new JButton("stay"); 
    back = new JButton("return to main menu"); 

    // add (lbl) ; 
    add(hit, BorderLayout.CENTER); 
    hit.addActionListener (this) ; 
    add(stay,BorderLayout.CENTER); 
    stay.addActionListener (this) ; 
    add(back,BorderLayout.CENTER); 
    back.addActionListener (this) ; 
    } 

    @Override 
    public void actionPerformed(ActionEvent event) 
    { 
    // TODO Auto-generated method stub 
    BlackJackWindow1 bl = new BlackJackWindow1(); 
    if (event.getSource() == hit) 
    { 
     //code for the game goes here i will complete later 
    } 
    else if(event.getSource() == stay){ 
     //code for game goes here i will comeplete later. 
    } 
    else 
    { 
     //this is where i want the frame to close and go back to the original. 
    } 
    } 
} 
+1

es posible que desee considerar el uso de un solo JFrame y el uso de un JTabbedPane con dos subpaneles. – MeBigFatGuy

+0

@MeBigFatGuy tiene razón; hay un ejemplo de 'JTabbedPane' [aquí] (http://stackoverflow.com/questions/5617957). – trashgod

Respuesta

5

El segundo marco necesita una referencia a el primer fotograma para que pueda establecer el foco de nuevo en el primer fotograma.

También sus clases extienden JFrame pero también están creando otros marcos en sus constructores.

+0

busqué y encontré que podría hacer esto. setVisible (falso); disponer(); en la instrucción else y cierra el marco y vuelve al marco original y en el marco original hago lo mismo después de la llamada para la segunda ventana, parece funcionar. ¿Qué piensas? – namdizy

+0

¿Qué pasa si su usuario minimiza el primer cuadro? ¿De verdad quieres cerrar el segundo cuadro? Parece que deberías estar usando un diálogo modal si eso es lo que realmente buscas. – jzd

+0

comprobaré el diálogo modal. Si mi usuario está en el primer cuadro y presiona el botón "iniciar", va al segundo cuadro y cierra el primero, luego cuando se presiona el botón "regresar al menú" cierra el segundo cuadro y vuelve al primero. por lo tanto, ambos marcos no están abiertos al mismo tiempo. – namdizy

3

Un par de sugerencias:

Has añadido componentes a un JPanel que utiliza FlowLayout pero está utilizando constantes BorderLayout cuando se hace esto, que no se debe hacer, ya que no tiene sentido:

add(play, BorderLayout.CENTER); 

Más bien, si utiliza FlowLayout, simplemente agregue los componentes sin esas constantes.

Además, en lugar de intercambiar JFrames, es posible que desee considerar el uso de un CardLayout y el intercambio de veiws en un solo JFrame. Por ejemplo:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class FooBarBazDriver { 
    private static final String INTRO = "intro"; 
    private static final String GAME = "game"; 
    private CardLayout cardlayout = new CardLayout(); 
    private JPanel mainPanel = new JPanel(cardlayout); 
    private IntroPanel introPanel = new IntroPanel(); 
    private GamePanel gamePanel = new GamePanel(); 

    public FooBarBazDriver() { 
     mainPanel.add(introPanel.getMainComponent(), INTRO); 
     mainPanel.add(gamePanel.getMainComponent(), GAME); 

     introPanel.addBazBtnActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      cardlayout.show(mainPanel, GAME); 
     } 
     }); 

     gamePanel.addBackBtnActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      cardlayout.show(mainPanel, INTRO); 
     } 
     }); 
    } 

    private JComponent getMainComponent() { 
     return mainPanel; 
    } 

    private static void createAndShowUI() { 
     JFrame frame = new JFrame("Foo Bar Baz"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new FooBarBazDriver().getMainComponent()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowUI(); 
     } 
     }); 
    } 
} 

class IntroPanel { 
    private JPanel mainPanel = new JPanel(); 
    private JButton baz = new JButton("Baz"); 
    private JButton exit = new JButton("Exit"); 

    public IntroPanel() { 
     mainPanel.setLayout(new FlowLayout()); 
     baz = new JButton("Start"); 
     exit = new JButton("exit"); 

     mainPanel.add(new JLabel("Hello World")); 
     mainPanel.add(baz); 
     mainPanel.add(exit); 

     exit.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      Window win = SwingUtilities.getWindowAncestor(mainPanel); 
      win.dispose(); 
     } 
     }); 
    } 

    public void addBazBtnActionListener(ActionListener listener) { 
     baz.addActionListener(listener); 
    } 

    public JComponent getMainComponent() { 
     return mainPanel; 
    } 

} 

class GamePanel { 
    private static final Dimension MAIN_SIZE = new Dimension(400, 200); 
    private JPanel mainPanel = new JPanel(); 

    private JButton foo; 
    private JButton bar; 
    private JButton back; 

    public GamePanel() { 
     foo = new JButton("Foo"); 
     bar = new JButton("Bar"); 
     back = new JButton("return to main menu"); 

     mainPanel.add(foo); 
     mainPanel.add(bar); 
     mainPanel.add(back); 
     mainPanel.setPreferredSize(MAIN_SIZE); 
    } 

    public JComponent getMainComponent() { 
     return mainPanel; 
    } 

    public void addBackBtnActionListener(ActionListener listener) { 
     back.addActionListener(listener); 
    } 

} 
3

Ya que tuve que probarlo yo mismo si de hecho es tan fácil de implementar, construí este sencillo ejemplo. Demuestra una solución a su problema. Ligeramente inspirado por la respuesta de @ jzd (+1 por eso).

import java.awt.Color; 
import java.awt.HeadlessException; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class FocusChangeTwoFrames 
{ 
    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       createGUI(); 
      } 
     }); 
    } 

    private static void createGUI() throws HeadlessException 
    { 
     final JFrame f2 = new JFrame(); 
     f2.getContentPane().setBackground(Color.GREEN);  
     final JFrame f1 = new JFrame();  
     f1.getContentPane().setBackground(Color.RED); 
     f1.setSize(400, 300); 
     f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f1.setVisible(true); 
     MouseListener ml = new MouseAdapter() 
     { 
      @Override 
      public void mousePressed(MouseEvent e) 
      { 
       if(f1.hasFocus()) 
        f2.requestFocus(); 
       else 
        f1.requestFocus(); 
      } 
     }; 
     f1.addMouseListener(ml); 
     f2.setSize(400, 300); 
     f2.setLocation(200, 150); 
     f2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f2.setVisible(true); 
     f2.addMouseListener(ml); 
    } 
} 

Enjoy, Boro.