2

Javaでの年齢計算プログラムに問題があります。生年月日、生年月日、生年月日の値を事前設定すると正常に機能しますが、ユーザーに自分の生年月日をテキストフィールドに入力させてからそれらの値を操作しようとすると、行き止まりになります。Yahoo Answersで聞いてみたところ、「getActionCommand()の戻り値は文字列で、結果はJLabelです。比較できますか?」というヒントが得られました。そのヒントをどうすればいいのか正確にはわかりません。

これが私が持っているものと、「ユーザー入力」のアイデア全体を実装しようとした方法です。私のコーディングは乱雑で非効率的だと確信しているので、それを我慢してください。助けていただければ幸いです!

   //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
    }
}
4

3 に答える 3

3

高速治癒:

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

時間があれば、20 の改善点を投稿できます。

  1. フレームを伸ばして、
  2. impl。ActionListenerですが、AgeCalculatorにはJFrame(AWTであるFrameよりもSwingContextの方が優れています)があり、使用される別のActionlistenerがあります。
  3. 宣言を削除し、最後にオーバーライド メソッドを削除します。
    public class AgeCalculator // Frame を拡張し、ActionListener を実装します 

ビジュアル コンポーネントとその他の属性のブロックが続きます。後の属性は静的です。これにより、同じ JVM で 2 つの AgeCalculator を使用することが禁止されます。それは確かに意図による制限ではありません。

  1. コンパイラをシャットダウンするために静的なものを作成しないでください。
  2. 公開するかどうか確信が持てない場合は、すべてを非公開にします。
  3. 可能であれば、属性を避けてください。
  4. いつラベルをレタッチしますか?
    JButton が等しい。
    JTextField 年、月、日。
    JLabel の結果、...

    ...
    static int 誕生;
    static int currentyr = 2012;
  1. 必要に応じて簡易加算を使用します。

    daysaliveyr += 366;
    
  2. 月の日数を計算するには、生年月日と生年月日をパラメーターとして渡します。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-Method では、使用されないインスタンス「gui」を作成します。必要なのはこれだけです:

    public static void main (String [] args) { 新しい AgeCalculator (); }

  8. ギー、ところで。その名前のメソッドが既にある場合は、悪い名前です。

  9. このメソッドは使用されないため、全体を ctor に移動するだけです。
  10. 年/月/日は ActionListener を必要としません。
  11. 他のレイアウトの方がはるかに適しています。
  12. あなたのプログラムを機能させるには、もう 1 つのカレンダーの改革が必要です。
  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 ();
    }
}
于 2012-04-13T01:40:02.527 に答える
0

ボタンを使用して計算を開始しているため、そのボタンにのみアクションリスナーを登録します。アクション実行メソッドの内部で、年齢を日数で読み取り、解析し、計算します。

于 2012-04-13T00:49:38.333 に答える
0

やりたいと思いますequal.addMouseListener(e)。もちろん、Calcを実装するには変更する必要がありますMouseListenermouseClicked(MouseEvent)おそらく、実際にメソッドを作成するだけで済みます。他のすべては、あなたが求めているものよりも具体的なもののためのものです。

これは、ボタンのクリックイベントに応答します。他のリスナーは必要ないと思います。もしそうなら、それらはまたはKeyListeners以外のものでなければなりませんActionListeners

intちなみに、インデントがオフになっているためわかりにくいですが、フィールドがオフになっている理由はわかりませんstatic。それはおそらく不要だと思います。

于 2012-04-13T00:39:20.770 に答える