我如何使这个jApplet工作?

时间:2013-01-04 16:08:02

标签: java japplet

如何使此代码作为jApplet运行?

我的Applet现在看起来像这样:

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

}

但是我的applet没有在浏览器中显示。

我可以在html文件中使用此applet标记吗?

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

或者我应该在applet标签中写什么?

1 个答案:

答案 0 :(得分:1)

您的代码太长,无法深入调查。

我无法确定它是否可行,甚至无法编译,但我将提供一些基本指导。

1使用增量编程,编程,确保其有效,添加更多功能。

2不要使用大写字母调用方法,将其更改为placeOutButtons

public void PlaceOutButtons()

3创建GUI时使用SwingUtilities.invokeLater

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

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

4 init()是applet的入口点,浏览器会调用该方法。因为它是空的,没有任何事情发生。

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

5你永远不会在班级TickTackToeApplet上调用构造函数。尝试在init

中进行

6如果您使用Eclipse,则可以使用其内置的Applet Viewer启动applet。