制作基于文本的RPG时遇到麻烦(文本区/字段相关)

时间:2015-04-11 13:45:12

标签: java swing

我试图制作一个简单的基于文本的角色扮演游戏,但最开始陷入困境。

我已经学习了大约一个月的Java,并且不知何故可以成功制作一个简单的文本冒险游戏(使用Scanner,println,if-statement等),适用于CMD。

所以我决定制作一个可以在窗口上播放的更高级的(希望类似巫术的东西)。

到目前为止,我已经学会了如何制作带框架的窗户,并放置一些面板,文字区域等。但现在我正在撞墙。

我尝试做(但无法做到)的是:

  1. 在文本字段中输入一个数字作为播放器命令,并根据输入的数字在文本区域中显示另一个文本。
  2. 清除文本区域中已显示的文本。
  3. 这是我的代码:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class Main extends JFrame implements ActionListener
    {
    JFrame window;
    JPanel p1;
    JPanel p2;
    JPanel p3;
    JPanel p4;
    JPanel p5;  
    JButton graphic;
    JTextArea statusT;
    JTextArea storyT;
    JTextField input;
    JButton commandB1;
    JButton commandB2;
    JButton commandB3;
    JButton commandB4;
    JButton commandB5;
    
    public static void main(String[]args)
    {       
    
        Main game = new Main();
        game.opening();
    
    }
    
    public void opening()
    {
    
        JFrame window = new JFrame();
        window.setBounds(200,200,1024,768);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setBackground(Color.black);
        window.setLayout(null); //Disabling the default layout.
    
        Font basicfont = new Font("MS Gothic", Font.PLAIN, 20);
    
        // Panel Setup          
        JPanel p1 = new JPanel(); //This is where graphics are displayed.
        p1.setBounds(10, 10, 650, 350); //Panel layout(x,y,x,y)
        p1.setBackground(Color.black);
    
        JPanel p2 = new JPanel(); //This is where status is displayed.
        p2.setBounds(670, 10, 325, 350);
        p2.setBackground(Color.black);      
    
        JPanel p3 = new JPanel(); //This is where story text is displayed.
        p3.setBounds(10, 370, 650, 350);
        p3.setBackground(Color.black);
    
        JPanel p4 = new JPanel(); //This is where command menu is displayed.
        p4.setBounds(670, 370, 325, 300);
        p4.setBackground(Color.black);
        p4.setLayout(new GridLayout(5,1)); //Setting the layout of Panel 4
    
        JPanel p5 = new JPanel(); //This is the text-entry box.
        p5.setBounds(670, 680, 325, 50);
    
        // TextArea Setup       
        JTextArea statusT = new JTextArea();
        JTextArea storyT = new JTextArea();     
        JTextField input = new JTextField(32);
    
    
        JButton commandB1 = new JButton("1:Stay");
        JButton commandB2 = new JButton("2:Attack the man");
        JButton commandB3 = new JButton("3:Drink");
        JButton commandB4 = new JButton("4:Leave");
        JButton commandB5 = new JButton("5:(Debug)Clear the text");
    
        //Graphic setup
        //graphic = new JButton(new ImageIcon("dungeonSample.jpg"));
        //graphic.setBackground(Color.black);
    
    
        //Status text setup                     
        statusT.setFont(basicfont);
        statusT.setBackground(Color.black);
        statusT.setForeground(Color.white);
        statusT.setText("\nLV     6\nHP   100\nMP    28\nG    120\nEXP   36"); //Ths is just a sample status
    
        //Story text setup
        storyT.setFont(basicfont);
        storyT.setBackground(Color.black);
        storyT.setForeground(Color.white);
        storyT.setText("<The innkeeper>\nHello this is an adventurer's inn. 8 golds for a night. \nWhat do you want to do?");
    
        //Input box setup
        input.setFont(basicfont);
        input.setBackground(Color.black);
        input.setForeground(Color.white);
        //input.setText("Input a number here>");        
        input.addActionListener(this);
    
    
    
        // Add Text>>Panel>>Window
        //p1.add(graphic);
        p2.add(statusT);
        p3.add(storyT);
        p4.add(commandB1);
        p4.add(commandB2);
        p4.add(commandB3);
        p4.add(commandB4);
        p4.add(commandB5);
        p5.add(input);
    
        window.add(p1);
        window.add(p2);
        window.add(p3);
        window.add(p4);
        window.add(p5);
    
        window.setVisible(true);            
    }
    
    public void actionPerformed(ActionEvent e)
    {
    
        String choice = input.getText();
    
        if(choice.equals("1")){
            storyT.setText("All right, sleep well.");
        }
        if(choice.equals("2"))
        {
            storyT.setText("What, you think you can rob me?!\n\nThe inkeeper attacked!\n6870 points of damage!\nYou are dead.");
        }
        if(choice.equals("3"))
        {
            storyT.setText("Sorry, we can't serve booze anymore because of the restriction by the lord");
        }
        if(choice.equals("4"))
        {
            storyT.setText("See ya.");          
        }
        if(choice.equals("5"))
        {
            storyT.setText("");         
        }
    
    }
    
    
    }
    

    在这个样本情况中,我希望你输入&#34; 1&#34;在输入框(面板p5上的文本字段)中,旅店老板的默认对话框(&#34;你好这是一个冒险家的旅馆......&#34;)将被替换为字符串&#34;好吧,睡得好。&#34;但即使我输入&#34; 1&#34;(或任何其他数字),也没有任何变化,并且控制台上会显示错误消息。

    我还尝试通过输入&#34; 5&#34;来清除默认文本。在文本字段中,但也不起作用。

    我知道我在某处做错了什么,但我不知道它在哪里。我试图在互联网上找到解决方案,但还没有找到任何有效的信息。

    如果有人能告诉我应该做什么,我将非常感激。

1 个答案:

答案 0 :(得分:2)

更改此

JTextArea statusT = new JTextArea();
JTextArea storyT = new JTextArea();
JTextField input = new JTextField(32);

到这个

 statusT = new JTextArea();
 storyT = new JTextArea();
 input = new JTextField(32);

你没有初始化你作为实例创建的textareas。你正在创建新的textareas.so实例textareas是null。这就是你得到空指针异常的原因

  JTextArea statusT;
  JTextArea storyT;
  JTextField input;

这三个尚未启动但未创建另一个statusT,storyT,input作为本地。