powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Не работает обновление JTable
7 сообщений из 7, страница 1 из 1
Не работает обновление JTable
    #39166150
RENO4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После выполнения
Код: java
1.
	int rs = q.executeUpdate("INSERT INTO zyx.diccities (title, tel_prefix) values ('" + tfTitle.getText() + "', '" + tfTel_prefix.getText() + "')");



таблица JTable не перерисовывается, хотя данные в БД вставляются и после следующего запуска приложения отображаются.

Не помогает ни один из методов ниже.
Код: java
1.
2.
3.
	tmCity.fireTableRowsInserted(tmCity.getRowCount() - 1, tmCity.getRowCount() - 1);
	tCity.repaint();
	tCity.revalidate();


где
private DatabaseTableModel tmCity;
private JTable tCity;

У кого какое мнение о том, что я упустил?
...
Рейтинг: 0 / 0
Не работает обновление JTable
    #39166151
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RENO4После выполнения
Код: java
1.
	int rs = q.executeUpdate("INSERT INTO zyx.diccities (title, tel_prefix) values ('" + tfTitle.getText() + "', '" + tfTel_prefix.getText() + "')");



таблица JTable не перерисовывается, хотя данные в БД вставляются и после следующего запуска приложения отображаются.

Не помогает ни один из методов ниже.
Код: java
1.
2.
3.
	tmCity.fireTableRowsInserted(tmCity.getRowCount() - 1, tmCity.getRowCount() - 1);
	tCity.repaint();
	tCity.revalidate();


где
private DatabaseTableModel tmCity;
private JTable tCity;

У кого какое мнение о том, что я упустил?
А где добавление данных в tmCity?
...
Рейтинг: 0 / 0
Не работает обновление JTable
    #39166208
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RENO4,

repaint/revalidate - нахрен. Не нужны они тут.
executeUpdate добавляет данные в БД, каким образом оно с JTable связано?
Где TableModel?
Используйте PreparedStatement для работы с параметрами SQL запроса. У вас тут SQL Injection обыкновенный.
...
Рейтинг: 0 / 0
Не работает обновление JTable
    #39166811
RENO4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,

Сделал
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
	public void refresh (ResultSet rs) throws SQLException {
		ResultSetMetaData rsmd = rs.getMetaData();
		data.clear();
		int columnCount = rsmd.getColumnCount();

		while (rs.next()) {
			ArrayList<String> row = new ArrayList<String>();
			for (int i = 0; i < columnCount; i++) {
				row.add (rs.getString (i + 1));
			}
			synchronized (data) {
				data.add (row);
				this.fireTableRowsInserted(data.size() - 1, data.size() - 1);
			}
		}
		fireTableRowsInserted(data.size() - 1, data.size() - 1);
	}



Потом оказалось, что ResultSet оказался закрытым, пришлось писать еще код, чтобы еще раз его заново открыть, фактически еще раз выполнить SELECT:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
	private ResultSet selectDicRow (Statement q, int t) {
		String qs = null;
		switch (t) {
		case 0:
			break;
		case 1:
			break;
		case 2:
			qs = "SELECT title, tel_prefix FROM zyx.diccities ORDER BY title";
			break;
		case 3:
			qs = "SELECT t.title_short, s.title FROM zyx.dicstreets s JOIN zyx.dicstreettypes t ON t.si = s.si_streettype ORDER BY si_city, title";
			break;
		default:
			break;
		}

		ResultSet rs = null;
		try {
			rs = q.executeQuery(qs);
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		return rs;
	}



и перед вызовом Refresh запускать вызов selectDicRow. Как-то грустно от такой логики, неужели все так плохо в Java?
...
Рейтинг: 0 / 0
Не работает обновление JTable
    #39166816
RENO4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Сначала было так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
		try {
			rsCity = q.executeQuery ("SELECT title, tel_prefix FROM zyx.diccities ORDER BY title");
			tmCity = new DatabaseTableModel (rsCity);
			tmCity.setColumnName(0, "Название города");
			tmCity.setColumnName(1, "Телефонный префикс");
			tCity = new JTable (tmCity);
//			tCity.setTableHeader (headCity);
			tCity.addMouseListener(this);
		}
		catch (Exception eo) {
			eo.printStackTrace();
		}



Теперь, после всего, уже заменил вызов q.executeQuery на selectDicRow
...
Рейтинг: 0 / 0
Не работает обновление JTable
    #39166824
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RENO4Как-то грустно от такой логики, неужели все так плохо в Java?
Во-первых Swing и JDBC это не вся Java. С Java всё отлично. А вот от логики которую вы напедалировали, действительно, грустно.
...
Рейтинг: 0 / 0
Не работает обновление JTable
    #39166849
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RENO4,

Косяки, которые бросаются в глаза:
- data.clear() удаляет все строки, но соответствующей нотификации мы модели не посылаем. Потом мы добавляем строки, но вызывает fireTableRowsInserted. С точки зрения событий выходит что строки только добавляются?
- Забавно видеть как метод fireTableRowsInserted с параметрами "от" и "до" вызывается в цикле для каждой новой строки.
- synchronized в однопоточном GUI. Ну, просто чтобы был, да? Хорошо что в современной JVM есть оптимизация такой ситуации.
- ResultSet постоянно создаётся и не понятно где закрывается. Так очень просто организовать утечку как памяти так и соединений к базе.
- Нужно контролировать чтобы addMouseListener() в одном месте вызывался не более одного раза. Иначе без удаления будет ещё одна утечка памяти.
- Работу с БД хорошо бы организовать через SwingWorker. Иначе UI будет замирать во время запросов и вы опять будете говорить что это Java тормозит.

Это по коду. Теперь концептуально. Нужно для начала продумать как именно вы хотите подружить UI с базой. Есть несколько вариантов.
1) Использовать scrollable result set и напрямую читать в TableModel из ResultSet. Из недостатков, необходимость держать соединение с БД и общая тормознутость. Основной плюс - нет ограничения по объему данных.
2) Вычитываем запросом всё в память. TableModel читает из памяти. Тут есть варианты. Наиболее распространенный подход это, конечно же ArrayList. Но есть и альтернатива в виде RowSet/CachedRowSet, которая будет по коду очень совместима с первым вариантом.
3) Самым сложным вариантом является постраничное чтение, которое позволяет минимизировать данные в памяти, но при этом иметь доступ к большому объему данных. Пользы от этого, правда, мало, а реализация будет очень сложной. К тому же для словарей не актуально вообще.

Ну, и по вашему коду очень сложно понять чего вы вообще пытаетесь добиться? Чтение из разных таблиц в одну JTable? Обновление из БД по нажатию кнопки?
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Не работает обновление JTable
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]