2012-10-27 3 views
4

새 세션을 시작하는 데 어려움이 있습니다. 새 게임 메뉴 옵션을 사용할 때 새로운 인스턴스가 생깁니다. 실제로 현재 인스턴스를 새로운 인스턴스로 바꾸기를 원합니다. 난 당신이 새로운 프레임을 얻을 곳이 용의자 ...JFrame 다시 그리기/새로 고침

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

} 
} 
+0

을 논리를 얻고 희망을 (BorderLayout.CENTER, buttonPanel을 = 새로운 TicTacToePanel()); (명시 적으로 상수 "Center"를 사용하는 것은 나쁜 습관이다.) 그리고 2 중첩 for를 실행하는 sampson-chen에 따라 TicTacToePanel.reset() 메소드를 가진다. – ignis

답변

0

으로 이미이 같은 새 인스턴스를 만들 필요가 없습니다 언급

new TicTacToe2() 

그래서 나는 거기에서 계속 될 것이다. if 문은 다음과 같아야합니다.

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

레이아웃을 설정하고 구성 요소를 추가하는 것과 같은 함수를 만듭니다. 그리기 로직을 ​​거기에 놓고 내용 설정 윈도우에 인수로 지정합니다.

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

예를 들어 당신이 내가 TicTacToePanel가 나는 추가합니다) TicTacToe2 (에 다음 JPanel을 확장 작성합니다 여기

+0

당신은 비싼 소리를 제안합니다. 그리고 당신은 setContentPane에 함수 포인터를 전달하려고 했습니까? –

+0

그것은 달려있다 :) 당신의 requirment가 단지 텍스트를 다시 초기화하는 것만 큼 간단하다면 대답 중 하나가있다.하지만 전체 장면을 다시 그리기를 원한다면 나는 당신이해야 할 일을 생각한다 .. – LivingThing

+0

안녕 ... this 그냥 내가 필요한 .. 감사합니다. – user1779543

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

문제가 될 수 없습니다 : 나는 여기

내 코드는 ... 그것을 해결할 수없는 여전히 많은 다른 것들을 시도하고있다 예. 배열을 기본값으로 지우고 점수를 다시 설정하는 방법이 있으니 좋은 편이 좋을 것입니다. 그냥 예를 재설정하려는 경우

 new TicTacToe2(); 

이 게임을 설정하는 reset() 방법을 쓰기 :에 의해 "새로운 게임"의 메뉴를 통해 갈 때

4

당신은 때마다 새로운 인스턴스를 생성하는 상태에서 초기 상태로. 대신 클래스의 새로운 인스턴스를 생성하는

2

new TicTacToe2(); 

"새 게임"메뉴 항목을 클릭하면, 당신은 버튼 배열 텍스트를 지우고 새로운 게임을 준비 수 :

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