2010-09-03 71 views
3
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 

public class tictac2 implements ActionListener{ 
    static boolean blue = true; //used to keep track of turns. if true, blue's turn, else, red's turn. Blue is x, red is o 
    static int bWins = 0, rWins = 0; 
    JFrame mainWindow; 
    JPanel board; 
    JButton[] buttons; 
    public tictac2() { 
     init(); 
    } 
    private void init() { 
     try { //Try to set the L&F to system 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } 
     catch (Exception e) { 
      e.toString(); 
      System.out.println("Couln't change look and feel. Using default"); 
     } 
     mainWindow = new JFrame("Tic Tac Toe!"); 
     mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainWindow.setVisible(true); 
     mainWindow.setSize(800,600); 
     JMenuBar bar = new JMenuBar(); //Menu bar init 
     JMenu file = new JMenu("File"); 
     JMenuItem newGame = new JMenuItem("New Game"), quitItem = new JMenuItem("Quit"); 
     file.add(newGame); 
     file.addSeparator(); 
     file.add(quitItem); 
     bar.add(file); 
     mainWindow.getContentPane().add(bar, BorderLayout.NORTH); //Menu bar done 
     newGameBoard(); //New Game Board 
     JPanel infoPane = new JPanel(); 
     infoPane.setLayout(new GridLayout(1,3)); 
     JLabel turn = new JLabel("Blue Player's Turn"), spacer = new JLabel(""), score = new JLabel("Blue: 0, Red: 0"); 
     infoPane.add(turn); 
     infoPane.add(spacer); 
     infoPane.add(score); 
     mainWindow.getContentPane().add(infoPane,BorderLayout.SOUTH); 
     newGame.addActionListener(this); //Add action listeners 
     quitItem.addActionListener(this); 

    } 
    private void newGameBoard() { 
     board = new JPanel(); //Game Pane init 
     board.setLayout(new GridLayout(3,3)); 
     buttons = new JButton[9]; 
     for (int i = 0; i <9; i++){ 
      buttons[i] = new JButton(""); 
      buttons[i].setOpaque(true); 
      buttons[i].setFont(new Font("sansserif", Font.BOLD, 90)); 
      board.add(buttons[i]); 
      buttons[i].addActionListener(this); 
     } 
     mainWindow.getContentPane().add(board,BorderLayout.CENTER); //Finish game pane init 
    } 
    public void actionPerformed(ActionEvent e){ 
     if (e.getSource() instanceof JButton){ 
      JButton j = (JButton)e.getSource(); 
      j.setForeground(tictac2.blue ? Color.BLUE:Color.RED); 
      j.setText(tictac2.blue ? "X" : "O"); 
      j.setEnabled(false); 
      tictac2.blue = !tictac2.blue; 

     } 
     else if (e.getSource() instanceof JMenuItem){ 
      JMenuItem j = (JMenuItem) e.getSource(); 
      if (j.getText().equals("Quit")) { 
       System.exit(0); 
      } 
      else if (j.getText().equals("New Game")) { 
       board.removeAll(); 
       mainWindow.remove(board); 
       board = null; 
       for (int i = 0; i < 9; i++) { 
        buttons[i] = null; 
       } 
       newGameBoard(); 
       tictac2.bWins = 0; 
       tictac2.rWins = 0; 
       tictac2.blue = true; 
       mainWindow.repaint(100); 
      } 
     } 
    } 
    public static void main(String[] args) { 
      new tictac2(); 
    } 
} 

我正在完成一個tic tac腳趾程序。其中我有2個按鈕。每當我點擊新遊戲時,newGameBoard函數都應該運行並創建一個新的棋盤。但是,屏幕只是空白!我無法弄清楚,並會很感激幫助。對不起,如果我沒有發佈正確的格式,我是新來的。Java JFrame問題

非常感謝!

回答

2

mainWindow.setVisible(true)移至init()的末尾。您不想將框架設置爲可見,除非您已將所有內容添加到該框架中。這樣它將驗證和佈局其子組件。

另一種解決方案是在init()的末尾手動呼叫mainWindow.validate()。這是您在將組件添加到框架後必須做的事情。

+1

我測試了。似乎沒有工作。 – sarahTheButterFly 2010-09-03 04:13:28

+0

我試着將mainWindow.setVisible(true)移動到init()的末尾,但它對新遊戲沒有幫助。將它移動到newGameBoard()的末尾工作。 – 2010-09-03 04:15:08

+0

是的,如果在設置框架可見之後添加或刪除組件*,則需要調用validate()來獲取框架來重新佈局其組件。 – 2010-09-03 04:20:46

0

使用paintAll()或驗證()上主窗口:如在API文檔描述

mainWindow.repaint(100); 

validatepaintAll():的

mainWindow.validate(); 

代替。

你改後的代碼如下所示:

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

public class TicTac2 implements ActionListener{ 
    static boolean blue = true; //used to keep track of turns. if true, blue's turn, else, red's turn. Blue is x, red is o 
    static int bWins = 0, rWins = 0; 
    JFrame mainWindow; 
    JPanel board; 
    JButton[] buttons; 
    public TicTac2() { 
     init(); 
    } 
    private void init() { 
     try { //Try to set the L&F to system 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } 
     catch (Exception e) { 
      e.toString(); 
      System.out.println("Couln't change look and feel. Using default"); 
     } 
     mainWindow = new JFrame("Tic Tac Toe!"); 
     mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainWindow.setVisible(true); 
     mainWindow.setSize(800,600); 
     JMenuBar bar = new JMenuBar(); //Menu bar init 
     JMenu file = new JMenu("File"); 
     JMenuItem newGame = new JMenuItem("New Game"), quitItem = new JMenuItem("Quit"); 
     file.add(newGame); 
     file.addSeparator(); 
     file.add(quitItem); 
     bar.add(file); 
     mainWindow.getContentPane().add(bar, BorderLayout.NORTH); //Menu bar done 
     newGameBoard(); //New Game Board 
     JPanel infoPane = new JPanel(); 
     infoPane.setLayout(new GridLayout(1,3)); 
     JLabel turn = new JLabel("Blue Player's Turn"), spacer = new JLabel(""), score = new JLabel("Blue: 0, Red: 0"); 
     infoPane.add(turn); 
     infoPane.add(spacer); 
     infoPane.add(score); 
     mainWindow.getContentPane().add(infoPane,BorderLayout.SOUTH); 
     newGame.addActionListener(this); //Add action listeners 
     quitItem.addActionListener(this); 

    } 
    private void newGameBoard() { 
     board = new JPanel(); //Game Pane init 
     board.setLayout(new GridLayout(3,3)); 
     buttons = new JButton[9]; 
     for (int i = 0; i <9; i++){ 
      buttons[i] = new JButton(""); 
      buttons[i].setOpaque(true); 
      buttons[i].setFont(new Font("sansserif", Font.BOLD, 90)); 
      board.add(buttons[i]); 
      buttons[i].addActionListener(this); 
     } 
     mainWindow.getContentPane().add(board,BorderLayout.CENTER); //Finish game pane init 
    } 
    public void actionPerformed(ActionEvent e){ 
     if (e.getSource() instanceof JButton){ 
      JButton j = (JButton)e.getSource(); 
      j.setForeground(TicTac2.blue ? Color.BLUE:Color.RED); 
      j.setText(TicTac2.blue ? "X" : "O"); 
      j.setEnabled(false); 
      TicTac2.blue = !TicTac2.blue; 

     } 
     else if (e.getSource() instanceof JMenuItem){ 
      JMenuItem j = (JMenuItem) e.getSource(); 
      if (j.getText().equals("Quit")) { 
       System.exit(0); 
      } 
      else if (j.getText().equals("New Game")) { 
       board.removeAll(); 
       mainWindow.remove(board); 
       board = null; 
       for (int i = 0; i < 9; i++) { 
        buttons[i] = null; 
       } 
       newGameBoard(); 
       TicTac2.bWins = 0; 
       TicTac2.rWins = 0; 
       TicTac2.blue = true; 

       mainWindow.validate(); 
       //mainWindow.repaint(); 
      } 
     } 
    } 
    public static void main(String[] args) { 
      new TicTac2(); 
    } 
}