Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> установка данных в jTable 
:(
    Опции темы
#Maestro#
Дата 18.2.2009, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 3.7.2008

Репутация: нет
Всего: нет



Господа!

На форме Frame таблица jTable

Два массива:
public ArrayList<String> collNames = new ArrayList<String>(); //массив имён столбцов
 public ArrayList<String> collValues = new ArrayList<String>();  //массив значений

Как «присобачить» эти массивы к таблице jTable, что бы
  значения collNames стали именами столбцов данной таблицы (число столбцов таблицы должно соответствовать числу элементов collNames),
  значения collValues стали ячейками таблицы jTable?

Я таки понимаю, что происходит это с помощью модели типа TableModel. Кто может объяснить подробнее – объясните, если есть возможность.



Модератор: Название темы должно отражать ее суть!

Это сообщение отредактировал(а) powerOn - 18.2.2009, 20:13
PM MAIL   Вверх
Kircul
Дата 18.2.2009, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 20.2.2007

Репутация: нет
Всего: 7



Класс JTable очень сложный и чтобы лучше с ним разобраться советую почитать "Swing: Эффективные пользовательские интерфейсы". Ну а если уже лень то тогда читай документацию по javax.swing.table.TableModel (вроде так)

Добавлено через 10 минут и 56 секунд
Вот мини примерчик:
Код

public class Test {
    public static void main(String... arg) throws InterruptedException {
        JFrame frame = new JFrame();
        List<String> collNames = Arrays.asList("Id", "C1", "C2");
        List<List<String>> collValues = Arrays.asList(
                Arrays.asList("1", "Val1", "Val2"),
                Arrays.asList("2", "Val3", "Val4")
        );
        JTable table = new JTable(new TM(collNames, collValues));
        frame.getContentPane().add(new JScrollPane(table));
        frame.pack();
        frame.setVisible(true);
    }
}

class TM extends AbstractTableModel {
    public List<String> collNames = new ArrayList<String>(); //массив имён столбцов
    public List<List<String>> collValues = new ArrayList<List<String>>();  //массив значений

    TM(List<String> collNames, List<List<String>> collValues) {
        this.collNames = collNames;
        this.collValues = collValues;
    }

    public int getRowCount() {
        return collValues.size();
    }

    public int getColumnCount() {
        return collNames.size();
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        return collValues.get(rowIndex).get(columnIndex);
    }

    @Override
    public String getColumnName(int column) {
        return collNames.get(column);
    }
}

PM   Вверх
#Maestro#
Дата 19.2.2009, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 3.7.2008

Репутация: нет
Всего: нет



Kircul! уважаемый! спосибо громадное за помощь, но остались пробленные моменты:

Дело в том, что массив collValues объявлен не как у вас «List<List<String>>», а просто ArrayList<String>
Дело в том, что я никогда не использовал этот List<List<String>> и делать этого сейчас не умею. И, как следствие, возникает ошибка в цикле:
collValues.add(value);  // value значения из базы данных

table и массивы у меня создаются в классе-наследнике от javax.swing.JFrame,
 а у вас в функции main, которая throws InterruptedException, это принципиально?


Кстати в вашем примере каждая строчка collValues заполняется как отдельный массив, то есть видимо нельзя все значения «пихать» как один  ArrayList?

видимо поэтому фукция getValueAt(int r, int c) класса, который расширяет «AbstractTableModel» у меня выглядит следующим образом


  public Object getValueAt(int r, int c)
    {                  
        Object d = collValues.get(perem);
        perem++;
      return d;      
    }

Вместо вашей: return collValues.get(rowIndex).get(columnIndex);
Где переменная perem у меня объявлена глобально и равна нулю. Хотя, наверное, всё это бред

кстати, это возможно - найти "Swing: Эффективные пользовательские интерфейсы" в электронном виде. если да, то  где?
PM MAIL   Вверх
Kircul
Дата 19.2.2009, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 20.2.2007

Репутация: нет
Всего: 7



Цитата(#Maestro# @  19.2.2009,  16:11 Найти цитируемый пост)
throws InterruptedException, это принципиально?

нет это не нужно.
Цитата(#Maestro# @  19.2.2009,  16:11 Найти цитируемый пост)
Дело в том, что массив collValues объявлен не как у вас «List<List<String>>», а просто ArrayList<String>
Дело в том, что я никогда не использовал этот List<List<String>> и делать этого сейчас не умею. И, как следствие, возникает ошибка в цикле:
collValues.add(value);  // value значения из базы данных

Так что-то я запутался... А что за значения хранит список collValues  smile? Это значения одной колонки? Тогда где остальные? В моем примере
Код

List<List<String>> collValues = Arrays.asList(
                Arrays.asList("1", "Val1", "Val2"), // row 1
                Arrays.asList("2", "Val3", "Val4") // row 2
        );

т.е. это двумерный список.
PM   Вверх
#Maestro#
Дата 20.2.2009, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 3.7.2008

Репутация: нет
Всего: нет



у вас это двумерный список, а в моём убогом случае это:

Frame.jTable = new JTable(new packageDB.tableA.TableD(collValues, collNames));          





А вот пример заполнения collValues  (написан криво):


public void valuesInit(ResultSet rs) throws SQLException
     {

         while(rs.next())
         {
        for(int j=0;j<collNames.size();j++)
                      {
            String coll =  rs.getString(collNames.get(j));   //значение ячейки

             collValues.add(coll);    //каждое поле таблицы добовляется в массив значений 
            
                      }  
       
         }
     }
     
Входящий параметр «rs» это результат запроса:
ResultSet rs = st.executeQuery("SELECT * FROM " + Frame1.stringJList);
Где stringJList - список всех таблиц взятых из БД. 


на всякий случай пример заполнения collNames:

    public TableModel collSpisok(Connection con, String s)
    {
         //список имён столбцов выбранной таблицы
        
        TableModel model;
        
        try{
        TablesName tName = new TablesName();
        
        Statement st =con.createStatement();
        
        //список всех полей таблицы
        ResultSet rs = st.executeQuery("SELECT * FROM " + Frame1.stringJList); 
        ResultSetMetaData meta = rs.getMetaData();        
        
      for (int i =1; i<meta.getColumnCount()+1;i++)
       {            
         String collName = meta.getColumnLabel(i); //каждое поле добовляется в массив имён столбцов
         collNames.add(collName);       
         
       }       
        } 
      catch(Exception e){System.out.println(e.toString());}

model = new packageDB.tableA.TableD( collValues, collNames);
return model;
}

PM MAIL   Вверх
Kircul
Дата 20.2.2009, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 20.2.2007

Репутация: нет
Всего: 7



Лучше переделать так:
Код

    List<List<String>> collValues = new ArrayList<List<String>>();
    List<String> collNames = new ArrayList<String>();
    public void valuesInit(ResultSet rs) throws SQLException {
        ResultSetMetaData md = rs.getMetaData();
        for(int i = 1; i <= md.getColumnCount(); i++) { // в ResultSet по моему!!! колонки нумеруются от 1
            collNames.add(md.getColumnName(i));     
        }
        while (rs.next()) {
            List<String> row = new ArrayList<String>();
            for (String collName : collNames) {
                row.add(rs.getString(collName));    
            }
            collValues.add(row);
        }
    }

и использовать мой первый пример. В таком случае имена колонок будут как в базе.
PM   Вверх
#Maestro#
Дата 24.2.2009, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 3.7.2008

Репутация: нет
Всего: нет



спосибо за поддержку! а где книжку "Swing: Эффективные пользовательские интерфейсы" найти в электронном виде не подскажете?
PM MAIL   Вверх
#Maestro#
Дата 4.3.2009, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 3.7.2008

Репутация: нет
Всего: нет



уважаемый Kircul. у меня новая проблемма с вышеупомянутой таблицей:
если изменить размеры таблицы, или нажать мышью на любую ячейку - значения ячеек начинают меняться. не подскажете дураку - как избавиться от этого бреда? и как узнать номер этой выбранной ячейки (желательно в качестве элемента однимерного массива, ведь значения ячеек у меня хранятся в массиве collValues)? 
PM MAIL   Вверх
Kircul
Дата 4.3.2009, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 20.2.2007

Репутация: нет
Всего: 7



Цитата(#Maestro# @  4.3.2009,  09:56 Найти цитируемый пост)
нажать мышью на любую ячейку - значения ячеек начинают меняться

javax.swing.table.TableModel.isCellEditable -  smile 
Код

int index = rowIndex*rowLength + columnIndex;

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0492 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.