我有三节课。
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;
}
}
valueException.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类的唯一类,我不确定确切的代码投入。
我已经评论了我遇到问题的问题,我把这些评论放在我认为可以解决的地方。
答案 0 :(得分:1)
您有一个视图(Input
)和一个模型(Computation
)。您需要Controller
坐在两者之间,并知道如何处理下一步该做什么。这将完成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); }
}
答案 1 :(得分:1)
我认为你感到困惑的原因是因为,你不确定如何在类之间传递值。 既然你说你开始学习编程(感谢你)。但是你已经抓住每一个机会学习和探索新事物,但不要过多,因为这可能会使你偏离目标。那么你可以为你做些什么 问题1: 您可以将消息从异常类中继回计算类,然后再次中继回输入类
问题2: 一个简单的休息;将断开语句并将控制返回到此循环的代码的原始点,或者在您的情况下将其调用的类。
我假设您知道如何编写其余的代码。