2011-04-16 51 views
0

我想構建一個簡單的Java GUI(我只學了一個星期)。我創建了一個Textfield,用戶必須輸入一個數字。我想用數字做一些事情,但現在的問題是,當我調用方法textfield.getText()時,我得到一個'空指針除外。在文檔中說它可以在底層文檔爲空時得到異常。我不知道什麼是「未定文件」是。Java,什麼是底層文檔

任何幫助? 代碼:

import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.text.BadLocationException; 

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

public class GUI extends JFrame { 
    String [] aFull1 = new String [500]; 
    String [] aFull2 = new String [500]; 
    String [] aFull3 = new String [500]; 
    String [] aFull4 = new String [500]; 
    String [] aList1 = new String [15]; 
    String [] aList2 = new String [15]; 
    String [] aList3 = new String [15]; 
    String [] aList4 = new String [15]; 
    int pop1 = 0; 
    int pop2 = 0; 
    int pop3 = 0; 
    int pop4 = 0; 

//JTextField tfNr = new JTextField(); 
JTextField tfNr = new JTextField (""); 
JButton bStart = new JButton ("Start"); 
JButton bPause = new JButton ("Pause"); 
JButton bStop = new JButton ("Stop"); 
JList lList1 = new JList (aList1); 
JList lList2 = new JList (aList2); 
JList lList3 = new JList (aList3); 
JList lList4 = new JList (aList4); 
JButton bOK = new JButton ("OK"); 
JButton bRemove = new JButton ("Remove last item"); 
JTextArea taTijd = new JTextArea ("00:00:00", 10, 4); 
JPanel panel = new JPanel(); 
Timer timer = new Timer(1000, new ActionListener() { 
    public void actionPerformed (ActionEvent e){ 
     time++; 
     dispTime(); }} 
); 

final JTextArea taStrtNr = new JTextArea ("Voer startnummer in:"); 

static int time = 0; 
static int pTime; 

GUI() { 
    // Set title // 
    super ("Ultraloop"); 
    addToWindow(); 
    setPos(); 
    setProperties(); 

    // Add ActionListeners // 
    handler HO = new handler(); 
    bStart.addActionListener(HO); 
    bPause.addActionListener(HO); 
    bStop.addActionListener(HO); 
    bOK.addActionListener(HO); 

    /*for (int i = 0; i<100; i++){ 
     addOne(1,"One"); 
    } 
    addOne(1,"Two"); 
    scrollDown(1); 

    addOne(1,"One"); 
    addOne(2,"Two"); 
    addOne(3,"Three"); 
    addOne(4,"Four");*/ 

    // Final add // 
    add(panel); 
} 

private class handler implements ActionListener { 
    public void actionPerformed (ActionEvent e){ 
     if (e.getSource()==bStart){ 
      if (!timer.isRunning()){ 
       timer.start(); 
      } 
     } 
     else if (e.getSource() == bPause){ 
      if (timer.isRunning()){ 
       pTime = time; 
       timer.stop(); 
      } 
      else if (pTime != 0){ 
       timer.start(); 
       time = pTime; 
      } 
     } 
     else if (e.getSource() == bStop){ 
      if (timer.isRunning()){ 
       timer.stop(); 
       time = 0; 
       dispTime(); 
      } 
     } 
     else if (e.getSource() == bOK){ 
      try { 
       if (tfNr.getDocument().getText(0,2) != null){ 
        addOne(Integer.getInteger(tfNr.getDocument().getText(0,2))); 
       } 
      } catch (BadLocationException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     } 
    } 
} 

private void addToWindow(){ 
    add(tfNr); 
    add(bStart); 
    add(bPause); 
    add(bStop); 
    add(lList1); 
    add(lList2); 
    add(lList3); 
    add(lList4); 
    add(bOK); 
    add(bRemove); 
    add(taTijd); 
    add(taStrtNr); 
} 
private void setPos() { 
    tfNr.setBounds(20,25, 75,25); 
    bStart.setBounds(500,255, 75,25); 
    bPause.setBounds(500,290, 75,25); 
    bStop.setBounds(500,325, 75,25); 
    lList1.setBounds(20,75, 60,272); 
    lList2.setBounds(80,75, 50,272); 
    lList3.setBounds(130,75, 150,272); 
    lList4.setBounds(280,75, 150,272); 
    bOK.setBounds(110, 25, 75, 25); 
    bRemove.setBounds(80,20, 150,20); 
    taTijd.setBounds(445,10, 150,50); 
    taStrtNr.setBounds(20, 5, 150, 25); 
} 
private void setProperties() { 
    // Set Editable // 
    taTijd.setEditable(false); 
    taStrtNr.setEditable(false); 

    // Set Font // 
    taTijd.setFont(new Font("Arial", Font.BOLD + Font.ITALIC, 28)); 
    bRemove.setFont (new Font("Arial", Font.PLAIN, 12)); 

    // Set List properties // 
    lList1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    lList2.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    lList3.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    lList4.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    lList1.setVisibleRowCount(15); 
    lList2.setVisibleRowCount(15); 
    lList3.setVisibleRowCount(15); 
    lList4.setVisibleRowCount(15); 
    lList1.setBorder(BorderFactory.createLineBorder(Color.black)); 
    lList2.setBorder(BorderFactory.createLineBorder(Color.black)); 
    lList3.setBorder(BorderFactory.createLineBorder(Color.black)); 
    lList4.setBorder(BorderFactory.createLineBorder(Color.black)); 
    lList1.setBackground(new Color(180,180,180)); 
    lList2.setBackground(new Color(180,180,180)); 
    lList3.setBackground(new Color(180,180,180)); 
    lList4.setBackground(new Color(180,180,180)); 

    panel.setBackground(Color.WHITE); 
    tfNr.setBackground(new Color(230,230,230)); 
    tfNr.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
} 

private void addOne (int nr) { 
    System.out.print(String.format("%d",nr)); 
} 
private void removeOne(){ 

} 

private void dispTime() { 
    int h, m, s; 
    h = time/3600; 
    m = (time%3600)/60; 
    s = ((time%3600)%60); 
    taTijd.setText(String.format("%02d:%02d:%02d",h,m,s)); 
} 

private void scrollDown (int a) { 

} 

}

+0

發佈異常的* complete *堆棧跟蹤。告訴我們'Textfield'的完整類名(提示:'tfNr.getClass()。getCanonicalName()')。並告訴我們你的代碼片段在哪一行開始。 – 2011-04-16 12:43:09

+0

爲了更快地獲得更好的幫助,請發佈[SSCCE](http://pscode.org/sscce.html)。 – 2011-04-16 13:29:00

+0

順便說一句 - J2SE中沒有'Textfield'。你的意思是1)'TextField' 2)'JTextField'(正如'swing'標籤所暗示的那樣)3)第三方'Textfield'? – 2011-04-16 13:31:31

回答

4

如果您在這條線得到一個空指針:

if (tfNr.getText() != null){ 

然後它會出現tfNr爲空。確保在該行之前爲該變量賦值。

4

tfNr.getText()使用Document(PlainDocument for JTextField)。因此,它是與調用tfNr.getDocument().getText(0, tfNr.getDocument().getLenght())

+0

嗨。我得到那部分。但是,我需要做些什麼來消除我的NUllPointerException呢?我沒有得到那部分:D – Hidde 2011-04-16 20:22:38

0

唯一的例外是在這行拋出:

addOne(Integer.getInteger(tfNr.getDocument().getText(0,2))); 

,這是因爲這條線下面的部分進行評估,以空:

Integer.getInteger(tfNr.getDocument().getText(0,2)) 

。以下方法不接受null作爲參數:

private void addOne (int nr) { 

由於原始類型與空指針不兼容。 因此,拋出了NullPointerException。

要擺脫異常(但不是問題),您可以在上面一行中將 int更改爲Integer。

至於問題,你應該看看getInteger()方法 實際上做了什麼(檢出javadoc)。 我猜你真正想要做的是:

addOne(Integer.parseInt(tfNr.getText(0,2))); 

或可能:

addOne(Integer.parseInt(tfNr.getText())); 

獲得的全部文本。

另請注意,您如何不需要getDocument()。

P.S.你可能想要重述你的問題?

相關問題