JFrame Redraw / Reload

It's hard for me to start a new session. When I use the new menu option, I get a new instance - when really, I just want to replace the current instance with a new one. I tried many different things and still can not solve it ...

Here is my code:

package tictactoe; import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JTextField; public class TicTacToe2 extends JFrame implements ActionListener { char[][] game = new char[3][3]; JButton[][] buttons = new JButton[3][3]; JButton menuItem = new JButton(); JMenu menu = new JMenu ("TicTacToe"); JMenuItem newgame = new JMenuItem("Start New Game"), exit = new JMenuItem("Exit"); TicTacToe2() { super("Tic Tac Toe"); setSize(500, 600); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); setLayout( new BorderLayout()); JPanel northPanel= new JPanel(); northPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); add("North", northPanel); JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new GridLayout(3,3, 4, 4)); add("Center", buttonPanel); Font font = new Font("Serif", Font.BOLD, 32); for (int row=0; row < game.length; row++) { for (int col =0; col < game[row].length; col++) { game[row][col] = ' '; JButton b = new JButton(" "); b.setFont(font); b.setBackground(Color.green); b.addActionListener(this); buttons[row][col] = b; buttonPanel.add(b); } } menu.add(newgame); menu.add(exit); newgame.addActionListener(this); exit.addActionListener(this); JMenuBar bar = new JMenuBar( ); bar.add(menu); setJMenuBar(bar); } public void actionPerformed(ActionEvent e) { Object menusource = e.getSource(); if(menusource == newgame){ new TicTacToe2(); }else if(menusource == exit){ System.exit(0); } } public static void main(String[] args) { TicTacToe2 ttt = new TicTacToe2(); } } 
+4
source share
4 answers

As mentioned above, you should not create a new instance of the type

 new TicTacToe2() 

So, I will continue from there. Your if statement should be something like

 if (menusource == newgame) { getContentPane.removeAll(); setContentPane(aFunc); } 

Create a function that looks like something below that sets the layout and adds a component to it. Put your drawing logic there and specify it as an argument to the setContent panel. for instance

  private JPanel aFunc() { custSelectPanel.setLayout(null); customerTable.setDragEnabled(false); customerTable.setFillsViewportHeight(true); ...... cancelButton.setLocation(350, 0); cancelButton.setSize(100, 40); buttonPanel.add(cancelButton); return custSelectPanel; } 

Hope you get the logic here.

0
source

Each time you create a menu for a new game, you create a new instance:

  new TicTacToe2(); 

If you just want to create a reset instance, write the reset() method, which sets the state of the game to its original state.

+4
source
 public void actionPerformed(ActionEvent e) { Object menusource = e.getSource(); if(menusource == newgame){ new TicTacToe2(); //What are you doing with this object? //Should really be resetGame(); }else if(menusource == exit){ System.exit(0); } } 

There may be a problem. I suspect where you get a new instance of the frame. Have a method that clears arrays to the default, resets the count, and you should be good to go.

+2
source

Instead of creating a new instance of your class

 new TicTacToe2(); 

when the "New game" button is pressed, you can clear the text of the array of buttons and prepare for a new game:

 for (int i=0; i < buttons.length; i++ ) { for (int j=0; j < buttons[0].length; j++ ) { buttons[i][j].setText(" "); } } 
+2
source

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


All Articles