JFrame重绘/重新加载

时间:2012-10-27 16:17:21

标签: java swing

我很难开始一个新的会议。当我使用菜单选项新游戏时,我得到一个新实例 - 当真的,我只想用新的实例替换当前实例。我尝试了很多不同的东西,仍然无法解决它......

这是我的代码:

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 个答案:

答案 0 :(得分:4)

每次进入“新游戏”菜单时,您都会创建一个新实例:

        new TicTacToe2();   

如果您只想重置实例,请编写一个reset()方法,将游戏状态设置为初始状态。

答案 1 :(得分:2)

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

可能是个问题..我怀疑这是你获得新帧实例的地方。 有一个方法可以将数组清除为默认值,重置分数,你应该好好去。

答案 2 :(得分:2)

而不是创建班级的新实例

new TicTacToe2();

单击“新游戏”菜单项时,您可以清除按钮阵列文本并准备新游戏:

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

答案 3 :(得分:0)

如上所述,已经提到过您不必创建像

这样的新实例
new TicTacToe2()

所以,我会从那里继续。你的if语句应该是

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

创建一个看起来像下面的函数,它设置布局并将组件添加到它。将绘图逻辑放在那里并将其作为setContent窗格的参数。例如

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

我希望你在这里获得逻辑