代码如下:
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.text.AttributeSet.ColorAttribute;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.*;
public class jframe_tcid50
{
String s;
public static void main(String[] agrs)
{
JFrame jFrame=new JFrame("TCID50计算器 6.0.1 Java版"); //创建Frame窗口
ImageIcon imageIcon=new ImageIcon("./image/1.png");
jFrame.setIconImage(imageIcon.getImage());
//jFrame.getContentPane().setBackground(Color.red);
// jFrame.setBackground(Color.GREEN);
JPanel jPanel=new JPanel(); //创建面板
JPanel jpanel2 = new JPanel(new FlowLayout());
// Color c = new Color(240,240,251);
// jPanel.setBackground(c);
// 1:设置字段
Font fon =new Font("等线",Font.PLAIN, 20);
// 2:创建一个标签
JLabel labone= new JLabel("输入各稀释倍数的病变孔数(正整数)(从低稀释倍数开始) ");
// 3:设置它的字体
labone.setFont(fon);
// 4:设置标签的大小
labone.setBounds(0,0,200,60);
// 5:设置标签字体的颜色
Color la1 = new Color(50,50,50);
labone.setForeground(la1);
JTextField jt1 = new JTextField();
jt1.setColumns(4);
jt1.setText("8");
jt1.setFont(new Font("黑体",Font.PLAIN,20));
// jt1.setBackground(c);
jt1.setHorizontalAlignment(JTextField.CENTER);
JTextField jt2 = new JTextField();
jt2.setColumns(4);
jt2.setText("8");
jt2.setFont(new Font("黑体",Font.PLAIN,20));
JTextField jt3 = new JTextField();
jt3.setColumns(4);
jt3.setText("8");
jt3.setFont(new Font("黑体",Font.PLAIN,20));
JTextField jt4 = new JTextField();
jt4.setColumns(4);
jt4.setText("7");
jt4.setFont(new Font("黑体",Font.PLAIN,20));
JTextField jt5 = new JTextField();
jt5.setColumns(4);
jt5.setText("3");
jt5.setFont(new Font("黑体",Font.PLAIN,20));
JTextField jt6 = new JTextField();
jt6.setColumns(4);
jt6.setText("1");
jt6.setFont(new Font("黑体",Font.PLAIN,20));
JTextField jt7 = new JTextField();
jt7.setColumns(4);
jt7.setText("0");
jt7.setFont(new Font("黑体",Font.PLAIN,20));
JTextField jt8 = new JTextField();
jt8.setColumns(4);
jt8.setText("0");
jt8.setFont(new Font("黑体",Font.PLAIN,20));
jt1.setHorizontalAlignment(JTextField.CENTER);
jt2.setHorizontalAlignment(JTextField.CENTER);
jt3.setHorizontalAlignment(JTextField.CENTER);
jt4.setHorizontalAlignment(JTextField.CENTER);
jt5.setHorizontalAlignment(JTextField.CENTER);
jt6.setHorizontalAlignment(JTextField.CENTER);
jt7.setHorizontalAlignment(JTextField.CENTER);
jt8.setHorizontalAlignment(JTextField.CENTER);
jPanel.add(labone); //添加Lable控件
jPanel.add(jt1);
jPanel.add(jt2);
jPanel.add(jt3);
jPanel.add(jt4);
jPanel.add(jt5);
jPanel.add(jt6);
jPanel.add(jt7);
jPanel.add(jt8);
// JButton btn1=new JButton("TCID50的值为:10 ^ (?) / mL"); //创建按钮
Font fon2 =new Font("等线",Font.BOLD, 18);
JLabel lab2= new JLabel("TCID50的值为:10 ^ (?) / mL");
lab2.setFont(fon2);
lab2.setBounds(0,0,200,60);
Color la2 = new Color(50,50,50);
lab2.setForeground(la2);
JTextField jtout = new JTextField();
jtout.setColumns(12);
jtout.setText("");
jtout.setFont(new Font("黑体",Font.PLAIN,20));
jtout.setHorizontalAlignment(JTextField.CENTER);
// jtout.setBackground(Color.LIGHT_GRAY);
jtout.setForeground(Color.RED);
JButton btn2=new JButton("计算");
btn2.setBackground(Color.orange);
jFrame.getRootPane().setDefaultButton(btn2);
JButton btn3=new JButton("清除");
btn3.setBackground(Color.orange);
// jpanel2.add(btn1); //面板中添加按钮
jPanel.add(lab2);
jpanel2.add(jtout);
jpanel2.add(btn2);
jpanel2.add(btn3);
//向JPanel添加FlowLayout布局管理器,将组件间的横向和纵向间隙都设置为20像素
jPanel.setLayout(new FlowLayout(FlowLayout.LEADING,20,20));
// jPanel.setBackground(Color.gray); //设置背景色
jFrame.add(jPanel); //添加面板到容器
Color jpb = new Color(220,220,250);
jPanel.setBackground(jpb);
jFrame.setBounds(300,200,600,250); //设置容器的大小
jPanel.add(jpanel2);
Font fon3 =new Font("等线",Font.PLAIN, 18);
JLabel lab3= new JLabel("Copyright © 2022 SCAU ");
lab3.setFont(fon3);
lab3.setBounds(0,0,200,60);
Color la3 = new Color(50,50,50);
lab3.setForeground(la3);
//第三行
JButton btn4=new JButton("帮助");
btn4.setBackground(Color.orange);
JPanel jPanle3 = new JPanel();
jPanle3.add(lab3);
// jPanle3.add(btn4);
jPanel.add(jPanle3);
jPanel.add(btn4);
//版本号Label
Font fon4 =new Font("楷体",Font.PLAIN, 18);
JLabel lab4= new JLabel("华南农业大学 传染病教研室");
lab4.setFont(fon4);
lab4.setBounds(0,0,200,60);
Color la4 = new Color(50,50,50);
lab4.setForeground(la4);
jPanel.add(lab4);
//计算
btn2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
Double a1 = Double.parseDouble(jt1.getText());
Double a2 = Double.parseDouble(jt2.getText());
Double a3 = Double.parseDouble(jt3.getText());
Double a4 = Double.parseDouble(jt4.getText());
Double a5 = Double.parseDouble(jt5.getText());
Double a6 = Double.parseDouble(jt6.getText());
Double a7 = Double.parseDouble(jt7.getText());
Double a8 = Double.parseDouble(jt8.getText());
Double[] cpes = {a1,a2,a3,a4,a5,a6,a7,a8};
// Double tcid50v=0.0 ;
// for(Double x:cpe){
// tcid50v = tcid50v + x;
// }
// String s = String.valueOf(tcid50v);
// String s1 = jisuan(cpe[8]);
// System.out.println("文本框中的内容为:" + jt.getText());
// System.out.println(cpe);
// s = jisuan(cpe);
double[] b = new double[8];
double[] a_acc = new double[8];
double[] b_acc = new double[8];
double[] ab_acc = new double[8];
double[] a_ratio = new double[8];
double gd50z = 0.0,
gd50 = 0.0,
d50 = 0.0,
s = 0.0,
tcid50j = 0.0,
copies = 8; //重复数
// copies = Convert.ToDouble(textBox10.Text);
for (int i = 0; i < 8; i++)
{
b[i] = copies - cpes[i];
}
// 计算CPE累积孔数,
for (int i = 7; i >= 0; i--)
{
s = s + cpes[i];
a_acc[i] = s;
}
// Console.WriteLine("\n CPE累积孔数为:\n " + a_acc[0]);
//计算非CPE累积孔数
s = 0;
for (int i = 0; i < 8; i++)
{
s = s + b[i];
b_acc[i] = s;
}
// Console.WriteLine("\n 非CPE累积孔数为:\n " + b_acc[0]);
// 计算总累积孔数
for (int i = 0; i < 8; i++)
{
ab_acc[i] = a_acc[i] + b_acc[i];
}
// Console.WriteLine("\n 总累积孔数为:\n " + ab_acc[0]);
// 计算各CPE累积孔数 占 总累积孔数(CPE累积和非CPE累积)的 比例
for (int i = 0; i < 8; i++)
{
a_ratio[i] = a_acc[i] / ab_acc[i];
}
// Console.WriteLine("\n CPE累积占比为:\n " + a_ratio[0] + a_ratio[1] + a_ratio[2] + a_ratio[3] + a_ratio[4]);
// 寻找大于等于最接近于50%的稀释度 占率
for (int i = 7; i >= 0; i--)
{
if (a_ratio[i] >= 0.5)
{
gd50z = a_ratio[i];
gd50 = i;
break;
}
}
// 寻找小于50%且最近于50%的稀释度 占率
for (int i = 0; i < 8; i++)
{
if (a_ratio[i] < 0.5)
{
// Console.WriteLine("现在a-ra为: " + a_ratio[i] + " i为: " + i);
d50 = a_ratio[i];
break;
}
}
// 计算距离
s = (gd50z - 0.5) / (gd50z - d50);
// Console.WriteLine("gd50, gd50z分别为: " + gd50 + gd50z);
// Console.WriteLine("距离为: " + s);
// 计算lg(TCID50) =
double tcid50 = -(gd50 + 1 + s);
// Console.WriteLine(tcid50);
// Double unit_index = Convert.ToDouble(comboBox1.SelectedIndex); //获取原液上样体积
// Double init = Convert.ToDouble(textBox11.Text); //获取起始稀释度
//考虑毒液测试体积,通常为100uL,index为0
// if (unit_index == 0)
// {
// tcid50 = tcid50 - 1;
// }
// else if (unit_index == 1)
// {
// tcid50 = tcid50 - Math.Log(5, 10);
// }
// else if (unit_index == 2)
// {
// tcid50 = tcid50 - Math.Log(2, 10);
// }
// else if (unit_index == 3)
// {
// tcid50 = tcid50;
// }
// //考虑起始稀释倍数,负对数通常为-1
// tcid50 = tcid50 - init;
// Double tcid50_unit = Convert.ToDouble(textBox19.Text); //获取TCID50单位
// //处理结果单位
// Double volume_change = Math.Log(1/tcid50_unit)/Math.Log(10);
// tcid50 = (tcid50 - volume_change) ;
// //格式化输出
// String tcid50f4 = tcid50.ToString("F4");
// textBox9.Text = tcid50f4;
// //textBox9.Text = Convert.ToString(tcid50).ToString("F4");
// String tcid50v =String.valueOf(tcid50);
String result = new java.text.DecimalFormat("#.0000").format(tcid50);
jtout.setText(result); //请空文本框
jt1.requestFocus();//获取焦点
}
});
//清除
btn3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
jtout.setText(""); //请空文本框
jt1.setText("");
jt2.setText("");
jt3.setText("");
jt4.setText("");
jt5.setText("");
jt6.setText("");
jt7.setText("");
jt8.setText("");
// jt.setText("");
jt1.requestFocus();//获取焦点
}
});
//帮助
btn4.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
// String help_info = "本款TCID50计算器采用Reed-Muench两氏法,可用于计算TCID50, EID50等\r\n";
String line1 = "本款TCID50计算器采用Reed-Muench两氏法,可用于计算TCID50, EID50等.";
String line2 = "TCID50, median tissue culture infective dose, 半数组织培养感染剂量, 即指\r\n能在培养板孔或试管内引起半数细胞病变或死亡(cytopathic effect, CPE)\r\n所需的病毒量,用以表征病毒的滴度。";
String line3 = "\n注意:这里的病毒量不是具体的浓度,而是将原始样品稀释的倍数。";
String line4 = "比如,1 mL培养液,稀释1000倍后恰好导致50 % 的细胞感染,则TCID50为\r\n1000 / mL。意思是每mL样品中含有的病毒导致50 % 细胞感染需要稀释的倍数。";
String line5 = "可根据测试病毒体积,起始稀释倍数等参数计算TCID50,";
String line6 = "\n版本号:6.0.1_java版";
String line7 = "更新日期:2022 / 1 / 25";
String line8 = "作者:艾强云";
String line9 = "联系方式(E - mail):aqy0716@163.com";
String help_info =(line1 + "\r\n" + line2 + "\r\n" + line3 + "\r\n" + line4 + "\r\n" + line5 + "\r\n" + line6 + "\r\n" + line7 + "\r\n" + line8 + "\r\n" + line9);
// TCID50, median tissue culture infective dose, 半数组织培养感染剂量, 即指能在培养板孔或试管内引起半数细胞病变或死亡(cytopathic effect, CPE)所需的病毒量,用以表征病毒的滴度。";
// \n注意:这里的病毒量不是具体的浓度,而是将原始样品稀释的倍数。
// 比如,1 mL培养液,稀释1000倍后恰好导致50 % 的细胞感染,则TCID50为1000 / mL。意思是每mL样品中含有的病毒导致50 % 细胞感染需要稀释的倍数。
// 可根据测试病毒体积,起始稀释倍数等参数计算TCID50,
// \n版本号:6.0.1_java版
// 更新日期:2022 / 1 / 25
// 作者:艾强云
// 联系方式(E - mail):aqy0716@163.com";
// String help_info="jfdska";
JOptionPane.showMessageDialog( null,help_info,"帮助信息",1);
}
});
jFrame.setVisible(true);
jFrame.setResizable(false);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static String jisuan(Double [] cpe){
String s="";
Double tcid50v=0.0 ;
for(Double x:cpe){
tcid50v = tcid50v + x;
}
s = String.valueOf(tcid50v);
return s;
}
}
网友评论