当我按下按钮时,如何更改JTextArea中的文本?

时间:2013-04-24 18:03:13

标签: java swing jbutton jtextarea preferredsize

我正在尝试选择你自己的冒险游戏,当我按下按钮时,文本会变为正确的场景。但是,在第71行,当我尝试设置TextArea的文本时,它会显示“线程中的异常”AWT-EventQueue-0“java.lang.Error:未解决的编译问题:无法解析adventureArea”。求助,拜托?!

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.border.Border;

public class TheGame extends JPanel implements ActionListener{

/**
 * @param args
 */
private int numClicks1 = 0;
private int numClicks2 = 0;
String gameText = "You wake up in the morning feeling like a sir. As is tradition, you need electronics of any kind to keep your mind running (going outside is out of the question. Nothing exciting in the real world). There are many options available to you, but the internet and games are the ones that appeal the most. Do you want to surf the web or use an app?";

private static final long serialVersionUID = 1L;
 JButton option1;
 JButton option2;

    public TheGame(){
        JPanel buttonPane = new JPanel(new BorderLayout(1,1));
        JPanel textPane = new JPanel(new BorderLayout(1,1));

        option1 = new JButton("Click here for teh interwebs");
         option1.addActionListener(this);
        option1.setPreferredSize(new Dimension(300, 50));
         option1.setVisible(true);

        option2 = new JButton("Click here for teh entertainments");
        option2.addActionListener(this);
         option2.setPreferredSize(new Dimension(300, 50));
         option2.setVisible(true);


        JTextArea adventureArea = new JTextArea();
        adventureArea.setFont(new Font("Serif", Font.PLAIN, 16));
        adventureArea.setLineWrap(true);
        adventureArea.setWrapStyleWord(true);
        adventureArea.setEditable(true);
        adventureArea.setText(gameText);

        JScrollPane adventureScroll = new JScrollPane(adventureArea);
        adventureScroll.setPreferredSize(new Dimension(350, 350));
        adventureScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        Border adventureSpace = BorderFactory.createEmptyBorder(0,10,10,10);
        Border adventureBorder = BorderFactory.createTitledBorder(adventureSpace, "TECHNOLOGY!!!");
        adventureScroll.setBorder(adventureBorder);
        adventureScroll.setVisible(true);


        textPane.add(adventureScroll, BorderLayout.CENTER);
        buttonPane.add(option1,BorderLayout.NORTH);
        buttonPane.add(option2,BorderLayout.SOUTH);


        add(buttonPane, BorderLayout.SOUTH);
        add(textPane, BorderLayout.CENTER);

        setVisible(true);
        buttonPane.setVisible(true);
        textPane.setVisible(true);

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==option1){
            //numClicks1++;
            //gameText="The internet: A wondrous place full of knowledge, videos, stories, memes, and everything else. Like every place, it has a dark and a light side. Where go?";
            adventureArea.append("The internet: A wondrous place full of knowledge, videos, stories, memes, and everything else. Like every place, it has a dark and a light side. Where go?");
        }else if (e.getSource()==option2){
        numClicks2++;
        };

      /* if(numClicks1==1){
           gameText="The internet: A wondrous place full of knowledge, videos, stories, memes, and everything else. Like every place, it has a dark and a light side. Where go?";
       }else if (numClicks2==1){

       };*/
    }


    private static void createAndShowGUI() {

        JFrame frame = new JFrame("The Game");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        TheGame theContentPane = new TheGame();
        theContentPane.setOpaque(true); 
        frame.setContentPane(theContentPane);

        JFrame.setDefaultLookAndFeelDecorated(true);

        frame.pack();
        frame.setSize(800, 600);
        frame.setVisible(true);
    }

    public static void main(String[] args) {

        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }



}

1 个答案:

答案 0 :(得分:2)

这只是因为adventureArea是构造函数的本地字段而不是您的类的成员。

相反,低于JButton option2;声明private final JTextArea adventureArea;

TheGame的构造函数中,而不是JTextArea adventureArea = new JTextArea();将其替换为this.adventureArea = new JTextArea();

侧面说明:

  • 永远不要使用setPreferredSize(),而是使用适当的LayoutManager或提供您尝试实现的内容的提示。例如,您的按钮可以放置在JPanel GridLayout内(以便它们都具有相同的大小),然后将该面板放在SOUTH BorderLayout }}。对于JTextArea,请指明所需的行数和列数(例如,24行乘以80列):new JTextArea(24, 80);。这将自动传播到滚动窗格,然后传播到父窗口。
  • 尝试正确缩进代码,避免愚蠢的错误,让其他人更容易阅读代码。
  • 不要同时拨打frame.pack();frame.setSize(800, 600);,最后一个会赢。偏好pack()而不是setSize()
  • 默认情况下,所有组件都可见,无需在其上调用setVisible(true)。只需要显式地显示顶级容器(Windows)。