如何使此代码作为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标签中写什么?
答案 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。