Замороженные столбцы JTable не прокручиваются (Java 1.6) - PullRequest
1 голос
/ 04 августа 2011

Я переношу приложение с Java 1.5 на 1.6 (да, я знаю).

У нас есть таблица с несколькими замороженными столбцами. Построено так (примерно)

JScrollPane tablePane = new JScrollPane();
JTable mainTable = new JTable();
JTable frozenTable = new JTable()
JPanel rowHeaderPanel = new JPanel();
rowHeaderPanel.add(frozenTable);

tablePane.setRowHeaderView(rowHeaderPanel);
tablePane.setViewportView(mainTable);

(в таблицах моделей для основного и замороженного таблиц всегда одинаковое количество строк)

Это работало так, как мы хотели в Java 1.5, то есть: у нас была таблица данных с несколькими замороженными столбцами в левой части. Прокрутка панели вертикально прокручивала обе таблицы в унисон.

Без каких-либо изменений кода, кроме перехода на Java 1.6, теперь у нас есть периодическая и (в среде разработчика) ошибка, которую невозможно воспроизвести.

Иногда при вертикальной прокрутке прокручивается только основная таблица - замороженная таблица вообще не прокручивается. Таблицы отображаются несвязанными.

Кто-нибудь видел что-нибудь подобное раньше?

Ответы [ 3 ]

4 голосов
/ 04 августа 2011

Характер проблемы с перебоями должен побудить пользователя проверить, что компоненты GUI созданы в потоке диспетчеризации событий .Переход на 1.6, возможно, изменил время настолько, чтобы выявить такую ​​аномалию.

2 голосов
/ 04 августа 2011

Согласен, это сложная проблема. Но способ, которым мы это делаем, немного отличается, и в настоящее время он работает в рабочей среде под Java 6. Таким образом, это может помочь решить проблему IMO. Я попытался использовать те же имена переменных, что и в исходном коде. Вот код, который мы используем:

JViewport viewport = new JViewport();
viewport.setView(frozenTable);
viewport.setPreferredSize(frozenTable.getPreferredSize());
tablePane.setRowHeaderView(viewport);
tablePane.setCorner(JScrollPane.UPPER_LEFT_CORNER,frozenTable.getTableHeader());
2 голосов
/ 04 августа 2011

Я не видел ничего подобного раньше, и, поскольку он невоспроизводим, его будет сложно отлаживать. Я предлагаю рассмотреть его как можно меньший пример (в основном SCCEE) и посмотреть, воспроизводите ли вы поведение. Если он все еще существует, то это может быть связано с 1.6, но я сомневаюсь в этом. Если он больше не существует, то это может быть что-то еще, происходящее в фоновом режиме в то же время.

...