Java 使用JButton从另一个类运行main类

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)

我有一个Java项目(俄罗斯方块游戏),我把它导入了另一个项目。基本上,我希望通过简单的按钮点击来运行游戏(在NetBeans JFrame中,而不是类中)

我可以这样做:

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代码。