java GUI Java中的BMI计算器;
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/14794957/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
BMI calculator in GUI Java;
提问by Khair
I wanted to create a BMI calculator using GUI in Java. I'm very new to GUI and even Java. The calculator is suppose to display BMI with advice and even time and date. However, only the BMI is display while the rest can't.. I have been searching online on how to display results from if else condition online but to no avail. This is my code;
我想在 Java 中使用 GUI 创建一个 BMI 计算器。我对 GUI 甚至 Java 都很陌生。计算器应该显示 BMI 和建议,甚至时间和日期。但是,只有 BMI 显示,而其余的则不能。我一直在网上搜索如何在线显示 if else 条件的结果,但无济于事。这是我的代码;
public class BMI extends JFrame implements ActionListener {
private static final JButton JButton = null;
private JFrame frame;
private JPanel panel;
private JLabel heightLabel, weightLabel, BMILabel;
private JTextField height, weight, result;
private JButton calculate;
String Height, Weight;
double number1, number2, BMI;
static String output = "Results";
static int jopIcon = JOptionPane.QUESTION_MESSAGE;
boolean bFlag = true; //state, true means no exception
public BMI() {
frame = new JFrame("BMI Calculator");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//create labels for the height and weight textfields
heightLabel = new JLabel("Your height in meters:");
weightLabel = new JLabel("Your weight in kilograms: ");
//create a "this is your BMI" label
BMILabel = new JLabel("Your BMI is ");
//create a result label to hold the BMI value
result = new JTextField("");
//create a JTextField to hold the person's height in kilograms
height = new JTextField(1);
//create a JTextField to hold the person's weight in metres
weight = new JTextField(1);
calculate = new JButton("Calculate BMI");
//set up the JPanel to go on the JFrame
panel = new JPanel();
panel.add(heightLabel);
panel.add(height);
//add the weight label and weight textfield to the panel
panel.add(weightLabel);
panel.add(weight);
//add the button to the panel
panel.add(BMILabel);
//add the label that holds the result to the panel
panel.add(result);
//add the panel to the frame
panel.add(calculate);
//add the BMI label to the panel
frame.getContentPane().add(panel);
JPanel p1 = new JPanel();
panel.setLayout(new GridLayout(4, 1));
add(p1, BorderLayout.SOUTH);
calculate.addActionListener(this);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 400);
frame.setVisible(true);//important must HAVE@! if not GUI will not be display
}
public String getDateTime() {
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = new Date();
return dateFormat.format(date);
}
public void calculateBMI(double number1, double number2) {
try {
BMI = number2 / ((number1) * 2);
} catch (NumberFormatException nfe) {
output += "\n\n Whoa! Input error: must enter valid integers";//if exception comes out, prepare error message
jopIcon = JOptionPane.ERROR_MESSAGE;
}
}
public void calculate() {
Height = height.getText();
Weight = weight.getText();//declare the Height string with Jtext height
try {
number1 = Double.parseDouble(Height);
number2 = Double.parseDouble(Weight);//exception may come out
calculateBMI(number1, number2);
} finally {
if (BMI >= 27.5) {
output += "\n\n You're in the High Risk zone(UnHealthy). Please start losing weight! It's a MUST!";
} else if (BMI <= 23 || BMI < 27.4) {
output += "\n\n You're in the Moderate Risk zone. Please start going on diet and lose some weight";
} else if (BMI <= 18.5 || BMI < 22.9) {
output += " You're in the Low Risk zone(Healthy). Hopefully you can maintain this way! ^^";
} else if (BMI < 18.4) {
output += "\n\n You really need to start eating more. Too skinny and unhealthy for your body";
}
}
}
public static void main(String[] args) {
BMI bmi = new BMI();
}
@Override
public void actionPerformed(ActionEvent e) {
//call the calculate
this.calculate();
result.setText("" + BMI);
// TODO Auto-generated method stub
}
}
回答by michael_s
I would do it like this:
我会这样做:
@Override
public void actionPerformed(ActionEvent arg0) {
calculate();
result.setText(output);
}
The result should be of type JTextArea however line wrap should be set:
结果应该是 JTextArea 类型,但是应该设置换行:
result = new JTextArea();
result.setLineWrap(true);
And you should think about implementing the ActionListener in an anonymous class rather than directly in the frame class (especially when you would like add some other buttons or checkboxes)
并且您应该考虑在匿名类中而不是直接在框架类中实现 ActionListener (尤其是当您想添加一些其他按钮或复选框时)
calculate.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ev) {
calculate();
result.setText(output);
}
});