代码之家  ›  专栏  ›  技术社区  ›  David Watson

Java JFrAMP问题

  •  3
  • David Watson  · 技术社区  · 14 年前
    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();
        }
    }
    

    我在做井字游戏。里面有两个按钮。每当我玩新游戏时,new game board函数应该运行并生成一个新的棋盘。但是,屏幕还是空白的!我想不出来,希望能得到帮助。抱歉,如果我没有以正确的格式发布,我是新来的。

    非常感谢!

    2 回复  |  直到 14 年前
        1
  •  2
  •   John Kugelman Michael Hodel    14 年前

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

    另一个解决方案是手动调用 mainWindow.validate() 在最后 () . 如果在使框架可见后向其添加组件,则必须执行此操作。

        2
  •  0
  •   YoK    14 年前

    在主窗口上使用paintall()或validate():

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