2011-10-16 38 views
3

我有一個簡單的Swing GUI,我想在按下按鈕之後向JTextArea添加一行新文本,簡單的權利?將文本追加到按鈕上的JTextArea?

Button和它的ActionListener函數正確(打印的東西到控制檯工作正常),但是當我使用.append()或.setText()添加文本到textarea,我得到一個空指針異常。

一如既往,在下面進行編碼。任何輸入將不勝感激,謝謝!

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 
    } 
} 
} 
+0

你也應該發表您的堆棧跟蹤 – amit

回答

9

你很可能會遮蔽一個變量 - 聲明它不止一次,但沒有初始化一個局部變量的類字段,所以類字段保持爲空。

編輯:
是的,果然,你做。在你的構造你有

JTextArea outputLog = new JTextArea(" "); 

這重新聲明outputLog變量,所以你只在初始化局部變量的構造。解決方案不是重新聲明變量,而是初始化類字段。因此,將上述內容更改爲

outputLog = new JTextArea(" "); 

您需要爲每個需要在類作用域中訪問的變量執行此操作。對於那些可以在本地申報的人,這樣做,但爲了安全起見,擺脫他們相應的類別聲明,以免在將來導致相同的錯誤。

+0

我怎麼會如此盲目!謝謝HFoE! –

+0

@邁克爾:不客氣! –

4

您的錯誤是實例變量outputLog未初始化。

3

你的代碼不是EDT做,你必須THT包裝成的invokeLater()

EventQueue.invokeLater(new Runnable() { 

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

OP不需要使用EDT與'JTextArea.append()',**是線程安全**。無論如何,總是從EDT調用'actionPerformed()'! – jfpoilpret