Java 使用JButton从另一个类运行main类
我有一个Java项目(俄罗斯方块游戏),我把它导入了另一个项目。基本上,我希望通过简单的按钮点击来运行游戏(在NetBeans JFrame中,而不是类中) 我可以这样做:Java 使用JButton从另一个类运行main类,java,swing,main,Java,Swing,Main,我有一个Java项目(俄罗斯方块游戏),我把它导入了另一个项目。基本上,我希望通过简单的按钮点击来运行游戏(在NetBeans JFrame中,而不是类中) 我可以这样做: public static void main(String args[]) { TicTacToe.main(args) } 它工作正常,但当我在按钮单击事件中尝试时: private void TetrisButtonActionPerformed(java.awt.event.ActionEvent evt)
public static void main(String args[])
{
TicTacToe.main(args)
}
它工作正常,但当我在按钮单击事件中尝试时:
private void TetrisButtonActionPerformed(java.awt.event.ActionEvent evt) {
TicTacToe.main(new String[0]);
}
它给了我一个空白的框架,我想可能是参数,因为它在主方法中工作得很好,所以我创建了一个变量和方法来返回主方法中的参数,但它没有解决问题
有什么提示或解释为什么它不能工作吗
完整代码:
package tictactoe;
import java.awt.Component;
import javax.swing.JOptionPane;
public class TicTacToe {
public static boolean playerTurn = true;
public static boolean playerWon = false;
public static boolean computerWon = false;
public static boolean playgame = true;
public static game board = new game();
public static void main(String[] args) {
//startGame();
while(playgame == true)
{
if(board.isVisible() == false)
{
board.setVisible(true);
}
}
}
public static void checkforwin()
{
//player win
if(board.button1.getText().equals("X") )
{
if(board.button4.getText().equals("X") )
{
if(board.button7.getText().equals("X") )
{
playerWon = true;
computerWon = false;
JOptionPane.showMessageDialog(null, "Player won!");
}
}
}
if(board.button1.getText().equals("X") )
{
if(board.button5.getText().equals("X") )
{
if(board.button9.getText().equals("X") )
{
playerWon = true;
computerWon = false;
JOptionPane.showMessageDialog(null, "Player won!");
}
}
}
if(board.button1.getText().equals("X") )
{
if(board.button2.getText().equals("X") )
{
if(board.button3.getText().equals("X") )
{
playerWon = true;
computerWon = false;
JOptionPane.showMessageDialog(null, "Player won!");
}
}
}
if(board.button3.getText().equals("X") )
{
if(board.button5.getText().equals("X") )
{
if(board.button7.getText().equals("X") )
{
playerWon = true;
computerWon = false;
JOptionPane.showMessageDialog(null, "Player won!");
}
}
}
if(board.button3.getText().equals("X") )
{
if(board.button6.getText().equals("X") )
{
if(board.button9.getText().equals("X") )
{
playerWon = true;
computerWon = false;
JOptionPane.showMessageDialog(null, "Player won!");
}
}
}
if(board.button7.getText().equals("X") )
{
if(board.button8.getText().equals("X") )
{
if(board.button9.getText().equals("X") )
{
playerWon = true;
computerWon = false;
JOptionPane.showMessageDialog(null, "Player won!");
}
}
}
if(board.button4.getText().equals("X") )
{
if(board.button5.getText().equals("X") )
{
if(board.button6.getText().equals("X") )
{
playerWon = true;
computerWon = false;
JOptionPane.showMessageDialog(null, "Player won!");
}
}
}
if(board.button2.getText().equals("X") )
{
if(board.button5.getText().equals("X") )
{
if(board.button8.getText().equals("X") )
{
playerWon = true;
computerWon = false;
JOptionPane.showMessageDialog(null, "Player won!");
}
}
}
//computer won
if(board.button1.getText().equals("O") )
{
if(board.button4.getText().equals("O") )
{
if(board.button7.getText().equals("O") )
{
playerWon = false;
computerWon = true;
JOptionPane.showMessageDialog(null, "Computer won!");
}
}
}
if(board.button1.getText().equals("O") )
{
if(board.button5.getText().equals("O") )
{
if(board.button9.getText().equals("O") )
{
playerWon = false;
computerWon = true;
JOptionPane.showMessageDialog(null, "Computer won!");
}
}
}
if(board.button1.getText().equals("O") )
{
if(board.button2.getText().equals("O") )
{
if(board.button3.getText().equals("O") )
{
playerWon = false;
computerWon = true;
JOptionPane.showMessageDialog(null, "Computer won!");
}
}
}
if(board.button3.getText().equals("O") )
{
if(board.button5.getText().equals("O") )
{
if(board.button7.getText().equals("O") )
{
playerWon = false;
computerWon = true;
JOptionPane.showMessageDialog(null, "Computer won!");
}
}
}
if(board.button3.getText().equals("O") )
{
if(board.button6.getText().equals("O") )
{
if(board.button9.getText().equals("O") )
{
playerWon = false;
computerWon = true;
JOptionPane.showMessageDialog(null, "Computer won!");
}
}
}
if(board.button7.getText().equals("O") )
{
if(board.button8.getText().equals("O") )
{
if(board.button9.getText().equals("O") )
{
playerWon = false;
computerWon = true;
JOptionPane.showMessageDialog(null, "Computer won!");
}
}
}
if(board.button4.getText().equals("O") )
{
if(board.button5.getText().equals("O") )
{
if(board.button6.getText().equals("O") )
{
playerWon = false;
computerWon = true;
JOptionPane.showMessageDialog(null, "Computer won!");
}
}
}
if(board.button2.getText().equals("O") )
{
if(board.button5.getText().equals("O") )
{
if(board.button8.getText().equals("O") )
{
playerWon = false;
computerWon = true;
JOptionPane.showMessageDialog(null, "Computer won!");
}
}
}
if(playerWon == true || computerWon == true)
{
board.setVisible(false);
int dialogresult = JOptionPane.showConfirmDialog(null, "Désirez vous jouer une autre partie? ","test",JOptionPane.YES_NO_OPTION);
//ask user to select if he want to begin a new game
if(dialogresult == JOptionPane.YES_OPTION)
{
playerWon = false;
computerWon = false;
board.setVisible(true);
board.button1.setText("");
board.button2.setText("");
board.button3.setText("");
board.button4.setText("");
board.button5.setText("");
board.button6.setText("");
board.button7.setText("");
board.button8.setText("");
board.button9.setText("");
}
else
{
playgame = false;
}
}
}
public static void startGame()
{
while(playgame == true)
{
if(board.isVisible() == false)
{
board.setVisible(true);
}
}
}
}
我不确定你的项目中是否需要不止一个“main”方法。也许您应该使用默认构造函数
private void TetrisButtonActionPerformed(java.awt.event.ActionEvent evt) {
new Tetris();
}
我不确定你的项目中是否需要不止一个“main”方法。也许您应该使用默认构造函数
private void TetrisButtonActionPerformed(java.awt.event.ActionEvent evt) {
new Tetris();
}
这是一段有问题的代码:
while(playgame == true)
{
if(board.isVisible() == false)
{
board.setVisible(true);
}
}
从动作侦听器调用时,您处于事件分派线程中。当playgame
为真时,该代码在循环中运行,从不让控制权回到EDT以便它可以绘制
您应该改为如下所示:
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// Create board here, if needed
createBoard();
board.setVisible(true);
// start a new game here
startGame();
}
});
}
invokeLater()
将代码推送到事件dispath thread,这是线程安全访问和创建swing组件所必需的,因此即使您的代码没有它也不要跳过它
此外,如果您根本没有从动作侦听器调用
main()
,而只是调用启动新游戏的方法,那么它可能会更干净。这是一段有问题的代码:
while(playgame == true)
{
if(board.isVisible() == false)
{
board.setVisible(true);
}
}
从动作侦听器调用时,您处于事件分派线程中。当playgame
为真时,该代码在循环中运行,从不让控制权回到EDT以便它可以绘制
您应该改为如下所示:
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// Create board here, if needed
createBoard();
board.setVisible(true);
// start a new game here
startGame();
}
});
}
invokeLater()
将代码推送到事件dispath thread,这是线程安全访问和创建swing组件所必需的,因此即使您的代码没有它也不要跳过它
此外,如果您根本不从动作监听器调用
main()
,而只是调用启动新游戏的方法,那么它可能会更干净。英语是完美的。请向我们展示Tetris.main(args)
中的代码。这里:public static void main(String[]args){Tetris-Tetris-Tetris=new-Tetris();Tetris.startGame();}将其编辑到您的问题中,然后向我们展示填充JFrame.edited的代码(少用代码复制同一问题)公共静态游戏板=新游戏()代码>是静态的。如果它是静态的,它的可见性不会重置回false
,也不会显示。您希望board
是非静态的,因此对于每个新对象,布尔值反映该游戏是否可见,而不是任何游戏。英语是完美的。请向我们展示Tetris.main(args)
中的代码。这里:public static void main(String[]args){Tetris-Tetris-Tetris=new-Tetris();Tetris.startGame();}将其编辑到您的问题中,然后向我们展示填充JFrame.edited的代码(少用代码复制同一问题)公共静态游戏板=新游戏()代码>是静态的。如果它是静态的,它的可见性不会重置回false
,也不会显示。您希望board
是非静态的,因此对于每个新对象,布尔值反映该游戏是否可见,而不是任何游戏。非常感谢!!但是我仍然想知道为什么TicTacToe.main()可以在另一个main方法中工作,而不能在其他任何地方工作?@math487当调用main()
作为程序的入口点时,它不在EDT中。因此,线程不安全初始化有助于程序运行:循环中被阻塞的线程是主线程,而EDT可以自由运行GUI代码。非常感谢!!但是我仍然想知道为什么TicTacToe.main()可以在另一个main方法中工作,而不能在其他任何地方工作?@math487当调用main()
作为程序的入口点时,它不在EDT中。因此,线程不安全初始化有助于程序运行:循环中被阻塞的线程是主线程,而EDT可以自由运行GUI代码。