1

我正在用 Java 为我的班级制作一个游戏,我希望它在游戏结束时,这个“开始新游戏”按钮关闭当前窗口并创建一个新窗口,这样我就可以无限玩游戏。问题是,它会打开一个新窗口,但不会关闭旧窗口。我无法访问内部类中的静态变量,因此无法使用 .setVisible(false);。有任何想法吗?我是新手,我真的很想学习。谢谢!

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.util.*;
public class GameGUI extends JFrame
{
    private Container c, d;
    private JTextArea terminal;
    private JScrollPane scroll;
    private JTextField name11, str11, name22, str22;
    private JButton start, atk, swp, hl, www, reset;
    private Panel top, ava1, ava2, move;
    private GameMaster gm;
    private JLabel qqq;
    private int s1, s2;
    private String n1, n2;

    public GameGUI()
    {
        c = this.getContentPane();
        c.setLayout( new BorderLayout() );

        ava1 = new Panel();
        ava1.setLayout( new GridLayout ( 1, 4, 5, 0 ) );
        JLabel name1 = new JLabel( "Avatar 1 Name: ", JLabel.CENTER );
        name11 = new JTextField( 20 );
        JLabel str1 = new JLabel( "Avatar 1 Strength: ", JLabel.CENTER );
        str11 = new JTextField();
        ava1.add( name1 );
        ava1.add( name11 );
        ava1.add( str1 );
        ava1.add( str11 );

        ava2 = new Panel();
        ava2.setLayout( new GridLayout ( 1, 4, 5, 0 ) );
        JLabel name2 = new JLabel( "Avatar 2 Name: ", JLabel.CENTER );
        name22 = new JTextField( 20 );
        JLabel str2 = new JLabel( "Avatar 2 Strength: ", JLabel.CENTER );
        str22 = new JTextField();
        ava2.add( name2 );
        ava2.add( name22 );
        ava2.add( str2 );
        ava2.add( str22 );

        top = new Panel();
        top.setLayout( new GridLayout( 3, 1 ) );
        top.add( ava1 );
        top.add( ava2 );

        class reset implements ActionListener
        {
            public void actionPerformed( ActionEvent ae )
            {
                JFrame wwe = new GameGUI();
                wwe.setLocation( 400, 230 );
                wwe.setSize( 640, 120 );
                wwe.setResizable( true );
                wwe.setVisible( true );
                wwe.setDefaultCloseOperation( EXIT_ON_CLOSE );
                c.remove( reset );
            }
        }

        class action implements ActionListener
        {
            String input;
            public action( String s )
            {
                input = s;
            }

            public void actionPerformed( ActionEvent ae )
            {
                boolean win = false;
                if ( !gm.hasWinner() )
                {
                    terminal.append( gm.play( input ) );
                    terminal.setCaretPosition( terminal.getDocument().getLength() );
                }
                else
                {
                    terminal.append( gm.printGameReport() );
                    c.remove( move );
                    reset = new JButton( "Start a new battle" );
                    reset.addActionListener( new reset() );
                    setSize( 650, 480 );
                    reset.setVisible( true );
                    c.add( reset, "North" );
                }
            }
        }

        class game implements ActionListener
        {
            public void actionPerformed( ActionEvent ae )
            {
                boolean badInput = false;
                n1 = name11.getText();
                n2 = name22.getText();
                if ( n1.equals( "" ) || n2.equals( "" ))
                {
                    JOptionPane.showMessageDialog( null, "Fields lack input!" );
                    badInput = true;
                }
                try
                {
                    s1 = Integer.parseInt( str11.getText());
                    s2 = Integer.parseInt( str22.getText());
                }
                catch( NumberFormatException e )
                {
                    JOptionPane.showMessageDialog( null, "Strength should be an     integer!" );
                    badInput = true;
                }

                if(!badInput)
                {
                    Avatar x = new Avatar ( n1, s1 );
                    Avatar y = new Avatar ( n2, s2 );
                    gm = new GameMaster( x, y );

                    terminal = new JTextArea();
                    terminal.append("....-----======LET THE BATTLE BEGIN! ======----    -....\n\n" );
                    terminal.setEditable( false );
                    c.setVisible( false );
                    c.remove(top);
                    c.setVisible( true );

                    atk = new JButton( "Attack" );
                    atk.addActionListener( new action( "attack" ) );
                    swp = new JButton( "Swap" );
                    swp.addActionListener( new action( "swap" ) );
                    hl = new JButton( "Heal" );
                    hl.addActionListener( new action( "heal" ) );

                    move = new Panel();
                    move.setLayout( new GridLayout( 3, 1 ) );
                    move.add( atk );
                    move.add( swp );
                    move.add( hl );

                    c.add( move, "West" );

                    scroll = new JScrollPane( terminal );
                    c.add( scroll, "Center" );
                    setLocation( 400, 120 );
                    setSize( 640, 480 );
                    do
                    {
                        terminal.append ( gm.equip() );
                    }while ( !x.beltIsFull() || !y.beltIsFull() );
                }
            }
        }

        start = new JButton( "Commence Battle!" );
        start.addActionListener( new game() );
        top.add( start );
        c.add( top, "North" );
    }
}

和我的主要方法:

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.util.*;
public class GameApp
{
    public static void main ( String args[] )
    {
        JFrame f = new GameGUI();
        f.setLocation( 400, 230 );
        f.setSize( 640, 120 );
        f.setResizable( true );
        f.setVisible( true );`enter code here`
    }
}
4

0 回答 0