2013-01-04 1 views
-2

이 코드를 jApplet으로 실행하려면 어떻게해야합니까?이 jApplet은 어떻게 작동합니까?

내 애플릿은 이제 다음과 같습니다

public class TickTackToeApplet extends JApplet implements ActionListener { 
    private static final long serialVersionUID = 1L; 
    private ArrayList<JButton> buttons = new ArrayList<JButton>(); 

    private JPanel panel = new JPanel(); 
    private Game game = new Game(); 
    private Player player1; 
    private Player player2; 
    private int numberOfPlacedOutChars = 0; 
    private String winner = "None"; 

    public void init() { 
     try { 
      SwingUtilities.invokeAndWait(new Runnable() { 
       public void run() { 
        game = new Game(); 
        game.setSize(4); 

        try { 
         PlayerManager pm = new PlayerManager(); 
         player1 = pm.getPlayer("Henrik", "temp123"); 
         player2 = pm.getPlayer("test", "test"); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 

        createGUI(game.getSize()); 
       } 
      }); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void CreateButtons(int gameBoardSize) 
    { 
     for(int x=0; x<gameBoardSize; x++) 
     { 
      for(int y=0; y<gameBoardSize; y++) 
      { 
       JButton btn = new JButton(""); 
       btn.setFont(new Font("Tahoma", Font.PLAIN, 32)); 
       btn.setName(x + ";" + y); 
       btn.addActionListener(this); 
       buttons.add(btn); 
      } 
     } 
    } 

    public void PlaceOutButtons() 
    { 
     for(JButton btn : buttons) 
      panel.add(btn); 
    } 

    public void createGUI(int gameBoardSize) { 

     panel.setSize(gameBoardSize*25, gameBoardSize*25); 
     panel.setBackground(Color.BLACK); 
     getContentPane().add(panel, BorderLayout.CENTER); 
     panel.setLayout(new GridLayout(gameBoardSize, gameBoardSize)); 

     CreateButtons(gameBoardSize); 
     PlaceOutButtons(); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     JButton buttonClicked = (JButton)e.getSource(); 
     String coordinates = buttonClicked.getName(); 
     String[] strArr = coordinates.split(";"); 
     int x = Integer.parseInt(strArr[0]); 
     int y = Integer.parseInt(strArr[1]); 

     if (this.numberOfPlacedOutChars % 2 == 0) { 
      this.player1.setGameChar('X'); 
      this.game.placeChar('X', x, y); 
      buttonClicked.setText("X"); 
      buttonClicked.setEnabled(false); 
     } 
     else { 
      this.player2.setGameChar('O'); 
      this.game.placeChar('O', x, y); 
      buttonClicked.setText("O"); 
      buttonClicked.setEnabled(false); 
     } 

     numberOfPlacedOutChars++; 

     if(this.game.checkWin() == true) { 

      updatePlayersInfo(); 

      for(JButton btn : buttons) { 
       btn.setEnabled(false); 
      } 

      int choice = JOptionPane.showConfirmDialog(this, "Winner is: " + this.winner + 
        ", play again?", "WINNER", JOptionPane.YES_NO_OPTION); 

      if(choice == 0) { 
       clearGameBoard(); 
       return; 
      } 
      //stop the applet 
      stop(); 
     } 

     if(this.game.IsDonePlaying() && this.game.checkWin() == false) { 

      int choice = JOptionPane.showConfirmDialog(this, "Winner is: " + this.winner + 
        ", play again?", "WINNER", JOptionPane.YES_NO_OPTION); 

      if(choice == 0) { 
       clearGameBoard(); 
       return; 
      } 
      //stop the applet 
      stop(); 
     } 
    } 

    public void startGame(int gameSize, Player player1, Player player2) { 
     this.game.setSize(gameSize); 
     this.player1 = player1; 
     this.player2 = player2; 
    } 

    private void updatePlayersInfo() { 
     if(this.game.getWinningChar() == this.player1.getGameChar()) { 
      this.player1.incrementWins(); 
      this.player2.incrementLosses(); 
      this.winner = this.player1.getUserName(); 
     } 

     if(this.game.getWinningChar() == this.player2.getGameChar()) { 
      this.player2.incrementWins(); 
      this.player1.incrementLosses(); 
      this.winner = this.player2.getUserName(); 
     } 

     try { 
      PlayerManager playerManager = new PlayerManager(); 
      playerManager.savePlayer(this.player1); 
      playerManager.savePlayer(this.player2); 
     } catch (IllegalArgumentException | IOException | InterruptedException e1) { 
      JOptionPane.showMessageDialog(this, "Couldn't update player info!"); 
     } 
    } 

    private void clearGameBoard() { 
     for(JButton btn : this.buttons) { 
      btn.setEnabled(true); 
      btn.setText(""); 
      this.winner = "None"; 
      this.game.setWinningChar('\0'); 
     } 
    } 

} 

하지만 내 애플릿 밤은 브라우저에 표시.

html 파일에서이 애플릿 태그를 사용할 수 있습니까?

<applet codebase="bin" code="gui/TickTackToeApplet.class" width=500 height=500> 
<p>Testing my applet...</p> 
</applet> 

아니면 애플릿 태그에 무엇을 써야합니까?

+0

스윙, 애플릿 및 Java 코드 규칙에 대한 자습서를 읽으셨습니까? –

+0

네,하지만 초심자인데 이해가 안됩니다. 몇 개월 만 프로그래밍했습니다. init 메소드가 주요 메소드입니까? – Henrik

+0

더 나은 전략은 애플릿을 잊어 버리는 것입니다. [Java Web Start] (http://stackoverflow.com/tags/applet/info)를 사용하여 링크에서 JFrame을 실행하십시오. –

답변

1

코드가 너무 깊어서 자세히 조사 할 수 없습니다.

작동 여부를 확인할 수 없지만 일부 기본 지침을 제공 할 예정입니다.

1 증분 프로그래밍을 사용하여 프로그램을 작성하고 작동하는지 확인한 다음 몇 가지 기능을 추가하십시오.

2

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     createAndShowGUI(); 
    } 
}); 

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html

4 init()이 항목 당신의 GUI 만들 때 placeOutButtons

public void PlaceOutButtons() 

3 사용 SwingUtilities.invokeLater로 변경, 대문자와 메소드를 호출하지 마십시오 애플릿을 가리키면 메소드 브라우저가 호출합니다. 비어 있기 때문에 아무 일도 일어나지 않습니다.

http://docs.oracle.com/javase/tutorial/deployment/applet/appletMethods.html

5 당신은 클래스 TickTackToeApplet에 생성자를 호출하지 않습니다. 내부적으로 시도하십시오 init

6 Eclipse를 사용하는 경우 내장 된 애플릿 뷰어를 사용하여 애플릿을 시작할 수 있습니다.

+0

생성자를 사용할 수 없다면 문제가 발생합니다. 애플릿을 브라우저에서 시작하려면 init 메소드가 있어야합니까? – Henrik

+0

@Henrik, 내가 지정한 링크를 읽었습니까? –

+0

네, 이제 init 메소드를 구현했습니다. 웹 페이지에 연결할 때 애플릿은 다음과 같이 말합니다 : 호환되지 않는 마법 값 1008813135. :/ – Henrik