0

我有三个班。

Input.java(这是 gui 类)该类通过文本字段接收 3 个值,并具有触发事件的按钮,最后是显示值结果的标签(双值)

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;
    }

}

值异常.java

这是根据用户输入输出各种错误的类,例如 1:用户为一个或所有文本字段输入一个字符串,然后一条消息将返回到标签类。但这是一个转折点,这个类必须从Computation.java而不是Input.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介于两者之间的人,并且知道如何告诉下一步该做什么。这将完成 MVC 模式。

Controller接受来自View、验证和打包输入值、编组服务和Model对象的事件以完成用例,并根据用例的结果决定下一步View应该做什么。

考虑一个面向服务的架构:控制器可以调用以实现用例的基于接口的服务。我认为最好将用例封装在服务中而不是控制器中,因为控制器往往与特定视图密切相关。如果您决定使用基于 Web 的视图,则必须在没有服务的情况下从头开始,但如果您拥有它们,新的 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

Well I think the reason you are confused is because, you are not sure how to pass values between classes. Since you say you are starting to learn programming (appreciate you for that). But you have take every opportunity to learn and explore new things, but not too much as this might deviate you from the objective. So what you can do for your problem 1: You can relay back the message from the exception class to computation class then again relay back to the input class

problem 2: a simple break; will break the statement and returns back control to the original point of code where this loop/or in your case the class it is called from.

I am assuming you know how to code the rest.

于 2012-10-01T01:12:33.820 回答