не создается объект

153
25 февраля 2019, 04:50

У менять есть кнопка Start, в ней я создаю объект и добавляю его для видимости (и это работает), есть другая кнопка newGame, по сути я там делаю тоже самое, но нужного эффекта нету (мне надо что бы мое поле с прорисовкой создалось заново, и игра началась повторно). Как мне написать, что бы по нажатию на newGame, игра начиналась заново?

Класс по созданию GUI

public class Start extends JFrame{
    static String text;
    private static JPanel gameField;
    public Start(){
        gameField = new GameField();
        setSize(500, 620);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setTitle("крестики нолики");
        JPanel fieldWelcome = new JPanel();                                           //поле с приветствием
        JPanel fieldSetting = new JPanel();                                          //поле с настройками для игры
        JPanel background = new JPanel();                                          //
        JButton enter = new JButton("Запомнить");
        JButton start = new JButton("Играть");                                //для применения настроек
        JButton newGame = new JButton("Начать заново");                       //новая игра
        JTextField textName = new JTextField("Имя",20);             //главный игрок
        JTextField textName2 = new JTextField("Имя соперника",20); //имя соперника
        JLabel textWelcome = new JLabel("Добро пожаловать," +
                " пожалуйста вветите Ваше имя");                                         //Lable приветствия в окне fieldWelcome
        JLabel imageLabel = new JLabel(new ImageIcon("pictures/cross.png"));    //фоновое изображение для Welcome
        JLabel imageLabel2 = new JLabel(new ImageIcon("pictures/zero.png"));    //фоновое изображение для Setting
        JLabel textSetting = new JLabel("здравствуйте, выберите как вы желаете играть");    //приветствие в окне fieldSetting
        JRadioButton AI = new JRadioButton("с компьютером");                                //
        JRadioButton friend = new JRadioButton("с другом");                                 //
        //настройки цвета и размера
        textWelcome.setFont(new Font("Serif", Font.PLAIN, 22));
        enter.setPreferredSize(new Dimension(1,40));
        enter.setBackground(new Color(255, 251, 90));
        start.setPreferredSize(new Dimension(1,40));
        start.setBackground(new Color(255, 251, 90));
        newGame.setPreferredSize(new Dimension(1,40));
        newGame.setBackground(new Color(255, 251, 90));
        fieldWelcome.setBackground(Color.orange);
        fieldSetting.setBackground(Color.orange);
        textName.setBackground(new Color(248,255, 87));
        textName2.setBackground(new Color(248,255, 87));
        textSetting.setFont(new Font("Serif", Font.PLAIN, 20));
        AI.setFont(new Font("Serif", Font.PLAIN, 18));
        AI.setBackground(Color.orange);
        friend.setFont(new Font("Serif", Font.PLAIN, 18));
        friend.setBackground(Color.orange);
        friend.setSelected(true);
        background.setBackground(Color.orange);
        //добавление всех элементов
        ButtonGroup buttonGroup = new ButtonGroup();
        buttonGroup.add(AI);
        buttonGroup.add(friend);
        add(enter, BorderLayout.SOUTH);
        fieldWelcome.add(textWelcome);
        fieldWelcome.add(textName);
        fieldWelcome.add(imageLabel);
        fieldSetting.add(textSetting);
        fieldSetting.add(AI);
        fieldSetting.add(friend);
        fieldSetting.add(textName2);
        textName2.setVisible(false);
        fieldSetting.add(imageLabel2);
        add(fieldWelcome);
        if (friend.isSelected() == true) {          //временный костыль
            textName2.setVisible(true);
        } else return;
        enter.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                fieldWelcome.setVisible(false);
                enter.setVisible(false);
                add(fieldSetting);
                fieldSetting.setVisible(true);
                add(start, BorderLayout.SOUTH);
                text = textName.getText();                              //запись имени в переменную text,
                                                                        //для дальнейшего его использования
            }
        });
        start.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println(text + " " + textName.getText());    //вывел информацию в консоль для проверки,
                                                                        //что запись действительно происходит
                fieldSetting.setVisible(false);
                start.setVisible(false);
                add(newGame, BorderLayout.SOUTH);
                JPanel gameField;
                gameField = new GameField();
                add(gameField);
            }
        });
        newGame.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                add(newGame, BorderLayout.SOUTH);
                JPanel gameField;
                gameField = new GameField();
                add(gameField);

            }
        });
        setVisible(true);
    }
}

класс с прорисовкой

public class GameField extends JPanel {
    private int width;
    private int height;
    private final int SIZE = 3;
    private int cellWidth;
    private int cellHeight;
    private char [][] map;
    private boolean moveX = true;
    int clX;
    int clY;
    public GameField() {
        setOpaque(false);
        map = new char[SIZE][SIZE];
        addMouseListener(new MouseAdapter() {
 @Override
        public void mouseReleased(MouseEvent e) {
            clX = e.getX() / cellWidth;
            clY = e.getY() / cellHeight;
            System.out.println((clX + 1) + " " + (clY + 1));
            if (map[clX][clY] == 0) { // only if empty cell
                if (moveX) {
                    map[clX][clY] = 'x';
                } else {
                    map[clX][clY] = 'o';
                }
                moveX = !moveX;
                repaint();
            }
            if (isMapFull()){
                System.out.println("ничья");
            }
            if (checkWin(map[clX][clY])){
                System.out.println("кто-то выйграл");
            }
        }
    });
}
@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D)g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    width = getWidth();
    height = getHeight();
    cellHeight = height/SIZE;
    cellWidth = width/SIZE;
    BufferedImage myPictureKrestic = null;
    try {
        myPictureKrestic = ImageIO.read(new File("pictures/cross.png"));
    } catch (IOException e) {
        e.printStackTrace();
    }
    BufferedImage myPictureNolik = null;
    try {
        myPictureNolik = ImageIO.read(new File("pictures/zero.png"));
    } catch (IOException e) {
        e.printStackTrace();
    }
    for (int i = 0; i < SIZE; i++) {
        g2d.setColor(Color.black);
        g2d.drawLine(0, i*cellHeight, width, i*cellHeight);
        g2d.drawLine(i*cellWidth,0,i*cellWidth,height);
    }
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            if ((map[i][j] == 'x')) {
                g2d.drawImage(myPictureKrestic, i * cellWidth, j * cellHeight, cellWidth, cellHeight, null);
            } else if ((map[i][j] == 'o')) {
                g2d.drawImage(myPictureNolik, i * cellWidth, j * cellHeight, cellWidth, cellHeight, null);
            }
        }
    }
}
public boolean isMapFull(){
    for(int i=0; i < SIZE; i++){
        for(int j=0;j <SIZE; j++){
            if(map[i][j] == 0) return false;
        }
    }
    return true;
}
public boolean checkWin (char symb) {
    if(map[0][0] == symb && map[0][1] == symb && map[0][2] == symb) return true;
    if(map[1][0] == symb && map[1][1] == symb && map[1][2] == symb) return true;
    if(map[2][0] == symb && map[2][1] == symb && map[2][2] == symb) return true;
    if(map[0][0] == symb && map[1][1] == symb && map[2][2] == symb) return true;
    if(map[0][0] == symb && map[1][0] == symb && map[2][0] == symb) return true;
    if(map[0][1] == symb && map[1][1] == symb && map[2][1] == symb) return true;
    if(map[2][0] == symb && map[1][1] == symb && map[0][2] == symb) return true;
    if(map[0][2] == symb && map[1][2] == symb && map[2][2] == symb) return true;
    return false;
  }
}
Answer 1

start:

start.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println(text + " " + textName.getText());    //вывел информацию в консоль для проверки,
            //что запись действительно происходит
            fieldSetting.setVisible(false);
            start.setVisible(false);
            add(newGame, BorderLayout.SOUTH);
//                JPanel gameField;
            gameField = new GameField();
            add(gameField);
        }
    });

newGame:

newGame.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
//                add(newGame, BorderLayout.SOUTH); // зачем добавлять ту же кнопку каждый раз? Она и так останется
//                JPanel gameField;
            remove(gameField);
            gameField = new GameField();
            add(gameField);
            gameField.revalidate();
        }
    });
READ ALSO
Искажение русского текста, Java RMI

Искажение русского текста, Java RMI

Есть клиент и сервер на Java RMIКлиент считывает текст с консоли через Scanner

143
Java Word\OpenOffice добавить вложение

Java Word\OpenOffice добавить вложение

Занимаюсь формирование docx\odt файлов по средствам javaВозник вопрос: как можно вставить вложение (OLE объект) в docx\odt файл

148
Как обработать Swipe верх и вниз?

Как обработать Swipe верх и вниз?

У меня есть viewpager по горизонтали и я хочу по вертикали обработать swipe, как это реализовать ? Я пытался обработать swipe но viewpager мешает отслеживать...

172
Как убрать прогресс бар

Как убрать прогресс бар

Мне нужно убрать прогресс бар из refreshlayout та или сделать невидимымКак растянуть и отпускать layout и обработать refresh без прогресс бара?

144