2011-04-14 30 views
6

Tôi đang viết một chương trình cho trò chơi jack màu đen. Đó là một nhiệm vụ chúng tôi không sử dụng gui của tôi nhưng tôi đang làm nó cho tín dụng thêm tôi đã tạo ra hai khung kiến ​​mà họ đang làm việc. Trên khung thứ hai, tôi muốn có thể quay lại lần đầu tiên khi nhấn nút. Làm thế nào để tôi làm điều này?GUI nhiều khung hình chuyển đổi

cửa sổ đầu tiên .............

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

cửa sổ thứ hai ....

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

bạn có thể muốn xem xét chỉ sử dụng một JFrame và sử dụng JTabbedPane với hai ngăn phụ. – MeBigFatGuy

+0

@MeBigFatGuy là đúng; có một ví dụ 'JTabbedPane' [ở đây] (http://stackoverflow.com/questions/5617957). – trashgod

Trả lời

5

Khung thứ hai cần một tham chiếu đến khung đầu tiên để nó có thể đặt tiêu điểm trở lại khung hình đầu tiên.

Ngoài ra các lớp của bạn mở rộng JFrame nhưng chúng cũng đang tạo các khung khác trong các hàm tạo của chúng.

+0

tôi đã tìm kiếm và tôi thấy rằng tôi chỉ có thể làm điều này. setVisible (false); vứt bỏ(); trên các tuyên bố khác và nó đóng khung và trở về khung ban đầu và trong khung ban đầu tôi làm như vậy sau khi cuộc gọi cho cửa sổ thứ hai, nó có vẻ làm việc. bạn nghĩ sao? – namdizy

+0

Điều gì sẽ xảy ra nếu người dùng của bạn thu nhỏ khung hình đầu tiên? Bạn có thực sự muốn đóng khung thứ hai không? Nghe có vẻ như bạn nên sử dụng một hộp thoại phương thức nếu đó thực sự là những gì bạn đang sau. – jzd

+0

tôi sẽ kiểm tra trên hộp thoại phương thức. Nếu người dùng của tôi ở trên khung đầu tiên và nhấn nút "bắt đầu", nó sẽ chuyển đến khung thứ hai và đóng khung thứ nhất, sau đó nhấn nút "quay lại menu" để đóng khung thứ hai và quay lại khung đầu tiên. do đó cả hai khung hình không mở cùng một lúc. – namdizy

3

Một vài gợi ý:

Bạn đang thêm các thành phần vào một JPanel sử dụng FlowLayout nhưng đang sử dụng hằng BorderLayout khi làm điều này mà bạn không nên làm vì nó không có ý nghĩa:

add(play, BorderLayout.CENTER); 

Thay vào đó, nếu sử dụng FlowLayout, chỉ cần thêm các thành phần không có các hằng số đó.

Ngoài ra, thay vì trao đổi JFrames, bạn có thể muốn xem xét sử dụng một CardLayout và trao đổi veiws trong một JFrame. Ví dụ:

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

Vì tôi phải tự mình thử nghiệm nếu thực tế là dễ thực hiện, tôi đã tạo ví dụ đơn giản này. Nó thể hiện một giải pháp cho vấn đề của bạn. Hơi lấy cảm hứng từ câu trả lời của @ jzd (+1 cho điều đó).

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

Thưởng thức, Boro.

Các vấn đề liên quan