0

私は3つのクラスを持っています。

Input.java (これは gui クラスです) このクラスは、テキストフィールドを介して 3 つの値を受け取り、イベントをトリガーするボタンと、値の結果 (double 値) を表示するラベルを最後に持ちます。

package javalearning;

import javax.swing.JOptionPane;


public class Input extends javax.swing.JFrame {

    /**
     * Creates new form Input
     */
    public Input() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        result_lbl = new javax.swing.JLabel();
        value1 = new javax.swing.JTextField();
        value2 = new javax.swing.JTextField();
        value3 = new javax.swing.JTextField();
        btn1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        result_lbl.setText("jLabel1");

        btn1.setText("jButton1");
        btn1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(99, 99, 99)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(btn1)
                    .addComponent(result_lbl)
                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                        .addComponent(value1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 61, Short.MAX_VALUE)
                        .addComponent(value2, javax.swing.GroupLayout.Alignment.TRAILING)
                        .addComponent(value3, javax.swing.GroupLayout.Alignment.TRAILING)))
                .addContainerGap(100, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                .addGap(44, 44, 44)
                .addComponent(value1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(value2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(value3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btn1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(result_lbl)
                .addGap(23, 23, 23))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(15, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    private void btn1ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
         JOptionPane.showMessageDialog(null, "hello");
         Computation actual_triangle = new Computation(Double.parseDouble(value1.getText()),Double.parseDouble(value2.getText()),Double.parseDouble(value3.getText()));

    }

    public static void main(String args[]) {

        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /*
         * If Nimbus (introduced in Java SE 6) is not available, stay with the
         * default look and feel. For details see
         * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Input.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Input.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Input.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Input.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /*
         * Create and display the form
         */
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Input().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JButton btn1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JLabel result_lbl;
    private javax.swing.JTextField value1;
    private javax.swing.JTextField value2;
    private javax.swing.JTextField value3;
    // End of variables declaration
}

Computation.java これは、結果を生成するためにすべての値が計算される場所です。

package javalearning;
public class Computation {

    private double side_a, side_b, side_c,result;


   public Computation(double side_a, double side_b, double side_c)
   {
       this.side_a = side_a;
       this.side_b = side_b;
       this.side_c = side_c;
      valueException ive = new valueException();
      //here if there is a message being sent from the valueException method then the message have to be relayed back to the Input.result_lbl.setText()
      ive.checkvalidation(side_a, side_b, side_c);

   }

   public double getsSide_A()
   {
       return side_a;
   }

   public void setsSide_A(double side_a)
   {
       this.side_a = side_a;
   }

   public double getsSide_B()
   {
       return side_b;
   }

   public void setsSide_B(double side_b)
   {
       this.side_b = side_b;
   }

   public double getsSide_C()
   {
       return side_c;
   }

   public void setsSide_C(double side_c)
   {
       this.side_c = side_c;
   }

   public double calculateArea()
    {
        result = Math.sqrt(side_a*side_b*side_c);
        return result;
    }

}

valueException.java

これは、ユーザー入力に応じてあらゆる種類のエラーを出力するクラスです。例 1: ユーザーが 1 つまたはすべてのテキスト フィールドに文字列を入力すると、メッセージがラベル クラスに返されます。しかし、これはひねりです。このクラスは、 Input.javaからではなく、Computation.javaから呼び出す必要があります。

package javalearning;
public class valueException {

    String message;
    double a_side, b_side,c_side,result;


    public String checkvalidation(double a_side, double b_side, double c_side)
    {
        if((a_side + b_side > c_side)||(a_side + c_side > b_side)||(c_side + b_side > a_side))
        {

           //NOTHING TO DO JUST PROCEED BACK TO COMPUTATION and go the Computation.calculatearea() method

        }

        else
        {
            message = "The values you entered cannot form a shape";
        }
      return message;  
    }

}

問題 1: メッセージを valueException クラスから Computation クラスに戻し、そこから Input クラスにリレーする方法がわかりません。

問題 2: Input.java に入力された値に問題がない場合は、プロセスを Computation クラスに戻して残りのプログラムを実行します。これは valueException クラスを呼び出している唯一のクラスであるため、よくわかりません。入れる正確なコード。

私は問題に直面している問題についてコメントしました。

4

2 に答える 2

1

ビュー ( Input) とモデル ( Computation) があります。Controllerこの2 つの間に座って、次に何をすべきかを伝えるために何をすべきかを知る必要があります。これで MVC パターンが完成します。

は、 からのControllerイベントを受け入れView、入力値を検証してパッケージ化し、サービスとModelオブジェクトをマーシャリングしてユース ケースを満たし、ユース ケースViewの結果に基づいて次に何をすべきかを決定します。

サービス指向のアーキテクチャについて考えてみましょう。これは、コントローラがユースケースを満たすために呼び出すことができるインターフェースベースのサービスです。コントローラーは特定のビューに密接に結びついている傾向があるため、コントローラーではなくサービスにユースケースをカプセル化するのが最善だと思います。Web ベースの View を使用することに決めた場合は、サービスなしで最初からやり直す必要がありますが、それらがあれば、新しい Web (またはモバイルまたはタブレット) コントローラーは単にサービス レイヤーにアクセスしてハミングし続けることができます。 .

アップデート:

さて、「シンプル」に対するあなたの抗議を読んだ後、私がお勧めするものは次のとおりです. 問題はあなたの例外クラスだと思います。バリデータクラスであるかのように記述しました。私が推奨しているコントローラーがその仕事をし、無効な状況を見つけた場合にのみ、その例外をスローする必要があると思います。

package controller;

// Making the Controller the ActionListener is the key.  Take it away from the View.
public class ShapeController implements ActionListener {
    private Input inputView;

    public Controller() {
        this.inputView = new Input();
        this.addActionListener(this);  // Make the Controller respond to action events from the View.
    }

    public void actionPerformed(ActionEvent e) {
        double a_side, b_side, c_side;
        // Get the input values from the input view
        if((a_side + b_side > c_side)||(a_side + c_side > b_side)||(c_side + b_side > a_side)) {
            Computation comp = new Computation()
           // perform your calculation; all is well    
        } else {
            // Problem; throw an exception
            throw new InvalidShapeException();
        }
        // figure out where to go next
    }
}

あなたの value_exception クラスが間違っていると思います。上で示したように使用し、次のように記述します。

package controller;

public class InvalidShapeException extends RuntimeException {
    // Add whatever you want for messages and details.
    public InvalidShapeException() { super(); }
    public InvalidShapeException(String s) { super(s); }
    public InvalidShapeException(Throwable t) { super(t); }
    public InvalidShapeExceptionI(String s, Throwable t) { super(s, t); }
}
于 2012-09-30T15:24:04.253 に答える
1

あなたが混乱している理由は、クラス間で値を渡す方法がわからないからだと思います。あなたはプログラミングを学び始めていると言っているので(感謝しています)。しかし、あなたはあらゆる機会を利用して新しいことを学び、探求してきましたが、目的から逸脱する可能性があるため、あまり多くはありません。問題 1 に対してできること: 例外クラスから計算クラスにメッセージを中継してから、再び入力クラスに中継することができます。

問題 2: 簡単な休憩。ステートメントを中断し、このループ/またはあなたの場合はそれが呼び出されたクラスのコードの元のポイントに制御を戻します。

残りのコーディング方法を知っていると思います。

于 2012-10-01T01:12:33.820 に答える