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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Доступ к базе данных через JTable 
:(
    Опции темы
Art2
Дата 2.6.2012, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет всем. Нашел в интернете пример доступа к базе данных без ошибок,но что там не так таблица из базы не считывается.Помогите найти я сам новичок.
это главная форма
Код

import java.awt.Color;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.*;
import javax.swing.border.BevelBorder;

class f  { 
     private static final long serialVersionUID = 1L;
    private JTable table;
    private JDBCAdapter model;
    private DatabaseTable baza;
    f(){
    TableSorter sorter = new TableSorter();
// создадим объект TableSorter

// Создадим таблицу
JTable mainTable = new JTable(sorter);
// Будем использовать прокрутку
mainTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
// сделаем так, чтобы редактироваться сразу могла, только
//одна ячейка
mainTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// установим обработчик события, этим мы обеспечим автоматическую
// сортировку таблицы, при нажатии мышью на заголовок таблицы
sorter.addMouseListenerToHeaderInTable(mainTable);
// создадим объект JScrollPane, конструктору которого,
// передадим нашу  таблицу
JScrollPane tableAggregate = new JScrollPane(mainTable);
// установим вид рамки
tableAggregate.setBorder(new BevelBorder(BevelBorder.LOWERED));
//создадим основную панель

 //создадим основную панель
 JPanel mainPanel = new JPanel();
 // присоеденим к этой панели нашу  таблицу
 mainPanel.add(tableAggregate);
 // Создать окно и  поместить туда mainPanel.
 JFrame frame = new JFrame("Студенты");
 // этот обработчик позволит закрывать окно
 frame.addWindowListener(new WindowAdapter()
  {
    public void windowClosing(WindowEvent e)
      {
        System.exit(0);
      }
 });
 // установим задний фон
 frame.setBackground(Color.lightGray);
 // теперь таблица будет   видна
 frame.getContentPane().add(mainPanel);
 frame.pack();
 // установим  размер окна
 frame.setBounds(200, 200, 640, 480);
 frame.setVisible(true);
    }
 public static void main(String args[]){
      SwingUtilities.invokeLater(new Runnable() {
          public void run(){
                f f = new f();
          }
          
    
      });
              }
 }


Это модель
Код

    import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
     
    public class DatabaseTable {
        //Параметры подключения
        private static String dsn = "jdbc:derby://localhost:1527/students", uid = null, pwd = null;
     
        public static void main(String[] args) {
            //Инициализация JDBC
            Connection con;
            try {
                Class.forName("org.apache.derby.jdbc.ClientDriver");
                //Объект-соединение с БД
                con = DriverManager.getConnection(dsn, uid, pwd);
            Statement st = con.createStatement();
                //Выполняем запрос
            ResultSet rs = st.executeQuery("SELECT * FROM students");
                //Наша модель
       
                            
            } catch (Exception ex) {
                throw new RuntimeException(ex);
            }
        }
    }

JDBCAdapter
Код

import java.beans.Statement;
import java.sql.*;
import java.util.Vector;
import javax.swing.table.AbstractTableModel;

public abstract class JDBCAdapter extends AbstractTableModel
{
    private Connection          connection;
    private Statement           statement;
    private ResultSet           resultSet;
        // здесь будут содержаться названия таблиц БД
    public  String[]            columnNames = {};
        // здесь будут  храниться все данные таблицы БД
    private Vector              rows = new Vector();
    private ResultSetMetaData   metaData;

    public String       tableName="STUDENTS";

    public JDBCAdapter(String url, String driverName,
                                  String user, String passwd)
    {
        try
        {
            Class.forName(driverName);
            System.out.println("Opening db connection");

            connection = DriverManager.getConnection
                                    (url, user, passwd);
            statement = (Statement) connection.createStatement();
        }
        catch (ClassNotFoundException ex)
        {
            System.err.println
             ("Cannot find the database driver classes.");
            System.err.println(ex);
        }
        catch (SQLException ex)
        {
            System.err.println
             ("Cannot connect to this database.");
            System.err.println(ex);
        }
     }
}


Код

import javax.swing.table.*; 
import javax.swing.event.TableModelListener; 
import javax.swing.event.TableModelEvent; 

public class TableMap extends AbstractTableModel implements TableModelListener
{
    protected TableModel model; 

    public TableModel  getModel() {
        return model;
    }

    public void  setModel(TableModel model) {
        this.model = model; 
        model.addTableModelListener(this); 
    }

    // By default, Implement TableModel by forwarding all messages 
    // to the model. 

    public Object getValueAt(int aRow, int aColumn) {
        return model.getValueAt(aRow, aColumn); 
    }
        
    public void setValueAt(Object aValue, int aRow, int aColumn) {
        model.setValueAt(aValue, aRow, aColumn); 
    }

    public int getRowCount() {
        return (model == null) ? 0 : model.getRowCount(); 
    }

    public int getColumnCount() {
        return (model == null) ? 0 : model.getColumnCount(); 
    }
        
    public String getColumnName(int aColumn) {
        return model.getColumnName(aColumn); 
    }

    public Class getColumnClass(int aColumn) {
        return model.getColumnClass(aColumn); 
    }
        
    public boolean isCellEditable(int row, int column) { 
         return model.isCellEditable(row, column); 
    }
//
// Implementation of the TableModelListener interface, 
//

    // By default forward all events to all the listeners. 
    public void tableChanged(TableModelEvent e) {
        fireTableChanged(e);
    }
}


Код

import java.util.*;

import javax.swing.table.TableModel;
import javax.swing.event.TableModelEvent;

// Imports for picking up mouse events from the JTable. 

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.InputEvent;
import javax.swing.JTable;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumnModel;

public class TableSorter extends TableMap
{
    int             indexes[];
    Vector          sortingColumns = new Vector();
    boolean         ascending = true;
    int compares;

    public TableSorter()
    {
        indexes = new int[0]; // For consistency.        
    }

    public TableSorter(TableModel model)
    {
        setModel(model);
    }

    public void setModel(TableModel model) {
        super.setModel(model); 
        reallocateIndexes(); 
    }

    public int compareRowsByColumn(int row1, int row2, int column)
    {
        Class type = model.getColumnClass(column);
        TableModel data = model;

        // Check for nulls

        Object o1 = data.getValueAt(row1, column);
        Object o2 = data.getValueAt(row2, column); 

        // If both values are null return 0
        if (o1 == null && o2 == null) {
            return 0; 
        }
        else if (o1 == null) { // Define null less than everything. 
            return -1; 
        } 
        else if (o2 == null) { 
            return 1; 
        }

/* We copy all returned values from the getValue call in case
an optimised model is reusing one object to return many values.
The Number subclasses in the JDK are immutable and so will not be used in 
this way but other subclasses of Number might want to do this to save 
space and avoid unnecessary heap allocation. 
*/
        if (type.getSuperclass() == java.lang.Number.class)
            {
                Number n1 = (Number)data.getValueAt(row1, column);
                double d1 = n1.doubleValue();
                Number n2 = (Number)data.getValueAt(row2, column);
                double d2 = n2.doubleValue();

                if (d1 < d2)
                    return -1;
                else if (d1 > d2)
                    return 1;
                else
                    return 0;
            }
        else if (type == java.util.Date.class)
            {
                Date d1 = (Date)data.getValueAt(row1, column);
                long n1 = d1.getTime();
                Date d2 = (Date)data.getValueAt(row2, column);
                long n2 = d2.getTime();

                if (n1 < n2)
                    return -1;
                else if (n1 > n2)
                    return 1;
                else return 0;
            }
        else if (type == String.class)
            {
                String s1 = (String)data.getValueAt(row1, column);
                String s2    = (String)data.getValueAt(row2, column);
                int result = s1.compareTo(s2);

                if (result < 0)
                    return -1;
                else if (result > 0)
                    return 1;
                else return 0;
            }
        else if (type == Boolean.class)
            {
                Boolean bool1 = (Boolean)data.getValueAt(row1, column);
                boolean b1 = bool1.booleanValue();
                Boolean bool2 = (Boolean)data.getValueAt(row2, column);
                boolean b2 = bool2.booleanValue();

                if (b1 == b2)
                    return 0;
                else if (b1) // Define false < true
                    return 1;
                else
                    return -1;
            }
        else
            {
                Object v1 = data.getValueAt(row1, column);
                String s1 = v1.toString();
                Object v2 = data.getValueAt(row2, column);
                String s2 = v2.toString();
                int result = s1.compareTo(s2);

                if (result < 0)
                    return -1;
                else if (result > 0)
                    return 1;
                else return 0;
            }
    }

    public int compare(int row1, int row2)
    {
        compares++;
        for(int level = 0; level < sortingColumns.size(); level++)
            {
                Integer column = (Integer)sortingColumns.elementAt(level);
                int result = compareRowsByColumn(row1, row2, column.intValue());
                if (result != 0)
                    return ascending ? result : -result;
            }
        return 0;
    }

    public void  reallocateIndexes()
    {
        int rowCount = model.getRowCount();

        // Set up a new array of indexes with the right number of elements
        // for the new data model.
        indexes = new int[rowCount];

        // Initialise with the identity mapping.
        for(int row = 0; row < rowCount; row++)
            indexes[row] = row;
    }

    public void tableChanged(TableModelEvent e)
    {
        //System.out.println("Sorter: tableChanged"); 
        reallocateIndexes();

        super.tableChanged(e);
    }

    public void checkModel()
    {
        if (indexes.length != model.getRowCount()) {
            System.err.println("Sorter not informed of a change in model.");
        }
    }

    public void  sort(Object sender)
    {
        checkModel();

        compares = 0;
        // n2sort();
        // qsort(0, indexes.length-1);
        shuttlesort((int[])indexes.clone(), indexes, 0, indexes.length);
        //System.out.println("Compares: "+compares);
    }

    public void n2sort() {
        for(int i = 0; i < getRowCount(); i++) {
            for(int j = i+1; j < getRowCount(); j++) {
                if (compare(indexes[i], indexes[j]) == -1) {
                    swap(i, j);
                }
            }
        }
    }

    // This is a home-grown implementation which we have not had time
    // to research - it may perform poorly in some circumstances. It
    // requires twice the space of an in-place algorithm and makes
    // NlogN assigments shuttling the values between the two
    // arrays. The number of compares appears to vary between N-1 and
    // NlogN depending on the initial order but the main reason for
    // using it here is that, unlike qsort, it is stable.
    public void shuttlesort(int from[], int to[], int low, int high) {
        if (high - low < 2) {
            return;
        }
        int middle = (low + high)/2;
        shuttlesort(to, from, low, middle);
        shuttlesort(to, from, middle, high);

        int p = low;
        int q = middle;

        /* This is an optional short-cut; at each recursive call,
        check to see if the elements in this subset are already
        ordered.  If so, no further comparisons are needed; the
        sub-array can just be copied.  The array must be copied rather
        than assigned otherwise sister calls in the recursion might
        get out of sinc.  When the number of elements is three they
        are partitioned so that the first set, [low, mid), has one
        element and and the second, [mid, high), has two. We skip the
        optimisation when the number of elements is three or less as
        the first compare in the normal merge will produce the same
        sequence of steps. This optimisation seems to be worthwhile
        for partially ordered lists but some analysis is needed to
        find out how the performance drops to Nlog(N) as the initial
        order diminishes - it may drop very quickly.  */

        if (high - low >= 4 && compare(from[middle-1], from[middle]) <= 0) {
            for (int i = low; i < high; i++) {
                to[i] = from[i];
            }
            return;
        }

        // A normal merge. 

        for(int i = low; i < high; i++) {
            if (q >= high || (p < middle && compare(from[p], from[q]) <= 0)) {
                to[i] = from[p++];
            }
            else {
                to[i] = from[q++];
            }
        }
    }

    public void swap(int i, int j) {
        int tmp = indexes[i];
        indexes[i] = indexes[j];
        indexes[j] = tmp;
    }

    // The mapping only affects the contents of the data rows.
    // Pass all requests to these rows through the mapping array: "indexes".

    public Object getValueAt(int aRow, int aColumn)
    {
        checkModel();
        return model.getValueAt(indexes[aRow], aColumn);
    }

    public void setValueAt(Object aValue, int aRow, int aColumn)
    {
        checkModel();
        model.setValueAt(aValue, indexes[aRow], aColumn);
    }

    public void sortByColumn(int column) {
        sortByColumn(column, true);
    }

    public void sortByColumn(int column, boolean ascending) {
        this.ascending = ascending;
        sortingColumns.removeAllElements();
        sortingColumns.addElement(new Integer(column));
        sort(this);
        super.tableChanged(new TableModelEvent(this)); 
    }

    // There is no-where else to put this. 
    // Add a mouse listener to the Table to trigger a table sort 
    // when a column heading is clicked in the JTable. 
    public void addMouseListenerToHeaderInTable(JTable table) { 
        final TableSorter sorter = this; 
        final JTable tableView = table; 
        tableView.setColumnSelectionAllowed(false); 
        MouseAdapter listMouseListener = new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                TableColumnModel columnModel = tableView.getColumnModel();
                int viewColumn = columnModel.getColumnIndexAtX(e.getX()); 
                int column = tableView.convertColumnIndexToModel(viewColumn); 
                if(e.getClickCount() == 1 && column != -1) {
                    //System.out.println("Sorting ..."); 
                    int shiftPressed = e.getModifiers()&InputEvent.SHIFT_MASK; 
                    boolean ascending = (shiftPressed == 0); 
                    sorter.sortByColumn(column, ascending); 
                }
             }
         };
        JTableHeader th = tableView.getTableHeader(); 
        th.addMouseListener(listMouseListener); 
    }
}

Я понимаю что так много выкладывать нельзя ну что поделать.Помогите разобраться.
PM MAIL   Вверх
Art2
Дата 4.6.2012, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Смотрю все так и горят желанием объяснить новичку в чем проблема.
PM MAIL   Вверх
AntonSaburov
Дата 4.6.2012, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Во-первых - надо иметь терпение - были выходные и многие к компу даже не подходят.
Во-вторых - а в чем проблема, что надо искать в данном коде ?
PM MAIL WWW ICQ   Вверх
Art2
Дата 5.6.2012, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Окно открывается, но не происходит отрисовка таблицы с данными из базы данных.Что может быть не так? никаких ошибок не выдает.
PM MAIL   Вверх
AntonSaburov
Дата 5.6.2012, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



При быстром ознакомлении с кодом вопрос - а где собственно модель устанавливается в JTable ?

В классе f создается TableSorter, но без указания модели данных. И без последующей установки этой модели.
Т.е. обращения к базе вообще отстутствует как факт.

Я бы пошел пока более простым путем - очень много намешано. TableSorter, JDBCAdapter, TableMap. Причем JDBCAdapter не используется.
"Из-за деревьев леса не видно". Видно, что есть попытка сортировки. 
Класс TableMap не связан толком с моделью - тот же метод getValueAt явно не может работать нормально - он вызывает метод суперкласса, который его по сути не имеет.

Может пока упростить себе задачу ?
PM MAIL WWW ICQ   Вверх
Art2
Дата 6.6.2012, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я новичок и только начал изущение, а с Jtable как то управиться не могу. Можно и упростить этот пример просто нашел было написано рабочий.Я пытаюсь сделать форму на которой находиться просто Jtable он соединяеться с базой данных берет данные и показывает пользователю.
PM MAIL   Вверх
Art2
Дата 7.6.2012, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Может поможете отсечь не нужное чтобы работала нормально.
PM MAIL   Вверх
AntonSaburov
Дата 7.6.2012, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Тут есть принципиальный вопрос - что надо сделать ?
1. Просто вытащить сразу все данные из таблицы и поместить это в JTable ? 
2. Или хочется сделать более сложный вариант - ходить "виртуально" по таблице постранично. Это гораздо сложнее.
PM MAIL WWW ICQ   Вверх
Art2
Дата 7.6.2012, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Второй вариант думаю для изучения будет лучше.Скорей всего для этого нужна сложная Модель Таблицы.
Что для этого надо (форма с JTable и кнопками,модель таблицы которая соединяется с базой и передает данные в  JTable, ....) что то еще?

Это сообщение отредактировал(а) Art2 - 7.6.2012, 18:17
PM MAIL   Вверх
AntonSaburov
Дата 7.6.2012, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Второй конечно лучше для изучения, но требует бОльших усилий.

Надо сначала написать удобнуж модель. Значит берем AbstractTableModel и реализуем по сути три метода

1. public int getRowCount();
2. public int getColumnCount();
3. public Object getValueAt(int row, int column);

По идее надо тогда делать некоторый буфер, который будет содержать какое-то количество строчек из базы данных. Тут надо будет учесть, что получение записей будет зависеть от SQL-сервера. Каждый SQL реализует это по-своему. Это раз.
Второе - раз мы все данные сразу не вытаскиваем, то надо будет организовать более-менее приличное подтягивание нужного куска. Это непростая задача.
Третье - если мы берем данные из таблицы, то количество данных будет меняться. Это тоже неприятно.

Пока можно предположить, что количество данных не меняется. ТОгда задача номер 3 упраздняется.
Второе - предлагаю взять MySQL - там достаточно просто можно организовать вытаскивание нужных кусков данных через добавление limit.
Например 
SELECT * FROM table limit LIMIT 10, 20

Начинаем с 10-й записи и вытащим 20 штук.

ТОгда останется задача 2. Здесь можно попробовать анализировать когда метод getValueAt вызывается первый раз. 
Выделяем некоторый буфер для хранения - тот же List порядка 100 записей. И запоминать с какой по какую запись из таблицы мы в нем храним.
Как только в getValueAt потребуется овый кусок - делаем запрос в базу, вытаскиваем новый кусок, азпоминаем в List.
Ну где-то так.

PM MAIL WWW ICQ   Вверх
Art2
Дата 7.6.2012, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня некоторые проблемы 
1)я не могу установить MySQL
2)как реализовывается 
 public int getRowCount();
 public int getColumnCount();
 public Object getValueAt(int row, int column);

если можно ссылка на статью и на работающий код примерный.

Данные в таблице будут обновляться где то раз в день.
PM MAIL   Вверх
AntonSaburov
Дата 7.6.2012, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



1. Если есть возможности получать такие же варианты с Derby - используй Derby. Просто я ее не знаю.
2. 
getRowCount - ну видимо надо сделать запрос к базе типа SELECT COUNT(*) FROM table
getColumnCount - ну сколько там у тебя слобцов - по идее число постоянное.
getValueAt - а вот это и есть главная проблема. Для заглушки можешь пока сделать возврат постоянной строки. Когда отладишь вариант с первыми двумя функциями и прочей графикой - можно будет плотно заняться и этим.

Само собой в модели надо будет сразу сделать коннект к базе. А может и более прилично - сделать коннект раньше (например при старте приложения) и его уже отдать в модель. Хотя и это не супер красиво, но для начала нормально.

PM MAIL WWW ICQ   Вверх
Art2
Дата 7.6.2012, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо будем пробывать.
PM MAIL   Вверх
Art2
Дата 8.6.2012, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Форму я создал вроде посмотрите
Код

import java.awt.Color;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.BevelBorder;

/**
 *
 * @author 666
 */
public class fram extends JFrame{
    private static final long serialVersionUID = 1L;
    private mod model;
    public fram(){
    JTable tb = new JTable();
    JScrollPane tableAggregate = new JScrollPane(tb);
    tableAggregate.setBorder(new BevelBorder(BevelBorder.LOWERED));
    JPanel mainPanel = new JPanel();
    mainPanel.add(tableAggregate);
    JFrame fr = new JFrame("база");
    fr.addWindowListener(new WindowAdapter()
    {
       public void windowClosing(WindowEvent e)
      {
        System.exit(0);
      }
});
    fr.setBackground(Color.lightGray);
    fr.getContentPane().add(mainPanel);
    fr.pack();
    fr.setBounds(200, 200, 640, 480);
    fr.setVisible(true);
}
     public void windowClosing(WindowEvent e)
      {
        System.exit(0);
      }
public static void main(String[] args)
    {
        fram fram = new fram();
    }
}

А вот с моделью проблемы.Для статических данных могу сделать, а вот для работы с базой трудности.Можете что то посоветовать статьи там книги именно про модель таблицы для работы с базой.Или как нибудь объяснить как работает модель с базой.
PM MAIL   Вверх
AntonSaburov
Дата 8.6.2012, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Если по варианту простого втягивания всех данных сразу, то тут неплохо - http://www.javatalks.ru/sutra44951.php

А вот вариант постраничного - http://www.java2s.com/Code/Java/Swing-JFC/...argedataset.htm
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0626 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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