2015-03-01 3 views
0

Таким образом, проблема заключается в том, что я создал класс, который расширяет JPanel (см. Ниже), и я пытаюсь добавить несколько экземпляров этого класса 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); 
    } 
} 

И я пытаюсь добавить JPanel в другой класс JPanel дважды, создав два экземпляра класса DOBGui но перезапись первый.

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

Поля не должны быть статическими. – RealSkeptic

+0

Nah это должно быть статичным, иначе я не могу ссылаться на dobstring из actionlistener. –

ответ

0

Это потому, что все ваше поле, которое вы определили, имеет статический тип. Теперь, когда вы вызываете сброс на панели 1, вы вызываете:

void reset() { 
    dobDay.setSelectedIndex(0); 
    dobMonth.setSelectedIndex(0); 
    dobYear.setSelectedIndex(0); 
} 

Сброс дня, месяца, года. Затем вы устанавливаете его обратно, а затем для второй панели вы вызываете сброс, что означает, что у вас есть только один экземпляр dobDay, dobMonth, dobYear и всех ваших панелей с одним экземпляром.

+0

Это не проблема, я удалил метод сброса пустоты и удалил там, где я его назвал. –

+1

измените свои статические поля на нестатические и ваш метод тоже, и это решит проблему. Я просто привел пример. – SMA

+0

Нет, это не сработало, потому что я вызываю DOBString из actionListener. Строка sql = "SELECT * FROM clientDetails WHERE dob = '" + DOBGui.DOBString() + "'"; –

0

Краткая версия: поля не должны быть статическими.

Статические поля - это поля, которые не являются частью объекта (экземпляра), а являются частью класса. Классическим примером являются объекты с серийными номерами. Поле «серийный номер» уникально для каждого экземпляра, поэтому оно должно быть полем экземпляра. Но поле, содержащее «следующий порядковый номер для выдачи», принадлежит классу, а не любому из реальных экземпляров, и используется в процессе создания новых экземпляров.

Когда компилятор сообщает вам, что «нестатический XXX не может быть доступен из статического контекста», в большинстве случаев это не означает, что вы должны преобразовать XXX в static. Это означает, что вы должны использовать экземпляр класса, а не класс в целом.

Что вы намерены делать DOBString()? У вас нет документации в вашем коде, но я предполагаю, что она предназначена для представления строкового представления даты, выбранной субкомпонентами. Но разве эта дата не отличается для каждого отдельного объекта DOBGui? Если у вас есть два объекта DOBGui в вашем приложении одновременно, и пользователь выбирает 15 января 2014 года в одном и 28 июля 1969 года в другом, то DOBString() должен возвращать другую строку для первой, чем для второго , Нет смысла звонить DOBGui.DOBString(), потому что какая дата должна возвращаться? Первая или вторая? Общая дата по умолчанию?

Итак, все, что должно быть частью отдельной панели (поля и методы, которые к ним обращаются или делают с ними вещи), должно быть не быть статическим. Не поля, не методы.

Как насчет вашего слушателя событий? Ну, какую из дат панелей вы хотите отобразить? Если вы хотите, чтобы он отображал дату budgetSkillsDate, тогда он должен позвонить budgetSkillsDate.DOBString(). Чтобы это работало, budgetSkillsDate не должна быть локальной переменной, а полем, доступным как методом, создающим его, так и слушателем.

Важно то, что он должен быть экземпляром из DOBGui, не классаDOBGui, потому что не имеет никакого смысла - класс не должен представлять дату. Это экземпляров should.

Примечание:

  • Имена методов не должно начинаться с заглавной буквой. Только имена типов начинаются с заглавных букв. Выделители синтаксиса ожидают, что это будет так, и поэтому становится непонятным, если вы не следуете конвенции.
  • У вас действительно должно быть больше документации в вашем коде. Трудно догадаться, что вы хотели сделать, когда в коде не было ни одного комментария.
Смежные вопросы