package bean;//import的是加载进去要引用到的Java包,即要调用的方法
import java.util.ArrayList;
import java.util.List;
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class View extends Application{
//调用Application包,下面main主方法块launch的功能要调用
public void start(Stage primaryStage){
Pane Pane = new Pane();//面板
VBox vBox = new VBox(10); //竖框
vBox.setAlignment(Pos.CENTER); //居中
Label topLable = new Label("纵断面化简");//顶端标签
vBox.getChildren().add(topLable); //竖框添加顶端标签
HBox hBox0 = new HBox(30); //横框
Label titleLable1 = new Label("坡度千分数");//数据名称标签
Label titleLable2 = new Label("坡长");
Label titleLable3 = new Label("轨道标高");
Label titleLable4 = new Label("处理方式(化简为同一坡段的选同一数字)");
titleLable1.setPrefWidth(75);titleLable2.setPrefWidth(75); //调整界面格局
titleLable3.setPrefWidth(75);titleLable4.setPrefWidth(300);
hBox0.getChildren().addAll(titleLable1,titleLable2,titleLable3,titleLable4); //横框加title
vBox.getChildren().add(hBox0); //竖框加title横框
for(int i = 0; i<15;i++)//调用静态方法添加15行三个文本域一个组合框的行
addInput(vBox);
Button bt = new Button("化简计算");//触发按钮
vBox.getChildren().add(bt); //添加触发按钮进竖框
TextArea ta = new TextArea();//添加文本区域输出结果
ta.setPrefWidth(200); //调整界面格局
vBox.getChildren().add(ta); //添加输出文本区域进竖框
bt.setOnAction(e -> {//写按钮作用
// 创建一个list集合存放坡段对象
List<Section> list1 = new ArrayList<>();
// 定义一个集合用来存放处理方式
List<String> list2 = new ArrayList<>();
// 定义一个数组用来存放每行获取的输入数据
double[] d = new double[3];
for (int v = 0; v < 15; v++) {
HBox indexHbox = new HBox();// 获取整个框对象
indexHbox = (HBox) vBox.getChildren().get(v);// 获取第一行输入框的数据
for (int h = 0; h < 3; h++) {
TextField t = new TextField();// 获取输入框对象
t = (TextField) indexHbox.getChildren().get(h); // 获取该输入框的数据
ouble i = Double.parseDouble(t.getText());// 将数据转化为double类型
d[h] = i;// 放入数组中
}
// 创建一个坡段对象
Section section = new Section(d[0], d[1], d[2]);// 取出数组中的数据作为参数构造section对象
// 将section加入list
list1.add(section);// 将section对象加入list1
// 获取处理方式的参数
ComboBox<String> c = new ComboBox<>();// 获取下拉框对象
c = (ComboBox<String>) indexHbox.getChildren().get(3);// 得到该行下拉框的值
list2.add(c.getValue());// 将值存到list2
}
//定义几个集合分别用来放同一化简的坡段
List<Object> list3 = new ArrayList<>();
List<Object> list4 = new ArrayList<>();
List<Object> list5 = new ArrayList<>();
List<Object> list6 = new ArrayList<>();
List<Object> list7 = new ArrayList<>();
List<Object> list8 = new ArrayList<>();
List<Object> list9 = new ArrayList<>();
for(int j=0;j<15;j++){
switch(list2.get(j)){
case "不进行化简"://如果下拉框选的是"不进行化简"则不进行处理
break;
case "1":
list3.add(list1.get(j));//如果下拉框选的是"1"则添加到list3
break;
case "2":
list4.add(list1.get(j));//如果下拉框选的是"2"则添加到list4
break;
case "3":
list5.add(list1.get(j));//如果下拉框选的是"3"则添加到list5
break;
case "4":
list6.add(list1.get(j));//如果下拉框选的是"4"则添加到list6
break;
case "5":
list7.add(list1.get(j));//如果下拉框选的是"5"则添加到list7
case "6":
list8.add(list1.get(j));//如果下拉框选的是"6"则添加到list8
break;
case "7":
list9.add(list1.get(j));//如果下拉框选的是"7"则添加到list9
break;
default:break;
}
}
//要化简为同一坡段的几个坡段进行化简
Calculate calculate = new Calculate();//创建计算对象
double i_h1 = calculate.getI_h(list3);//调用计算坡度千分数的方法
double sumL1 = calculate.getsumL(list3);//调用计算总坡长的方法
double i_h2 = calculate.getI_h(list3);
double sumL2 = calculate.getsumL(list3);
double i_h3 = calculate.getI_h(list3);
double sumL3 = calculate.getsumL(list3);
double i_h4 = calculate.getI_h(list3);
double sumL4 = calculate.getsumL(list3);
double i_h5 = calculate.getI_h(list3);
double sumL5 = calculate.getsumL(list3);
//结果输出
ta.appendText("1的化简结果:坡度千分数:"+i_h1+"\t坡长为:"+sumL1+"\n");
ta.appendText("2的化简结果:坡度千分数:"+i_h2+"\t坡长为:"+sumL2+"\n");
ta.appendText("3的化简结果:坡度千分数:"+i_h3+"\t坡长为:"+sumL3+"\n");
ta.appendText("4的化简结果:坡度千分数:"+i_h4+"\t坡长为:"+sumL4+"\n");
ta.appendText("5的化简结果:坡度千分数:"+i_h5+"\t坡长为:"+sumL5+"\n");
});
Pane.getChildren().add(vBox); //面板添加竖框
Scene scene = new Scene(Pane); //场景添加面板
primaryStage.setScene(scene); //界面添加场景
primaryStage.setTitle("纵断面化简");//界面命标题
primaryStage.show();//启动界面
}
public static void addInput(VBox vBox){//静态方法添加一行三个文本域和一个组合框
HBox hBox1 = new HBox(30);
TextField tf1_1 = new TextField();
TextField tf1_2 = new TextField();
TextField tf1_3 = new TextField();
tf1_1.setPrefWidth(75);tf1_2.setPrefWidth(75);tf1_3.setPrefWidth(75);
ComboBox<String> cbo1 = new ComboBox<>();
cbo1.getItems().addAll("不进行化简","1","2","3","4","5","6","7");//给拉选框添加选项
hBox1.getChildren().addAll(tf1_1,tf1_2,tf1_3,cbo1);
vBox.getChildren().add(hBox1);
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
launch(args);//启动界面类
}
}
//坡段类
package bean;
public class Section {
//定义一个坡段类,用于实例化线路上的断面
private double i; //坡度千分数
private double l; //坡长
private double h; //轨道标高
public double getH() {
return h;
}
public void setH(double h) {
this.h = h;
}
public Section(double i,double l,double h){
//坡段构造方法
super();
this.i = i;
this.l = l;
this.h = h;
}
public double getI() {
return i;
}
public void setI(double i) {
this.i = i;
}
public double getL() {
return l;
}
public void setL(double l) {
this.l = l;
}
@Override
public String toString() {
return "Section [i=" + i + ", l=" + l + ", h=" + h + "]";
}
}
//计算类
package bean;
import java.util.ArrayList;
import java.util.List;
public class Calculate {
// 计算化简坡道千分数
public double getI_h(List list1) {
// 得到终点标高h2,始点标高h1
Section lastS = (Section) list1.get(list1.size() - 1);
double h2 = lastS.getH();
Section firstS = (Section) list1.get(0);
double h1 = firstS.getH();
// 获得坡长
double sumL = getsumL(list1);
double I_h = 1000 * (h2 - h1) / sumL;
return I_h;
}
// 计算总坡长
public double getsumL(List list1) {
// 获得坡长
double sumL = 0;
Section s = null;
for (int i = 0; i < list1.size(); i++) {
s = (Section) list1.get(i);
sumL += s.getL();
}
s = (Section)list1.get(0);
return sumL-s.getL();
}
}