Bilal Zafar Ответов: 1

Показать большой набор результатов из базы данных в jtable с прокруткой страниц в java swing


Всем привет,
Я очень новичок в java, поэтому, пожалуйста, не обращайте внимания, если вы считаете этот вопрос глупым. Мне была поставлена задача, в которой я должен извлечь данные из таблицы базы данных h2 с * * более чем 1 крорными строками (SAD) из одной таблицы.** и, наконец, показать эти данные в J-таблицу с разбиением на страницы.
Что я точно хочу, так это то, что когда программа запускается, она извлекает, скажем, 1 запись lac из базы данных, а когда пользователь прокручивает вниз до конца первых записей lac и снова извлекает другие данные lac из базы данных и так далее …
Будет лучше, если он пойдет прокручивать вверх, программа не извлекает строки, которые уже извлечены. Надеюсь,я очень хорошо объяснил свою проблему.
Теперь, после долгих поисков в гугле, я нашел вот это (https://coderanch.com/t/345383/java/JTable-Paging)очень хорошая статья, которая делает 90% того, что я хочу, но не с подключением к базе данных. Может ли кто-нибудь сказать, как это сделать ?
Вот пример кода :

Что я уже пробовал:

public class PagingTableModel extends AbstractTableModel {
	private static final int MAX_PAGE_SIZE = 1000000;
	private static final int LATENCY_MILLIS = 1500;
	private int dataOffset = 0;
	private ArrayList<Integer> data = new ArrayList<Integer>();
	private SortedSet<Segment> pending = new TreeSet<Segment>();
	public int getColumnCount() {
		return 2;
	}
	public String getColumnName(int col) {
		if (col == 0)
			return "ANUMBER";
		if (col == 1)
			return "BNUMBER";
		return "DATETIME";
	}
	public int getRowCount() {
		return 10000000; // one million
	}
	public Object getValueAt(int row, int col) {
		ArrayList<Integer> page = data;
		int pageIndex = row - dataOffset;
		//JOptionPane.showMessageDialog(null, dataOffset);
		if (pageIndex < 0 || pageIndex >= page.size()) {
			System.out.println("object at " + row + " isn't loaded yet");
			schedule(row);
			return "..";
		}
		Object rowObject = page.get(pageIndex);
		return rowObject;
	}
	private void schedule(int offset) {
		if (isPending(offset)) {
			return;
		}
		int startOffset = Math.max(0, offset - MAX_PAGE_SIZE / 2);
		int length = offset + MAX_PAGE_SIZE / 2 - startOffset;
		load(startOffset, length);
	}
	private boolean isPending(int offset) {
		int sz = pending.size();
		if (sz == 0)
			return false;
		if (sz == 1) {
			Segment seg = pending.first();
			return seg.contains(offset);
		}
		Segment lo = new Segment(offset - MAX_PAGE_SIZE, 0);
		Segment hi = new Segment(offset + 1, 0);
		for (Segment seg : pending.subSet(lo, hi)) {
			if (seg.contains(offset))
				return true;
		}
		return false;
	}
	private void load(final int startOffset, final int length) {
		final Segment seg = new Segment(startOffset, length);
		pending.add(seg);
		Runnable fetch = new Runnable() {
			public void run() {
				try {
					Thread.sleep(LATENCY_MILLIS);
				} catch (InterruptedException ex) {
					System.out.println("error retrieving page at " + startOffset + ": aborting");
					pending.remove(seg);
					return;
				}
				final ArrayList<Integer> page = new ArrayList<Integer>();
				for (int j = 0; j < length; j += 1) {
					page.add(new Integer(j + startOffset));
				}
				SwingUtilities.invokeLater(new Runnable() {
					public void run() {
						System.out.println("** loaded " + startOffset + " through " + (startOffset + length - 1));
						setData(startOffset, page);
						pending.remove(seg);
					}
				});
			}
		};
		new Thread(fetch).start();
	}
	private void setData(int offset, ArrayList<Integer> newData) {
		// This method must be called from the event dispatch thread.
		int lastRow = offset + newData.size() - 1;
		dataOffset = offset;
		data = newData;
		fireTableRowsUpdated(offset, lastRow);
	}
	public static void main(String[] argv) {
		JTable tab = new JTable(new PagingTableModel());
		JScrollPane sp = new JScrollPane(tab);
		JFrame f = new JFrame("PagingTableModel");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setContentPane(sp);
		f.setBounds(30, 50, 1300, 600);
		f.setVisible(true);
	}
	static final class Segment implements Comparable<Segment> {
		private int base = 0, length = 1;
		public Segment(int base, int length) {
			this.base = base;
			this.length = length;
		}
		public boolean contains(int pos) {
			return (base <= pos && pos < base + length);
		}
		public boolean equals(Object o) {
			return o instanceof Segment && base == ((Segment) o).base && length == ((Segment) o).length;
		}
		public int compareTo(Segment other) {
			int d = base - other.base;
			if (d != 0)
				return d;
			return length - other.length;
		}
	}
}

1 Ответов

Рейтинг:
0

KarstenK

Открытие базы данных и извлечение данных обходится дорого, поэтому обычно это куча данных, которые извлекаются, хранятся в модели данных и затем отображаются. Я бы извлек набор данных по крайней мере на две страницы в зависимости от скорости.

А как-то похоже пример извлекая все данные и сохраняя их в простом массиве модели ("данные").


Bilal Zafar

Я могу привязать свой результирующий набор к моей jtable, но все сразу, что, очевидно, неприемлемо в моем случае. Мне нужно знать, как делать это кусками