2012-04-13 3 views
2

У меня возникли проблемы с моей программой расчета возраста на Java. Он отлично работает, когда я устанавливаю дату рождения, месяц рождения и дату рождения, но когда я пытаюсь ввести пользователя в свой текстовый поле, а затем попытаться работать с этими значениями, я просто дойду до тупика. Я попробовал просить Yahoo Answers, и подсказка, которую я получил, - «Возвращаемое значение getActionCommand() - это строка, в то время как результат - JLabel. Можете ли вы их сравнить?» Я не совсем уверен, что делать с этим намеком.Реализация ActionListener в следующем коде Внутри

Вот что у меня есть и как я попытался реализовать всю идею «пользовательского ввода». Я почти уверен, что мое кодирование грязное и неэффективное, так что, пожалуйста, воздержитесь. Буду признателен за любую помощь!

//Date: April 11, 2012 
    //Description: Calculates the age in terms of days depending on your birthdate. 
    import javax.swing.*; 
    import java.awt.*; 
    import java.awt.event.*; 

    public class AgeCalculator extends Frame implements ActionListener { 

JButton equal; 
JTextField year, month, day; 
JLabel result, first, second, third; 
JFrame frame; 
JPanel panel; 

static int totaldaysalive; 
static int daysaliveyr; 
static int daysalivem; 
static int birthyr; 
static int birthm; 
static int birthd; 
static int currentyr = 2012; 


public AgeCalculator(){ 
    gui(); 
} 

public void gui(){ 
    frame = new JFrame ("Age Calculator"); 
    panel = new JPanel(new GridBagLayout()); 
    panel.setBackground(Color.LIGHT_GRAY); 
    GridBagConstraints x = new GridBagConstraints(); 

    equal = new JButton ("Get Result"); 

    x.insets = new Insets(3,0,3,0); 

    first = new JLabel("Year "); 
    x.gridx = 0; 
    x.gridx = 0; 
    panel.add(first, x); 

    year = new JTextField(10); 
    x.gridx = 5; 
    x.gridy = 0; 
    x.gridwidth = 3; 
    panel.add(year, x); 

    second = new JLabel ("Month "); 
    x.gridx = 0; 
    x.gridy = 1; 
    panel.add(second,x); 

    month = new JTextField(10); 
    x.gridx = 5; 
    x.gridy = 1; 
    x.gridwidth = 3; 
    panel.add(month,x); 

    third = new JLabel ("Day  "); 
    x.gridx = 0; 
    x.gridy = 2; 
    panel.add(third,x); 

    day = new JTextField(10); 
    x.gridx = 5; 
    x.gridy = 2; 
    x.gridwidth = 3; 
    panel.add(day,x); 

    x.gridx = 6; 
    x.gridy = 3; 
    panel.add(equal,x); 

    result = new JLabel (""); 
    x.gridx = 5; 
    x.gridy = 5; 
    panel.add(result,x); 

    frame.add(panel); 
    frame.setVisible(true); 
    frame.setSize(350, 350); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    Calc e = new Calc(); 

    equal.addActionListener(e); 
    year.addActionListener(e); 
    month.addActionListener(e); 
    day.addActionListener(e); 
} 

class Calc implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     try { 
      birthyr = Integer.parseInt(year.getText()); 

     } catch (NumberFormatException a) { 
      result.setText("Illegal data for first field."); 
      result.setForeground(Color.red); 
      return; 
     } 

     try { 

      birthm = Integer.parseInt(month.getText()); 

     } catch (NumberFormatException a) { 

      result.setText("Illegal data for second field."); 
      result.setForeground(Color.red); 
      return; 
     } 
     try { 

      birthd = Integer.parseInt(day.getText()); 

     } catch (NumberFormatException a) { 

      result.setText("Illegal data for third field."); 
      result.setForeground(Color.red); 
      return; 
     } 

     if (e.getActionCommand().equals (equal)){ 

      totaldaysalive = ageCalcYr() + ageCalcM() + birthd; 
      result.setText(Integer.toString(totaldaysalive)); 
     } 
    } 

    public int ageCalcYr(){ 
     for (int i = birthyr; i <= currentyr; i++){ 
      if ((i % 4 == 0) && (!(i % 100 == 0) || (i % 400 == 0))){ 
       daysaliveyr = daysaliveyr + 366; 
      } 
      else { 
       daysaliveyr = daysaliveyr + 365; 
      } 
     } 
     return daysaliveyr; 
    } 
    public int ageCalcM(){ 
     if (birthm == 1){ 
      daysalivem = daysalivem + 0; 
     } 
     else if (birthm == 2){ 
      daysalivem = daysalivem + 30; 
     } 
     else if (birthm == 3){ 
      daysalivem = daysalivem + 60; 
     } 
     else if (birthm == 4){ 
      daysalivem = daysalivem + 90; 
     } 
     else if (birthm == 5){ 
      daysalivem = daysalivem + 120; 
     } 
     else if (birthm == 6){ 
      daysalivem = daysalivem + 150; 
     } 
     else if (birthm == 7){ 
      daysalivem = daysalivem + 180; 
     } 
     else if (birthm == 8){ 
      daysalivem = daysalivem + 210; 
     } 
     else if (birthm == 9){ 
      daysalivem = daysalivem + 240; 
     } 
     else if (birthm == 10){ 
      daysalivem = daysalivem + 270; 
     } 
     else if (birthm == 11){ 
      daysalivem = daysalivem + 300; 
     } 
     else if (birthm == 12){ 
      daysalivem = daysalivem + 330; 
     } 
     return daysalivem; 
    } 
} 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     AgeCalculator gui = new AgeCalculator(); 
    } 
    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     // TODO Auto-generated method stub 
    } 
} 

ответ

0

Я думаю, что вы хотите сделать equal.addMouseListener(e). Конечно, вам нужно будет изменить Calc, чтобы реализовать MouseListener. Вероятно, вам придется только написать метод mouseClicked(MouseEvent). Все остальные для более конкретных вещей, чем то, что вам нужно.

Это ответит на событие click на вашей кнопке. Я не думаю, что ты хочешь других слушателей. Если это так, они должны быть KeyListeners или что-то иное, чем ActionListeners.

На боковой ноте, мне трудно видеть, потому что ваш отступ выключен, но я не могу сказать, почему ваши поля int: static. Я думаю, что это, вероятно, не нужно.

+0

О, черт возьми, извините. Это первый раз, когда я использовал этот сайт, и я действительно даже не уверен, правильно ли вставил код. Я предполагаю, что нет. Во всяком случае, я не совсем уверен, как использовать их, так как мой учитель только научил нас ActionListener ... – Noelle

0

Поскольку вы используете кнопку, чтобы начать вычисление, зарегистрируйте только прослушиватель действий на этой кнопке. Внутри действия выполняется метод чтения, разбора и расчета возраста в днях.

+0

Я думал, что это то, что я уже делал, за исключением регистрации только кнопки в качестве прослушивателя действий. – Noelle

3

Быстрое лечение:

if (e.getActionCommand().equals ("Get Result")) { // equal)) { 
     totaldaysalive = ageCalcYr() + ageCalcM() + birthd; 
     result.setText (Integer.toString (totaldaysalive)); 
    } 

Если у вас есть какое-то время, я могу отправить вам 20 улучшений.

  1. Вы расширяете Рама,
  2. осущ. ActionListener, но между тем AgeCalculator имеет JFrame (который лучше в SwingContext, чем Frame, который является AWT) и имеет отдельный Actionlistener, который используется.
  3. Удалите декларацию и метод переопределения в конце.
 
    public class AgeCalculator // extends Frame implements ActionListener 

Там следует блок визуальных компонентов и других атрибутов, более поздние статичны - запрещающей использование 2 AgeCalculators на одной и той же виртуальной машины Java. Это, конечно, не ограничение по намерениям.

  1. Не заставляйте что-то статичное, чтобы заткнуть компилятор.
  2. Сделать все приватным, если вы не уверены, что хотите его разоблачить.
  3. Избегайте атрибутов, где это возможно.
  4. Когда вы будете ретушировать ярлык?
 
    JButton equal; 
    JTextField year, month, day; 
    JLabel result, ... 

    ... 
    static int birthd; 
    static int currentyr = 2012; 
  1. Использование упрощена добавление в случае необходимости:

    daysaliveyr += 366; 
    
  2. известково дни в течение месяца, передать birthyr и birthm в качестве параметра: INT totaldaysalive = ageCalcYr (birthyr) + ageCalcM (рождаемость) + рождение; result.setText (Integer.toString (totaldaysalive));

  3. Живое время переменной totaldaysalive может быть уменьшено до 2 строк - очень малая область поиска ошибки, если таковая имеется.

    public int ageCalcM (int birthm) { 
        int daysalivem = 0;  
        if (birthm == 2) { 
         daysalivem += 30; 
        } 
        else if (birthm == 3) { 
         daysalivem += 60; 
        } 
    
  4. В текущем состоянии ageCalcM является проводником. Иначе вы могли бы просто сказать daysalivem = (birthm - 1) * 30;

  5. Шортера код:

    public int ageCalcM (int birthm) { 
        if (birthm == 2) { 
         return 30; 
        } 
        else if (birthm == 3) { 
         return 60; 
        } 
    
  6. Однако, такие массовые манипуляции в глупое повторение может быть решена с помощью простого массива:

    public int ageCalcM (int birthm) { 
        int[] mdays = {0, 30, 60, 90, ...}; 
        return mdays [birthm]; 
    } 
    
  7. В Main- Вы создаете экземпляр «gui», который никогда не используется. Это все, что вам нужно:

    public static void main (String [] args) { новый AgeCalculator(); }

  8. Gui, btw. это плохое имя, если у вас уже есть метод указанного имени.

  9. Поскольку этот метод никогда не используется, просто переместите все это в ctor.
  10. год/месяц/дата не требуется ActionListener.
  11. Другие макеты намного лучше подходят.
  12. Нам нужна другая реформа календаря, чтобы ваша программа работала.
  13. Ввод не должен быть проверен только как int, но действительный месяц и т. Д.
  14. Фактическая дата не используется.

Что осталось?

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

public class AgeCalculator 
{ 
    JTextField year, month, day; 
    JLabel result; 

    public AgeCalculator() { 
     JFrame frame = new JFrame ("Age Calculator"); 
     JPanel panel = new JPanel (new GridBagLayout()); 
     panel.setBackground (Color.LIGHT_GRAY); 
     GridBagConstraints x = new GridBagConstraints(); 

     JButton equal = new JButton ("Get Result"); 
     x.insets = new Insets (3, 0, 3, 0); 

     JLabel first = new JLabel ("Year "); 
    // two times gridx = 0 here? 
     x.gridx = 0; 
     x.gridx = 0; 
     panel.add (first, x); 

     year = new JTextField (10); 
     x.gridx = 5; 
     x.gridy = 0; 
     x.gridwidth = 3; 
     panel.add (year, x); 

     JLabel second = new JLabel ("Month "); 
     x.gridx = 0; 
     x.gridy = 1; 
     panel.add (second, x); 

     month = new JTextField (10); 
     x.gridx = 5; 
     x.gridy = 1; 
     x.gridwidth = 3; 
     panel.add (month, x); 

     JLabel third = new JLabel ("Day  "); 
     x.gridx = 0; 
     x.gridy = 2; 
     panel.add (third, x); 

     day = new JTextField (10); 
     x.gridx = 5; 
     x.gridy = 2; 
     x.gridwidth = 3; 
     panel.add (day, x); 

     x.gridx = 6; 
     x.gridy = 3; 
     panel.add (equal, x); 

     result = new JLabel (""); 
     x.gridx = 5; 
     x.gridy = 5; 
     panel.add (result, x); 

     frame.add (panel); 
     frame.setVisible (true); 
     frame.setSize (350, 350); 
     frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 

     Calc e = new Calc(); 

     equal.addActionListener (e); 
    } 

    class Calc implements ActionListener { 
     public void actionPerformed (ActionEvent e) { 
      int birthyr; 
      int birthm; 
      int birthd; 

      try { 
       birthyr = Integer.parseInt (year.getText()); 
      } catch (NumberFormatException a) { 
       result.setText ("Illegal data for first field."); 
       result.setForeground (Color.red); 
       return; 
      } 
      try { 
       birthm = Integer.parseInt (month.getText()); 
      } catch (NumberFormatException a) { 
       result.setText ("Illegal data for second field."); 
       result.setForeground (Color.red); 
       return; 
      } 
      try { 
       birthd = Integer.parseInt (day.getText()); 
      } catch (NumberFormatException a) { 
       result.setText ("Illegal data for third field."); 
       result.setForeground (Color.red); 
       return; 
      } 
      if (e.getActionCommand().equals ("Get Result")) { // equal)) { 
       int totaldaysalive = ageCalcYr (birthyr) + ageCalcM (birthm) + birthd; 
       result.setText (Integer.toString (totaldaysalive)); 
      } 
     } 

     public int ageCalcYr (int birthyr) { 
      int currentyr = 2012; 
      int daysaliveyr = 0; 
      for (int i = birthyr; i <= currentyr; i++) { 
       if ((i % 4 == 0) && (! (i % 100 == 0) || (i % 400 == 0))) { 
        daysaliveyr += 366; 
       } 
       else { 
        daysaliveyr += 365; 
       } 
      } 
      return daysaliveyr; 
     } 

     public int ageCalcM (int birthm) { 
      int[] mdays = {0, 30, 60, 90, 120}; 
      return mdays [birthm]; 
     } 
    } 

    public static void main (String [] args) { 
     new AgeCalculator(); 
    } 
} 
+0

У меня есть много времени, чтобы исправить мой код, если вы захотите помочь мне в этом. Я был бы очень благодарен! Однако ... быстрое решение, которое вы предложили, не помогло мне. Вы проверили это? Редактировать: я на самом деле думаю, что что-то не так с result.setText под моим getActionCommand(). Равно. Когда я заменяю его обычной строкой, например asdkjfsd или чем-то еще, она пока не отображается, что нечетно, если я не ошибаюсь. – Noelle

+0

@Noelle: Прежде всего, поставьте 'System.out.println ("debug"); 'в actionListener, чтобы гарантировать, что он вызывается. Я скомпилировал после первоначального изменения, и он сработал. После выполнения 20 других изменений он все еще работает (необходимо расширить только массив ageCalcM). –

+0

... whoa. Большое вам спасибо за объяснение! Я очень благодарен. Я попытаюсь прочитать это и понять. Честно говоря, кодирование не совсем подходит ко мне естественным образом, так что это огромная помощь! – Noelle

Смежные вопросы