2010-08-15 124 views
0

我想讓用戶輸入2個字段。一個是游泳池的體積,一個是小屋的體積。這然後計算每個的價格,如果用戶輸入池的容量,那麼我遇到的麻煩是,然後他們不能爲熱水浴缸輸入任何東西,反之亦然。這是我迄今爲止所擁有的。我是否需要爲此設置2個獨立的字段,或者如何完成?Java按鈕問題

非常多的字符串errors =「」;可以刪除,一旦我找出如何只讓他們輸入一組數字。這裏是計算部分,代碼的另一部分只是3個標籤。

pricePanel = new JPanel(new FlowLayout()); 

     final JRadioButton poolPrice= new JRadioButton("Pool"); 
     final JRadioButton tubPrice = new JRadioButton("Hot Tub"); 

     poolPrice.setSelected(true); 

     ButtonGroup group = new ButtonGroup(); 
     group.add(poolPrice); 
     group.add(tubPrice); 

     pricePanel.add(poolPrice); 
     pricePanel.add(tubPrice); 

     pricePanel.add(new JLabel("Enter the pool's volume: ")); 
     final JTextField poolField = new JTextField(10); 
     pricePanel.add(poolField); 

     pricePanel.add(new JLabel("Enter the tub's volume: ")); 
     final JTextField tubField = new JTextField(10); 
     pricePanel.add(tubField); 


     JButton calculatePrice = new JButton("Calculate Price"); 
     calculatePrice.setMnemonic('C'); 
     pricePanel.add(calculatePrice); 
     pricePanel.add(createExitButton()); 

     pricePanel.add(new JLabel("The price is:$ ")); 
     final JTextField priceField = new JTextField(10); 
     priceField.setEditable(false); 
     pricePanel.add(priceField); 


     calculatePrice.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 

        double pool = Double.parseDouble (poolField.getText()); 
        double tub = Double.parseDouble(tubField.getText()); 

        double price; 
        if (poolPrice.isSelected()) { 
         price = pool * 100; 
        } else { 
         price = tub * 75; 
        } 
        priceField.setText(df.format(price)); 
       } 
     }); 
    }; 


     ActionListener priceListener = new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       if (e.getSource() == poolPrice) { 
        tubLabel.setEnabled(false); 
        tubField.setEnabled(false); 
        messageArea.setVisible(true); 
       } else if (e.getSource() == tubPrice) { 
        poolLabel.setEnabled(false); 
        poolField.setEnabled(false); 
        messageArea.setVisible(true); 
       } 
      } 
     }; 


     poolPrice.addActionListener(priceListener); 
     tubPrice.addActionListener(priceListener); 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~

hotTubsPanel = new JPanel(new FlowLayout()); 

    final JRadioButton roundTub = new JRadioButton("Round Tub"); 
    final JRadioButton ovalTub = new JRadioButton("Oval Tub"); 

    roundTub.setSelected(true); 

    ButtonGroup group = new ButtonGroup(); 
    group.add(roundTub); 
    group.add(ovalTub); 

    hotTubsPanel.add(roundTub); 
    hotTubsPanel.add(ovalTub); 

    hotTubsPanel.add(new JLabel("Enter the tub's length:  ")); 
    final JTextField lengthField = new JTextField(10); 
    hotTubsPanel.add(lengthField); 

    final JLabel widthLabel = new JLabel("Enter the tub's width*: "); 
    widthLabel.setEnabled(false); 
    hotTubsPanel.add(widthLabel); 

    final JTextField widthField = new JTextField(10); 
    widthField.setEnabled(false); 
    hotTubsPanel.add(widthField); 

    hotTubsPanel.add(new JLabel("Enter the tub's depth: ")); 
    final JTextField depthField = new JTextField(10); 
    hotTubsPanel.add(depthField); 

    JButton calculateVolume = new JButton("Calculate Volume"); 
    calculateVolume.setMnemonic('C'); 
    hotTubsPanel.add(calculateVolume); 
    hotTubsPanel.add(createExitButton()); 

    hotTubsPanel.add(new JLabel("The tub's volume is: ")); 
    final JTextField volumeField = new JTextField(10); 
    volumeField.setEditable(false); 
    hotTubsPanel.add(volumeField); 

    final JTextArea messageArea = createMessageArea(1, 25, 
      "*Width will be set to the same value as length"); 
    hotTubsPanel.add(messageArea); 

    calculateVolume.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      if (roundTub.isSelected()) { 
       widthField.setText(lengthField.getText()); 
      } 

      ValidationResult result = validateFields(new JTextField[] { 
        lengthField, widthField, depthField }); 

      String errors = ""; 
      if (result.filled != 3) { 
       errors += "Please fill out all fields! "; 
      } 
      if (result.valid != 3 && result.filled != result.valid) { 
       errors += "Please enter valid numbers!"; 
      } 

      if (errors != "") { 
       messageArea.setText(errors); 
       messageArea.setVisible(true); 
      } else { 
       messageArea.setVisible(false); 

       double length = Double.parseDouble(lengthField.getText()); 
       double width = Double.parseDouble(widthField.getText()); 
       double depth = Double.parseDouble(depthField.getText()); 

       double volume; 
       if (roundTub.isSelected()) { 
        volume = Math.PI * Math.pow(length/2.0, 2) * depth; 
       } else { 
        volume = Math.PI * Math.pow(length * width, 2) * depth; 
       } 
       volumeField.setText(df.format(volume)); 
      } 
     } 
    }); 

    ActionListener tubsListener = new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      if (e.getSource() == roundTub) { 
       widthLabel.setEnabled(false); 
       widthField.setEnabled(false); 
       widthField.setText(lengthField.getText()); 
       messageArea.setText("Tub's width set to length"); 
       messageArea.setVisible(true); 
      } else if (e.getSource() == ovalTub) { 
       widthLabel.setEnabled(true); 
       widthField.setEnabled(true); 
       messageArea.setVisible(false); 
      } 
     } 
    }; 
    roundTub.addActionListener(tubsListener); 
    ovalTub.addActionListener(tubsListener); 
} 
+1

也許你可能只有一個文本字段,然後有單選按鈕,以便用戶可以選擇他們想要什麼樣的產品價格(如果我正確理解你的問題,這有點令人困惑)。 – Stian 2010-08-15 19:46:36

+0

只有一個輸入的原因是他們可以選擇熱水池價格或池價格,並且這兩個域都只有一個輸出框。我可以有一個池場價格和一個熱水池價格場,但我認爲只有一個場所會更有效率。我可以做他們選擇游泳池或熱水浴缸的單選按鈕,我沒有想到。 – David 2010-08-15 19:58:38

回答

2

兩個文本字段,只有一個結果字段可能會讓用戶感到困惑。如果只有一個結果字段,那麼只應該有一個文本字段。 Stian建議的單選按鈕可以工作,或者甚至有兩個按鈕,一個用於游泳池,一個用於熱水浴缸(這隻需要一次點擊即可獲得其他價格)。您還應該在結果字段中顯示某項已計算的內容,如「池價格:$ XX.XX」或「熱銷價格:$ XX.XX」。如果您按下按鈕的想法並標記按鈕「Pool」和「Hot Tub」,您甚至可以對結果進行一些處理,例如setText(e.getActionCommand()+" price:"+price);

另外,if (errors != "")總是會是true。您正在測試您的errors對象是否與您正在創建的新對象相同;它永遠不會。您應該測試if (!errors.equals(""))if (errors.length()!=0)

+0

好的,所以我編輯程序以使用單選按鈕設置,但由於某種原因,我在最後得到這個錯誤: poolPrice.addActionListener(priceListener); tubPrice.addActionListener(priceListener); 令牌「priceListener」上的語法錯誤,此令牌之後預期爲VariableDeclaratorId ... 但是,這個設置是我用於其他方法的工作很好,所以我感到困惑。 – David 2010-08-16 02:45:09

+0

當您聲明參數的類型(在方法定義中)而不是其名稱時,通常會發生該錯誤。我在這裏看不到發生這種情況,老實說我也有點困惑。你可以發佈一些你的代碼,以便我可以看到上下文嗎? – qmega 2010-08-16 03:04:24

+0

這幾乎是整個代碼,它是一個節,一個更好的理解,一個程序的選項卡。我可以發佈該程序的另一個選項卡,但它不應該對此有任何重要性。 – David 2010-08-16 03:06:37