2010-09-03 70 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(); 
    } 
}