Java JFrame Question

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 turn, else, red 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 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();
    }
}

I am working on a tic tac toe program. I have 2 buttons in it. Whenever I get into a new game, the newGameBoard function should start and create a new board. However, the screen is simply blank! I can not understand this and I will be grateful for the help. Sorry if I do not post them in the correct format, I am new here.

Many thanks!

+3
source share
2 answers

Move mainWindow.setVisible(true)to the end init(). You do not want the frame to be visible until you add everything to it. Thus, he will check and compose his subcomponents.

- mainWindow.validate() init(). , , .

+2

paintAll() validate() mainWindow:

mainWindow.validate();

:

mainWindow.repaint(100);

validate paintAll() API.

:

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 turn, else, red 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 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();
    }
}
0

Source: https://habr.com/ru/post/1763006/


All Articles