2012-03-10 27 views
1

這是我第一次在這裏問,所以如果您需要更多信息,我會提供,請問我。TextField中負號的錯誤

我已經學習了Java幾個星期了,最後我決定嘗試製作自己的程序,這是第一個,所以代碼會很麻煩。它基本上是一款名爲Pangya的遊戲的計算器,因爲我不知道還有什麼要做。

代碼:

import java.awt.Dimension; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.event.*; 

public class Pangya { 
    public static void main(String[] args) { 
     GUI g = new GUI(); 
     g.setSize(500, 600); 
     g.setVisible(true); 
     g.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

class GUI extends JFrame { 
    private JLabel distance; 
    private JLabel altura; 
    private JLabel slope; 
    private JLabel wind; 
    private JLabel angle; 
    private JLabel cheat; 
    private JLabel toma; 
    private JLabel spike; 
    private JLabel result; 
    public JTextField dis; 
    public JTextField alt; 
    public JTextField sl; 
    public JTextField w; 
    public JTextField ang; 
    private JButton res; 
    int d; 
    int al; 
    int s; 
    int win; 
    int an; 
    double H; 

    public GUI() { 
     super("Pangya Calculator"); 
     setLayout(null); 
     distance = new JLabel("Enter hole distance:"); 
     altura = new JLabel("Enter hole height:"); 
     slope = new JLabel("Enter slope resistance:"); 
     wind = new JLabel("Enter wind power:"); 
     angle = new JLabel("Enter wind angle:"); 
     cheat = new JLabel("Are you using cheat?"); 
     toma = new JLabel("Tomahawk"); 
     spike = new JLabel("Spike"); 
     result = new JLabel("You must hit with backspin:"); 
     dis = new JTextField(); 
     alt = new JTextField(); 
     sl = new JTextField(); 
     w = new JTextField(); 
     ang = new JTextField(); 
     res = new JButton("Calculate"); 
     Dimension size1 = distance.getPreferredSize(); 
     Dimension size2 = altura.getPreferredSize(); 
     Dimension size3 = slope.getPreferredSize(); 
     Dimension size4 = wind.getPreferredSize(); 
     Dimension size5 = angle.getPreferredSize(); 
     Dimension size6 = cheat.getPreferredSize(); 
     Dimension size7 = toma.getPreferredSize(); 
     Dimension size8 = spike.getPreferredSize(); 
     Dimension size9 = result.getPreferredSize(); 
     Dimension size10 = res.getPreferredSize(); 
     distance.setBounds(12, 50, size1.width, size1.height); 
     altura.setBounds(12, 150, size2.width, size2.height); 
     slope.setBounds(12, 250, size3.width, size3.height); 
     wind.setBounds(12, 350, size4.width, size4.height); 
     angle.setBounds(12, 450, size5.width, size5.height); 
     cheat.setBounds(250, 50, size6.width, size6.height); 
     toma.setBounds(250, 150, size7.width, size7.height); 
     spike.setBounds(350, 150, size8.width, size8.height); 
     result.setBounds(250, 350, size9.width, size8.height); 
     dis.setBounds(12, 75, size1.width, size1.height); 
     alt.setBounds(12, 175, size1.width, size1.height); 
     sl.setBounds(12, 275, size1.width, size1.height); 
     w.setBounds(12, 375, size1.width, size1.height); 
     w.setEditable(true); 
     ang.setBounds(12, 475, size1.width, size1.height); 
     ang.setEditable(true); 
     res.setBounds(200, 500, size10.width, size10.height); 
     dis.getDocument().addDocumentListener(new DocumentListener() { 
     public void changedUpdate(DocumentEvent e) { 
     } 

     public void removeUpdate(DocumentEvent e) { 
     } 

     public void insertUpdate(DocumentEvent e) { 
      d = Integer.parseInt(dis.getText()); 
     } 
     }); 
     alt.getDocument().addDocumentListener(new DocumentListener() { 
     public void changedUpdate(DocumentEvent e) { 
     } 

     public void removeUpdate(DocumentEvent e) { 
     } 

     public void insertUpdate(DocumentEvent e) { 
      al = Integer.parseInt(alt.getText()); 
     } 
     }); 
     sl.getDocument().addDocumentListener(new DocumentListener() { 
     public void changedUpdate(DocumentEvent e) { 
     } 

     public void removeUpdate(DocumentEvent e) { 
     } 

     public void insertUpdate(DocumentEvent e) { 
      s = Integer.parseInt(sl.getText()); 
     } 
     }); 
     ang.getDocument().addDocumentListener(new DocumentListener() { 
     public void changedUpdate(DocumentEvent e) { 
     } 

     public void removeUpdate(DocumentEvent e) { 
     } 

     public void insertUpdate(DocumentEvent e) { 
      an = Integer.parseInt(ang.getText()); 
     } 
     }); 
     w.getDocument().addDocumentListener(new DocumentListener() { 
     public void changedUpdate(DocumentEvent e) { 
     } 

     public void removeUpdate(DocumentEvent e) { 
     } 

     public void insertUpdate(DocumentEvent e) { 
      win = Integer.parseInt(w.getText()); 
     } 
     }); 
     res.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      H = d + al + Math.ceil(Math.sin(an) * win); 
      JOptionPane.showMessageDialog(null, "You must hit " + H 
        + "y with backspin.", "Hit", JOptionPane.PLAIN_MESSAGE); 
     } 
     }); 
     add(distance); 
     add(altura); 
     add(slope); 
     add(wind); 
     add(angle); 
     add(cheat); 
     add(toma); 
     add(spike); 
     add(result); 
     add(dis); 
     add(alt); 
     add(sl); 
     add(w); 
     add(ang); 
     add(res); 
    } 
} 

的問題是,當我試圖JTextField的「昂」轉換爲int,我不能把負數,比如我嘗試把孔在高度-12,我得到一個錯誤。我不知道如何繼續或修復它。所以我虛心請求你的幫助。

在此先感謝。

+0

爲了更好的幫助更快,發佈[SSCCE](http://sscce.org/)(任務離子,而不是兩段代碼到pastebin)。 – 2012-03-10 16:56:30

回答

3

而不是純JTextField使用JFormattedTextFieldJFormattedTextFieldNumber formatter可以減少允許charsNumbersdecimal separatornegative sing,然後不存在用於解析IntegerLongDouble

例如任何原因:

DecimalFormat format = new DecimalFormat("#"); 
    JFormattedTextField formattedField = new JFormattedTextField(format); 
    formattedField.setColumns(15); 
+0

剛剛嘗試過,它仍然是相同的,我認爲問題是在= Integer.parseInt(dis.getText()),但我不知道如何解決它。 – user1261239 2012-03-10 16:53:21

+0

編輯:哦,我很抱歉,我從我的手機閱讀,它裁剪你的消息一半,我會刪除解析部分,看看發生了什麼。 – user1261239 2012-03-10 16:59:40

+0

@ user1261239:參見編輯例如。 mKorbel - 希望你不介意編輯。請隨時糾正它。 1+順便說一句。 – 2012-03-10 17:10:36

0

您正在監聽插頁,但您需要聽取更改。像這樣在changedUpdate()方法內部使用parseInt:

 ang.getDocument().addDocumentListener(new DocumentListener() { 

      public void changedUpdate(DocumentEvent e) { 
       an = Integer.parseInt(ang.getText()); 
      } 

      public void removeUpdate(DocumentEvent e) { 
      } 

      public void insertUpdate(DocumentEvent e) { 
      } 
     }); 

它適用於我。還需要更改所有其他偵聽器方法。

+0

如果我這樣做,讓我輸入負數,但它不會在公式中加或減。 – user1261239 2012-03-10 17:05:52

+0

好吧,我的壞。它不捕獲changedUpdate,但捕獲insertUpdate。問題出在用戶輸入字符時;在Submit按鈕之前調用方法。所以' - '符號首先被處理,然後是'-1'。第一個明顯引發異常。我不認爲documentlistener是這樣做的最好方法。但是,如果你願意,你可以抓住例外並繼續前進。我應該工作。 – MadChuckle 2012-03-10 17:15:47

+0

是的,我只是意識到,如果我讓異常去它工作正常。 oly的事情是,數字出現在「 - 」之前,如果我先把它放進去,但這是一個小錯誤。 – user1261239 2012-03-10 17:24:16

1
Integer.parseInt(dis.getText()) 

拋出NumberFormatException。你可以捕捉它,然後告訴用戶他輸入了一個錯誤的值。

一個好方法是通過JOptionPane顯示一個對話框。

JOptionPane.showMessageDialog(...) 

我通常會檢查ActionListener中的值。然後,當出現錯誤時,我顯示消息並從actionPerformed方法返回。然後用戶有另一次機會輸入正確的值。

您不需要爲每個文本字段都有一個DocumentListener。你可以得到更高的文字:

class GUI extends JFrame { 
private JLabel distance; 
private JLabel altura; 
private JLabel slope; 
private JLabel wind; 
private JLabel angle; 
private JLabel cheat; 
private JLabel toma; 
private JLabel spike; 
private JLabel result; 
public JTextField dis; 
public JTextField alt; 
public JTextField sl; 
public JTextField w; 
public JTextField ang; 
private JButton res; 
int d; 
int al; 
int s; 
int win; 
int an; 
double H; 

public GUI() { 
    super("Pangya Calculator"); 
    setLayout(null); 
    distance = new JLabel("Enter hole distance:"); 
    altura = new JLabel("Enter hole height:"); 
    slope = new JLabel("Enter slope resistance:"); 
    wind = new JLabel("Enter wind power:"); 
    angle = new JLabel("Enter wind angle:"); 
    cheat = new JLabel("Are you using cheat?"); 
    toma = new JLabel("Tomahawk"); 
    spike = new JLabel("Spike"); 
    result = new JLabel("You must hit with backspin:"); 
    dis = new JTextField(); 
    alt = new JTextField(); 
    sl = new JTextField(); 
    w = new JTextField(); 
    ang = new JTextField(); 
    res = new JButton("Calculate"); 
    Dimension size1 = distance.getPreferredSize(); 
    Dimension size2 = altura.getPreferredSize(); 
    Dimension size3 = slope.getPreferredSize(); 
    Dimension size4 = wind.getPreferredSize(); 
    Dimension size5 = angle.getPreferredSize(); 
    Dimension size6 = cheat.getPreferredSize(); 
    Dimension size7 = toma.getPreferredSize(); 
    Dimension size8 = spike.getPreferredSize(); 
    Dimension size9 = result.getPreferredSize(); 
    Dimension size10 = res.getPreferredSize(); 
    distance.setBounds(12, 50, size1.width, size1.height); 
    altura.setBounds(12, 150, size2.width, size2.height); 
    slope.setBounds(12, 250, size3.width, size3.height); 
    wind.setBounds(12, 350, size4.width, size4.height); 
    angle.setBounds(12, 450, size5.width, size5.height); 
    cheat.setBounds(250, 50, size6.width, size6.height); 
    toma.setBounds(250, 150, size7.width, size7.height); 
    spike.setBounds(350, 150, size8.width, size8.height); 
    result.setBounds(250, 350, size9.width, size8.height); 
    dis.setBounds(12, 75, size1.width, size1.height); 
    alt.setBounds(12, 175, size1.width, size1.height); 
    sl.setBounds(12, 275, size1.width, size1.height); 
    w.setBounds(12, 375, size1.width, size1.height); 
    w.setEditable(true); 
    ang.setBounds(12, 475, size1.width, size1.height); 
    ang.setEditable(true); 
    res.setBounds(200, 500, size10.width, size10.height); 
    res.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     try{ 
      d = Integer.parseInt(dis.getText()); 
      ...etc for all fields 
     } 
     catch(NumberFormatException e){ 
      JOptionPane.showMessageDialog(GUI.this, "One of the values is not a number.", "Error", JOptionPane.ERROR_MESSAGE); 
      return; 
     } 
     H = d + al + Math.ceil(Math.sin(an) * win); 
     JOptionPane.showMessageDialog(null, "You must hit " + H 
       + "y with backspin.", "Hit", JOptionPane.PLAIN_MESSAGE); 
    } 
    }); 
    add(distance); 
    add(altura); 
    add(slope); 
    add(wind); 
    add(angle); 
    add(cheat); 
    add(toma); 
    add(spike); 
    add(result); 
    add(dis); 
+0

問題是我需要使用負值。 – user1261239 2012-03-10 17:06:32

+0

Integer.parseInt應該能夠解析底片。這些數字是否是真正的整數?如果它們包含小數點,則它們不會被解析爲整數。 – 2012-03-10 17:09:44

0

試試這個:

public void insertUpdate(DocumentEvent e) { 
    try { 
      an = Integer.parseInt(ang.getText()); 
    } 
    catch(NumberFormatException ex) { 
      // doNothing 
    } 
} 
+0

如果捕獲物什麼都不做,它不會從最終公式中加或減。 – user1261239 2012-03-10 17:30:35

0

首先,總是嵌入你的整數。在try { } catch聲明如解析..

try { 
    int myInt = Integer.parseInt(someString); 
} catch (NumberFormatException e) { 
    // not a number/cannot parse it 
} 

檢查下面的答案這,因爲這也是一個問題

+0

這是一條評論,而不是答案;) – Terraego 2012-03-10 18:16:33