所以我遇到的问题是我创建了一个扩展JPanel的类(见下文),我试图将这个JPanel类的多个实例添加到另一个JPanel类。
public class DOBGui extends JPanel {
private static String dayList[] = {bunch of days};
private static JComboBox dobDay = new JComboBox(dayList);
private static String monthList[] = {bunch of months};
private static JComboBox dobMonth = new JComboBox(monthList);
private static String yearList[] = {bunch of dates};
private static JComboBox dobYear = new JComboBox(yearList);
public static String DOBString() {
int dayInt = dobDay.getSelectedIndex() + 1;
int monthInt = dobMonth.getSelectedIndex() + 1;
String year = dobYear.getSelectedItem().toString();
String day = "" + dayInt;
if (day.length() == 1) {
day = "0" + day;
}
String month = "" + monthInt;
if (month.length() == 1) {
month = "0" + month;
}
return day + month + year;
}
public DOBGui() {
add(dobDay);
add(dobMonth);
add(dobYear);
}
void reset() {
dobDay.setSelectedIndex(0);
dobMonth.setSelectedIndex(0);
dobYear.setSelectedIndex(0);
}
}
我试图通过创建类DOBGui的两个实例将这个JPanel添加到另一个JPanel类中,但它覆盖了第一个。
questionsPanel.add(new JLabel("Date for budget skills training session"), "wrap");
DOBGui budgetSkillsDate = new DOBGui();
budgetSkillsDate.reset();
questionsPanel.add(budgetSkillsDate, "wrap");
questionsPanel.add(new JLabel("Date for cooking course training session"), "wrap");
DOBGui cookingCourseDate = new DOBGui();
cookingCourseDate.reset();
questionsPanel.add(cookingCourseDate, "wrap");
答案 0 :(得分:0)
那是因为您定义的所有字段都是静态类型。现在,当您在panel1上调用reset时,请调用:
void reset() {
dobDay.setSelectedIndex(0);
dobMonth.setSelectedIndex(0);
dobYear.setSelectedIndex(0);
}
您重置日,月,年。然后你把它设置回来,然后你为第二个面板调用reset,这意味着你只有一个dobDay,dobMonth,dobYear实例,你的所有面板都只有一个实例。
答案 1 :(得分:0)
简短版本是:字段不应该是静态的。
静态字段是不属于对象(实例)的字段,而是类的一部分。典型的例子是具有序列号的对象。 “序列号”字段对于每个实例都是唯一的,因此它必须是实例字段。但是包含“下一个要提供的序列号”的字段属于该类,而不属于任何实际实例,并且在创建新实例的过程中使用。
当编译器告诉您“无法从静态上下文访问非静态XXX”时,在大多数情况下,这并不意味着您应该将XXX转换为静态。这意味着您应该使用类的实例,而不是整个类。
您打算DOBString()
做什么?您的代码中没有文档,但我猜它是为了给您一个字符串表示子组件选择的日期。但是这个日期不是每个DOBGui
对象都不同吗?如果您的应用程序同时有两个DOBGui
个对象,并且用户选择2014年1月15日,另一个则选择1969年7月28日,则DOBString()
应返回不同的字符串第一个比第二个。调用DOBGui.DOBString()
是没有意义的,因为应该返回什么日期?第一个还是第二个?一般的默认日期?
因此,应该成为单个面板一部分的所有内容(访问它们的字段和方法或使用它们执行操作)应该不是静态的。不是字段,不是方法。
那么你的事件监听器呢?那么,您希望它显示哪个面板的日期?如果您希望它显示budgetSkillsDate
的日期,则应调用budgetSkillsDate.DOBString()
。为了实现这一点,budgetSkillsDate
不应该是局部变量,而应该是创建它的方法和侦听器都可以访问的字段。
重要的是它必须是DOBGui
的实例,而不是类 DOBGui
,因为这不会任何意义 - 班级不应该代表约会。这是实例应该。
注意: