按下按钮时将文本附加到JTextArea?

时间:2011-10-16 17:22:01

标签: java swing nullpointerexception jbutton jtextarea

我有一个简单的Swing GUI,我想在按下一个按钮后向JTextArea添加一行新文本,这很简单吗?

Button和它的ActionListener函数正确(打印到控制台的工作正常),但是当我使用.append()或.setText()将文本添加到textarea时,我得到一个nullpointer异常。

一如既往,请在下面编写代码。任何意见都将非常感谢,谢谢!

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.border.LineBorder;

public class GUI extends JFrame implements ActionListener {

private JFrame frame;
private JLabel paneHeader;
public JTextArea ipArea, portArea, outputLog, orderLog, cookLog;
private JButton newServer;

public String ipAddress, portNumber, cashierName, cookName;

public GUI() {
    initGUI();
}

public void initGUI() {

    frame  = new JFrame("Restaurant Overview");
    Container contentPane = frame.getContentPane(); 

    JLabel paneHeader = new JLabel("Restaurant Monitoring System");
    paneHeader.setBounds(200, 0, 200, 25);
    paneHeader.setFont(new Font("Calibri", Font.BOLD, 14));

    JLabel ipLabel = new JLabel("IP Address: ");
    ipLabel.setBounds(25, 30, 75, 20);
    ipLabel.setFont(new Font("Calibri", Font.PLAIN, 12));

    final JTextArea ipArea = new JTextArea();
    ipArea.setBorder(new LineBorder(Color.GRAY));
    ipArea.setBounds(105, 30, 100, 20);

    JLabel portLabel = new JLabel("Port Number: ");
    portLabel.setBounds(25, 55, 75, 20);
    portLabel.setFont(new Font("Calibri", Font.PLAIN, 12));

    final JTextArea portArea = new JTextArea();
    portArea.setBorder(new LineBorder(Color.GRAY));
    portArea.setBounds(105, 55, 100, 20);

    JButton newServer = new JButton("Create new Server");
    newServer.setBorder(new LineBorder(Color.GRAY));
    newServer.setBounds(250, 30, 150, 40);
    newServer.setActionCommand("createserver");
    newServer.addActionListener(this);

    JTextArea outputLog = new JTextArea(" ");
    outputLog.setBorder(new LineBorder(Color.GRAY));
    outputLog.setBounds(25, 90, 150, 150);
    //outputLog.setEditable(false);  

    JTextArea cashierLog = new JTextArea();
    cashierLog.setBorder(new LineBorder(Color.GRAY));
    cashierLog.setBounds(185, 90, 150, 150);
    //cashierLog.setEditable(false);  

    JTextArea cookLog = new JTextArea();
    cookLog.setBorder(new LineBorder(Color.GRAY));
    cookLog.setBounds(345, 90, 150, 150);
    //cookLog.setEditable(false);  

    contentPane.add(paneHeader);
    contentPane.add(ipLabel);
    contentPane.add(ipArea);
    contentPane.add(portLabel);
    contentPane.add(portArea);
    contentPane.add(outputLog);
    contentPane.add(cashierLog);
    contentPane.add(cookLog);

    contentPane.add(newServer);

    frame.setLayout(null);
    frame.pack();
    frame.setSize(600,400);
    frame.setVisible(true); 
}

public void test() {
    //ipAddress = ipArea.getText() + "\n";
    //portNumber = portArea.getText() + "\n";
    String text = "lemons";
    //System.out.println(text);
    outputLog.append(text);
    //outputLog.append(portNumber);
}


public void actionPerformed(ActionEvent e) {
    if ("createserver".equals(e.getActionCommand())) {
        //test();
        outputLog.append("lemons");
    } else {
        //Do Nothing
    }
}
}

3 个答案:

答案 0 :(得分:9)

您可能会隐藏变量 - 不止一次声明它,但初始化局部变量而不是类字段,因此类字段保持为空。

修改
是的,你确实做到了。在您的构造函数中,您有

JTextArea outputLog = new JTextArea(" ");

这会重新声明outputLog变量,因此您只初始化构造函数的本地变量。解决方案不是重新声明变量,而是初始化类字段。所以将上面改为

outputLog = new JTextArea(" ");

您需要为需要在类范围中访问的每个变量执行此操作。对于那些可以在本地声明的人,可以这样做,但为了安全起见,请删除相应的类声明,以免将来导致同样的错误。

答案 1 :(得分:4)

您的错误是未初始化实例变量outputLog

答案 2 :(得分:3)

您的代码未在EDT上完成,您必须将其包装到invokeLater()

EventQueue.invokeLater(new Runnable() {

    @Override
    public void run() {
       outputLog.setText(outputLog.getText() 
          + System.getProperty("line.separator") + text);
    }
});