Java JFrame问题

时间:2010-09-03 03:39:35

标签: java swing jframe

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 toe程序。在它里面我有2个按钮。每当我点击新游戏时,newGameBoard函数应该运行并制作一个新的棋盘。但是,屏幕空白!我无法理解,并希望得到帮助。对不起,如果我没有以正确的格式发布,我是新来的。

非常感谢!

2 个答案:

答案 0 :(得分:2)

mainWindow.setVisible(true)移至init()的末尾。在将所有内容添加到框架之前,您不希望将框架设置为可见。这样它将验证和布局其子组件。

另一种解决方案是在mainWindow.validate()结束时手动调用init()。如果在将组件显示后将组件添加到框架中,则必须执行此操作。

答案 1 :(得分:0)

在mainWindow上使用paintAll()或validate():

mainWindow.validate();

而不是:

mainWindow.repaint(100);
API文档中描述的

validatepaintAll()

您更改的代码如下所示:

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