如何在不覆盖的情况下添加相同JPanel类的不同实例

时间:2015-03-01 13:53:38

标签: java javascript swing jcombobox

所以我遇到的问题是我创建了一个扩展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");

2 个答案:

答案 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,因为这不会任何意义 - 班级不应该代表约会。这是实例应该。

注意:

  • 方法名称不应以大写字母开头。只有类型名称以大写字母开头。语法高亮显示器希望它是这样的,所以如果你不遵循惯例就会变得混乱。
  • 您的代码中应该有更多文档。当代码中没有一条评论时,很难猜出你想做什么。