代码的一些背景知识。我现在是暑假的学生,我想玩我的编程技巧。我写了一个简单的GUI程序来计算举重运动员的营养需求。该计划充分运作。
然后我扩展了我的代码以创建一个选项卡式窗格。该计划的第三个标签是我原来的营养计划的代码。现在代码不起作用。具体来说,ActionListener的嵌套类和我为计算营养价值而编写的方法无法解析构造函数中的JTextField代码条目。我可以删除ActionListener和actionTakenMethod,其余代码可以工作(它不漂亮,但它可以工作)。
我感谢您对此问题的任何帮助。我会记住两件事。首先,我从原始程序中使用的代码工作,所以在我将代码添加到选项卡式窗格之前,这个问题没有出现。其次,我还是一名本科生,所以我的代码可能不是最漂亮的!谢谢!
另外,我的程序没有完成,因此前两个标签中没有任何内容。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class GatesFiveByFive extends JFrame{
public GatesFiveByFive(){
//Title of window
setTitle("Gates 5x5");
//Size of window
setSize(500,500);
//Set Default Close Operation
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Set Panel Visible
setVisible(true);
//JTabbedPane object declaration
JTabbedPane jtp=new JTabbedPane();
//creates the content pane
getContentPane().add(jtp);
//First Tab
JPanel tab1=new JPanel();
//Second Tab
JPanel tab2=new JPanel();
//Third Tab
JPanel tab3=new JPanel();
//Add Tab 1 to Content Pane
jtp.addTab(" 5x5 ",tab1);
//Add Tab 2 to Content Pane
jtp.addTab(" HST ",tab2);
//Add Tab 3 to Content Pane
jtp.addTab(" Nutrition ",tab3);
/**Adds content to the First Tab pane*/
/**Adds content to the Second Tab pane*/
/**Adds content to Third Tab pane*/
JButton calculate;//display calculate button
JLabel weight;
JLabel weight1;
JLabel totalCalories;
JLabel protein;
JLabel fats;
JLabel carbs;
JTextField weightField;
JTextField totalCaloriesField;
JTextField proteinField;
JTextField fatsField;
JTextField carbsField;
//Create five labels
weight=new JLabel("Enter your weight:");
weight1=new JLabel("");
totalCalories=new JLabel("Total Calories");
protein=new JLabel("Protein");
fats=new JLabel("Fats");
carbs=new JLabel("Carbs");
//Create five text fields
weightField=new JTextField(20);
totalCaloriesField=new JTextField(20);
proteinField=new JTextField(20);
fatsField=new JTextField(20);
carbsField=new JTextField(20);
//Create "calculate" button
calculate=new JButton("Calculate");
//Register "calculate" button
calculate.addActionListener(new CalculateButtonListener());
//Populate Tab 3
tab3.setLayout(new GridLayout(6,2));
tab3.add(weight);
tab3.add(weight1);
tab3.add(weightField);
tab3.add(calculate);
tab3.add(totalCalories);
tab3.add(totalCaloriesField);
tab3.add(protein);
tab3.add(proteinField);
tab3.add(fats);
tab3.add(fatsField);
tab3.add(carbs);
tab3.add(carbsField);
}//end constructor GatesFiveByFive
/**Private inner class for event handler CalculateButtonListener*/
private class CalculateButtonListener implements ActionListener{
public void actionPerformed(ActionEvent e){
actionTakenMethod(weightField.getText());
}//end actionPerformed method
}//end CalculateButtonListener inner class
/**method for calculating tab 3 stats*/
public void actionTakenMethod(String currentWeight){
/**Convert String input to double for processing*/
double x=Double.parseDouble(currentWeight);
/**Calculations for finding macronutrient stats*/
double cal=14.183*x+500; //total calories
double pro=0.886*x; //protein
double fat=0.39397*x; //fats
double carb=1.7733175*x; //carbs
/**Convert results of calculations back to string for display*/
String calCal=Double.toString(cal);
String proPro=Double.toString(pro);
String fatFat=Double.toString(fat);
String carbCarb=Double.toString(carb);
/**Display results of calculation*/
totalCaloriesField.setText(calCal);
proteinField.setText(proPro);
fatsField.setText(fatFat);
carbsField.setText(carbCarb);
}//end actionTakenMethod
public static void main(String[]args){
GatesFiveByFive gates=new GatesFiveByFive();
}//end main
}// end GatesFiveByFive.java
答案 0 :(得分:4)
这些变量是构造函数的本地变量。在构造函数之外声明JLabel
和JTextField
s。也就是说,将它们设为GatesFiveByFive
类的私有实例字段。您的ActionListener
是一个内部类,因此它仍然可以访问外部类的那些字段。
答案 1 :(得分:2)
您已经为构造函数创建了 local 的变量。您应该将它们设为实例变量,以便可以通过类中的任何方法访问它们。
public class GatesFiveByFive extends JFrame{
JButton calculate;//display calculate button
JLabel weight;
JLabel weight1;
JLabel totalCalories;
JLabel protein;
JLabel fats;
JLabel carbs;
JTextField weightField;
JTextField totalCaloriesField;
JTextField proteinField;
JTextField fatsField;
JTextField carbsField;
...