2013-06-24 4 views
0
public class TableModel extends AbstractTableModel { 
    public int page; 
    public TableModel(Integer p) {     
     this.page=p; 
     System.out.println("mm"+page);  
    } 

    public void pudata() { 
     System.out.println(page); 
    } 
    //System.out.println("model "+page); 
    private String[] columnNames = {"groupName","membersCount","previliage"}; 

    public ArrayList<GroupData> data = (new DatabaseLayer()).getGroup(page); 

    @Override 
    public int getRowCount() { 
     return data.size() ; 
    } 

не удается получить доступ к переменной page в getgroup() метод он проходит от 0 до getgroup() метода.члены не могут получить доступ за пределами

public ArrayList<GroupData> data = (new DatabaseLayer()).getGroup(page); 
+4

Пожалуйста, измените свой пост, чтобы установить отступы - это повсюду. И весь этот код в одном классе? Имейте в виду, что весь код инициализации будет запущен * при инициализации * до запуска конструктора - так что да, 'page' будет 0 в этой точке. –

+0

Похоже, вы пытаетесь инициализировать переменную вне метода. 'page' имеет значение null к тому времени, когда инициализируется' data' ... –

+0

public ArrayList data = (новый DatabaseLayer()). getGroup (страница); инициализировать эту переменную внутри конструктора – chetan

ответ

1

Ваш вопрос неясен, но я подозреваю, проблема только, что все инстанции Инициализаторы бегутся перед телом конструктора, так что вы видите значение по умолчанию для page. Вы должны иметь что-то вроде:

public class TableModel extends AbstractTableModel { 
    private static final String[] columnNames = 
     {"groupName","membersCount","previliage"}; // TODO: Fix spelling! 
    private final int page; 
    private final List<GroupData> data; 

    public TableModel(int page) { 
     this.page = page; 
     this.data = new DatabaseLayer().getGroup(page); 
    } 

    ... 
} 

Это вообще хорошая идея, чтобы сохранить все ваши экземпляра/статические объявления переменных в одном месте (я предпочитаю, чтобы держать их в верхней части, но YMMV) и сделать их все частные, чтобы сделать легче рассуждать о том, как они используются. Главное изменение, однако, перемещает код new DatabaseLayer().getGroup(page) в конструктор.

+0

Это не работает, если' page' является переменной. – SeniorJD

+0

@SeniorJD: Я понятия не имею, что означает ваш комментарий. Пожалуйста, дайте более подробную информацию. –

+0

Если поле 'page' может быть изменено после инициализации объекта' TableModel', 'data' не будет обновляться. – SeniorJD

0
public class TableModel extends AbstractTableModel { 
    public int page; 
    public ArrayList<GroupData> data; 
    public TableModel(Integer p) {     
     this.page=p; 
     this.data = (new DatabaseLayer()).getGroup(page); 
     System.out.println("mm"+page);  
    } 

    public void pudata() { 
     System.out.println(page); 
    } 
    //System.out.println("model "+page); 
    private String[] columnNames = {"groupName","membersCount","previliage"}; 



    @Override 
    public int getRowCount() { 
     return data.size() ; 
    } 
0

Обновить ваш data поле каждый раз, когда вы присвоить новое значение в поле page.

public TableModel(int p) { 
    setPage(p); 
} 

public void setPage(int p) { 
    this.page = p; 
    this.data = new DatabaseLayer().getGroup(page); 
} 
+0

Нет никаких указаний на то, что OP даже * хочет * метод 'setPage'. –

0

Это абсолютно правильно, потому что:

public int page; 

значение по умолчанию странице 0, потому что его int.

public ArrayList<GroupData> data = (new DatabaseLayer()).getGroup(page); 

ли переменная инициализации так до инициализации page вы передаете его в .getGroup(page) так по умолчанию значения будет проходить в этом случае.

Таким образом, вы должны вызвать метод getGroup(int) после page инициализации, один из способов может быть следующее:

private final List<GroupData> data; 

public TableModel(Integer p) { 
    this.page = p; 
    this.data = new DatabaseLayer().getGroup(page); 
    System.out.println("mm"+page); 
}