2011-04-14 2 views
6

Я пишу программу для игры с черным гнездом. Это назначение, которое мы не должны использовать gui, но я делаю это для дополнительного кредита. Я создал два фрейма, и они работают. На втором кадре я хочу иметь возможность вернуться к первому при нажатии кнопки. Как мне это сделать?Коммутатор с несколькими кадрами GUI

первое окно .............

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); 
    } 
    } 

второе окно ....

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

Возможно, вам захочется использовать только один JFrame и использовать JTabbedPane с двумя дополнительными панелями. – MeBigFatGuy

+0

@MeBigFatGuy прав; есть пример JTabbedPane [здесь] (http://stackoverflow.com/questions/5617957). – trashgod

ответ

5

Второй кадр требует ссылки на первый кадр, чтобы он мог вернуть фокус в первый кадр.

Также ваши классы расширяют JFrame, но они также создают другие кадры в своих конструкторах.

+0

Я искал, и я обнаружил, что могу просто сделать это. SetVisible (ложь); dispose(); в инструкции else и закрывает фрейм и возвращается к исходному фрейму, а в исходном фрейме я делаю то же самое после вызова второго окна, похоже, он работает. что вы думаете? – namdizy

+0

Что делать, если ваш пользователь минимизирует первый кадр? Вы действительно хотите закрыть второй кадр? Похоже, вы должны использовать модальный диалог, если это действительно то, что вам нужно. – jzd

+0

Я проверю модальный диалог. Если мой пользователь находится на первом кадре и нажал кнопку «Пуск», он переходит ко второму кадру и закрывает первый, а затем, когда нажата кнопка «вернуться к меню», он закрывает второй кадр и возвращается к первому. поэтому оба кадра не открыты одновременно. – namdizy

3

Несколько предложений:

Вы добавления компонентов в JPanel, который использует FlowLayout, но с использованием констант BorderLayout при этом, которые вы не должны делать, поскольку это не имеет смысла:

add(play, BorderLayout.CENTER); 

Скорее, если использовать FlowLayout, просто добавьте компоненты без этих констант.

Кроме того, вместо замены JFrames вы можете рассмотреть возможность использования CardLayout и замены файлов в одном JFrame. Например:

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

Поскольку я должен был сам его протестировать, если на самом деле так легко реализовать, я построил этот простой пример. Он демонстрирует решение вашей проблемы. Немного вдохновлен ответом @ jzd (+1 для этого).

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); 
    } 
} 

Наслаждайтесь, Боро.

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