powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / TreeTable - кто каким пользуется?
39 сообщений из 39, показаны все 2 страниц
TreeTable - кто каким пользуется?
    #34109744
Vladimir Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А где бы скачать компоненту... тьфу. :)

В общем появилась необходимость в TreeTable. Посмотрел реализацию SwingX. Очень похоже на то что описывалось на сайте Sun (уж не знаю что из них первоисточник). Однако необходимость субклассировать DefaultMutableTreeNode под конкретную модель не очень вдохновила.

В связи с этим есть следующие соображения - передавать в конструктор экземпляр наследника от AbstractTableModel, дабы дерево из него ячейки тягало, а для построения дерева субклассировать DefaultTreeTableModel, передать его конструктору строковые параметры KeyField, ParentField, DisplayField, RootValue (то есть имена полей/колонок по которым построится дерево, и корневое значение), и написать внутрё построители чайлдов. Тогда получается универсальный класс модели дерева, который строит представление на базе переданной ему модели таблицы.

Кто-то с подобным игрался?
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34109792
marx_freedom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на сайте Sun есть конечно очень интересная статья (3 части) про TreeTable, только вот в конце написаны "недоделки" - какие именно, точно не помню и посмотреть сейчас не успеваю, но явно чего-то нужного мне не хватало. я остановился на использовании компонента из SwingX, пусть и пришлось унаследоваться от DefaultMutableTreeNode.
--
Солнце встанет непременно!
jabber id: marx [.at.] jabber [.dot.] ru
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34109949
Vladimir Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
marx_freedomна сайте Sun есть конечно очень интересная статья (3 части) про TreeTable, только вот в конце написаны "недоделки" - какие именно, точно не помню и посмотреть сейчас не успеваю, но явно чего-то нужного мне не хватало. я остановился на использовании компонента из SwingX, пусть и пришлось унаследоваться от DefaultMutableTreeNode.


Наследник DefaultMutableTreeNode там имеет три ключевых метода: getChildren, isLeaf, toString. Замечательно. Передадим в наследника DefaultTreeTableModel экземпляр AbstractTableModel, этот же экземпляр транзитом поедет в конструктор наследника DefaultMutableTreeNode. В нем - вектор хэшей, который представляет собственно датасет (каждый хэш - строка). В DefaultMutableTreeNode добавим экземпляр хэша (грубо говоря ссылки на строку датасета). Тогда в нашем наследнике DefaultMutableTreeNode, получается, есть _всё_ для реализации getChildren, isLeaf, toString, абсолютно независимой от структуры столбцов :)

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

В общем код который с классами работает, получился таким:

FXDTreeModel mdl = new FXDTreeModel(MyDatasetTableModel, stringKeyFieldName,stringParentFieldName,valueRootKey);
this.jXTreeTable1.setTreeTableModel(mdl);

это переменная часть кода которая подхватывает TableModel а вся логика дерева упрятана в класс и работает в зависимости от данных/метаданных датасета.
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34110098
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
от меня 15 копеек...

вот эта sunовская приверженность к wrapperам всегда меня поражала, да же в StudioCreator'e ObjectProviderы тоже так по извратски сделаны. Ну нафига мне Node'ы в control'ах - мне всегда свои данные показывать надо, и кучу моделей делать в облом
в JFace stateless Provider'ы - ну гораздо красивее

swing в оцтой
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34110137
Vladimir Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
expp
в JFace stateless Provider'ы - ну гораздо красивее
swing в оцтой

А JFace и SWT могут работать с нетбинсовским дизайнером? Или дизайнеру пофиг, лишь бы BeanInfo был? У меня опыта работы с SWT - ноль. Только скриншоты видел :)
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34111345
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
канешь не могут. или Swing или JFace. Просто дизайнеров Swingа я нипанимаю....
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34111597
Vladimir Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exppканешь не могут. или Swing или JFace. Просто дизайнеров Swingа я нипанимаю....

А в чем JFace интерфейсы конструировать? _Только_ в эклипсе? И где можно внятно почитать - чем таким JFace/SWT лучше чем свинг? C конкретными аргументами?
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34113161
alexx726
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне что-то реализация SwingSet не понравилась (уже не помню почему, что-то с ней было не так).

Выбрал L2FProd PropertySheet (пока применение ограничивается реализацией Object и DB Inspector. Разумеется, несколько Display Fields не забабахаешь - а надо ли?).
А их "компонента" собственно и есть реализация AbstractTableModel. Единственная проблема - нулевую колонку сам не отрисуешь да и напильничком бы их табличку обработать :)
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34113267
Vladimir Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexx726
Выбрал L2FProd PropertySheet (пока применение ограничивается реализацией Object и DB Inspector. Разумеется, несколько Display Fields не забабахаешь - а надо ли?).
А их "компонента" собственно и есть реализация AbstractTableModel.

Там напильником пилить и пилить...
Вот на картинке собственно то чего мне хотелось. Пока еще в процессе отладки/шлифовки. Зато кормится данными из моего датасета, который тоже которую неделю из-под напильника не вылазит.

Дилемма - для редакторов полей написать интерфейс CellEditorProvider или эвент OnCellEditorComponentNeeded ??? :) Мне это и в гриде нужно - я предусматриваю разные типы редакторов в одной и той же колонке в зависимости от данных в строке датасета...
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34113292
Vladimir Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexx726Мне что-то реализация SwingSet не понравилась (уже не помню почему, что-то с ней было не так).


Бугага. Посмотрел я на скриншоты свингсета:

http://swingset.sourceforge.net/Example7.php

Господа прикалываюцца или всерьез? Если эдитор в ячейке подобно Ленину - вечно живой - в этом какой-то сакральный смысл?
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34113882
alexx726
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажу по секрету - у меня тоже DataSet уже которую неделю из под напильника не вылазит )) Отсюда и злобность на Java...

Боюсь что ты неправильно вопрос задал (было упомянуто слово DisplayField, без множественного числа) -разумеется, тебе это "творение" не подходит.

C "едиторами" я благо вопрос решил раз и навсегда для любого потомка моей JTable и editor'a - реализатора моего интерфейса (опять же - "равнокриво", но пока устраивает)

А по поводу "бугага" - вот такое же "бугага" есть и в PropertySheet (я уже задолбался при каждом Event'e на DataSet типа "смени Label пожалста" ПОЛНОСТЬЮ перерисовывать их табличку)
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34113955
Vladimir Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexx726Скажу по секрету - у меня тоже DataSet уже которую неделю из под напильника не вылазит )) Отсюда и злобность на Java...


"Пилите, Шура, пилите - они золотые!" (с) Паниковский

alexx726
Боюсь что ты неправильно вопрос задал (было упомянуто слово DisplayField, без множественного числа) -разумеется, тебе это "творение" не подходит.


В моём понимании - DisplayField это то что показывается собственно в узлах дерева (в моем скриншоте это код бухсчета). Остальное - это так, колонки приблудные... :)

alexx726
C "едиторами" я благо вопрос решил раз и навсегда для любого потомка моей JTable и editor'a - реализатора моего интерфейса (опять же - "равнокриво", но пока устраивает)


Как, если не секрет? Я вижу два подхода - или передавать конструктору указатель на интерфейс реализующий создание эдиторов, или когда понадобился эдитор бросать эвент и возвращать эдитор из листенера. А у тебя как сделано?
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34113987
alexx726
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Как, если не секрет? Я вижу два подхода - или передавать конструктору указатель на интерфейс реализующий создание эдиторов, или когда понадобился эдитор бросать эвент и возвращать эдитор из листенера. А у тебя как сделано?"

Ну насчет конечно разных "едиторов" в разных строчках я пожалуй погорячился
(я просто пока не знаю как мне это в рунтайме организовать, в смысле как это прописывать в DataSet :))
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34114510
Vladimir Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexx726"Как, если не секрет? Я вижу два подхода - или передавать конструктору указатель на интерфейс реализующий создание эдиторов, или когда понадобился эдитор бросать эвент и возвращать эдитор из листенера. А у тебя как сделано?"

Ну насчет конечно разных "едиторов" в разных строчках я пожалуй погорячился
(я просто пока не знаю как мне это в рунтайме организовать, в смысле как это прописывать в DataSet :))

Мое мнение - из грида наружу должно торчать нечто, которое передает наружу через эвент или через вызов функции имя поля и данные в строке, и получает экземпляр контрола для текущей редактируемой ячейки. Это задача не модели а view/controller-а.
То есть на все столбцы в ColumnModel вешается некий объект, который отрабатывает getCellEditorComponent, из него дергает нечто что отдает ему нужный контрол (ну там же можно и кастомные рендеры присобачить). В результате - грид и модель пишутся один раз и про них забываем, а контролы когда в них возникнет надобность приедут из обработчика событий грида.
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34114941
alexx726
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну правильно - получишь как раз вариант реализации DevExpress.
Только ломает... :)

Мне, скажем вариант "покажи мне в строчке 1 checkbox, а в строчке 2 ButtonEdit" пригодился до сих пор только один раз - в форме абстрактных аттрибутов чего-либо (а потом все-равно выяснилось, что нужна Custom форма :)). Так что в Java я этого делать не буду.

А если нужен один и тот же компонент - то все разруливается на уровне lookupSQL. Правда, придется запрос обновлять при прорисовке - как это скажется на производительности?
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34116328
Vladimir Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexx726
Мне, скажем вариант "покажи мне в строчке 1 checkbox, а в строчке 2 ButtonEdit" пригодился до сих пор только один раз - в форме абстрактных аттрибутов чего-либо (а потом все-равно выяснилось, что нужна Custom форма :)). Так что в Java я этого делать не буду.


У меня в документе таможенного импорта в одной и той же ячейке может выскакивать либо чекбокс либо выпадающий список. Сейчас этот документ чуть подзаброшен в связи с рефакторингом фреймворка, но я подозреваю что когда вернусь к нему - там еще и баттон с выскакивающим диалогом может понадобиться.

alexx726
А если нужен один и тот же компонент - то все разруливается на уровне lookupSQL. Правда, придется запрос обновлять при прорисовке - как это скажется на производительности?

Обновлять при прорисовке может не понадобиться - в setCellEditor передаешь объект, внутри которого живет датасет кэширующий данные. Объект соответственно extends AbstractCellEditor implements TableCellRenderer, TableCellEditor, ActionListener, в нем живет контрол создающийся в конструкторе и вылезающий наружу через getTableCellEditorComponent.
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34116584
alexx726
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Kozlov
Обновлять при прорисовке может не понадобиться - в setCellEditor передаешь объект, внутри которого живет датасет кэширующий данные. Объект соответственно extends AbstractCellEditor implements TableCellRenderer, TableCellEditor, ActionListener, в нем живет контрол создающийся в конструкторе и вылезающий наружу через getTableCellEditorComponent.

Дык в том то все и дело - а если это разные варианты ComboBox? Ну разные у них DataSet'ы :)) Что, все сразу заполнить? А сколько их?
По mainDataSet пробежаца и выяснить?
Лениво да и формализуется муторно (как я объясню своему dataSetField какой брать - скриптом?)
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34116688
Vladimir Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexx726
Дык в том то все и дело - а если это разные варианты ComboBox? Ну разные у них DataSet'ы :)) Что, все сразу заполнить? А сколько их?
По mainDataSet пробежаца и выяснить?
Лениво да и формализуется муторно (как я объясню своему dataSetField какой брать - скриптом?)

Тогда попа. Ну не совсем попа - в основном датасете можно замутить OnCalcFields, чтобы каждый раз при перерисовке по базе не шоркаться а единожды для каждой потребовавшейся записи за значением сбегать и закэшировать, а для эдитора - завести какой-то хэштейбл в котором будет лежать пополняемый при необходимости набор датасетов. Если нужный лукапу датасет в хэштейбле присутствует - берем оттуда, если нет - создаем новый и пихаем в хэштейбл. Ну а "какой брать" - добавь LookupSQL в dataSetField :) (он же и ключом хэша может быть)
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34116859
alexx726
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нее - я ж говорю, муторно...Ленивый я :)
Да и завязано уже все на единый Controller для всего столбца, ну его нафиг.
Уже и так путаца начинаю в своем DataSet - после TableController, InspectorController, FormController + привязки FixedColumns + SummaryFixedRows
и взаимодействия 4-х JTable совсем мозги разъежаются :) А еще бы Groupable Headers ко всему этому безобразию сделать...

Так что от таких "горячих" таблиц я лично откажусь
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34117003
Vladimir Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexx726нее - я ж говорю, муторно...Ленивый я :)
Да и завязано уже все на единый Controller для всего столбца, ну его нафиг.
Уже и так путаца начинаю в своем DataSet - после TableController, InspectorController, FormController + привязки FixedColumns + SummaryFixedRows
и взаимодействия 4-х JTable совсем мозги разъежаются :) А еще бы Groupable Headers ко всему этому безобразию сделать...

Так что от таких "горячих" таблиц я лично откажусь

Groupable Headers - я взял сэмпл из инета и переколбасил его чтоб как в EhGrid-е поведение было. Правда на более чем одном уровне группировки не тестил (и работать не будет, не закладывал такой функционал, бо не надо мне).
Кстати поделись идеей как SummaryFixedRows сделал. Решение "в лоб" - увеличить результат getRowCount в модели и отслеживать getValueAt, но суммари будет скроллиться, а чтоб не скроллилось есть подозрение что JScrollPane перекрывать надо...
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34117566
alexx726
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Kozlov
Groupable Headers - я взял сэмпл из инета и переколбасил его чтоб как в EhGrid-е поведение было. Правда на более чем одном уровне группировки не тестил (и работать не будет, не закладывал такой функционал, бо не надо мне).
Кстати поделись идеей как SummaryFixedRows сделал. Решение "в лоб" - увеличить результат getRowCount в модели и отслеживать getValueAt, но суммари будет скроллиться, а чтоб не скроллилось есть подозрение что JScrollPane перекрывать надо...

Как сделал? Да по рабоче-крестьянски. Как учат :) Добавляешь новый ScrollPane к панельке с mainScroll, убираешь у него VerticalScrollBar, убираешь у mainScroll HorizontalScrollBar и синхронизуешь HorizontalScrollBar новенького гаденыша с основным. Ежель нужен код - то завтра, на работе. Геморрой разумеется есть с fixedColumns (но это решается, хотя и крышу малость повело от синхронизации). Сами значения Summary храню в Field'е и пересчитываю при всяческих изменениях (поддерживаю пока только COUNT, SUM, AVG, MIN, MAX, CONSTANT - типа текст "Итого:")
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34117588
Vladimir Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexx726
Как сделал? Да по рабоче-крестьянски. Как учат :) Добавляешь новый ScrollPane к панельке с mainScroll, убираешь у него VerticalScrollBar, убираешь у mainScroll HorizontalScrollBar и синхронизуешь HorizontalScrollBar новенького гаденыша с основным. Ежель нужен код - то завтра, на работе. Геморрой разумеется есть с fixedColumns (но это решается, хотя и крышу малость повело от синхронизации). Сами значения Summary храню в Field'е и пересчитываю при всяческих изменениях (поддерживаю пока только COUNT, SUM, AVG, MIN, MAX, CONSTANT - типа текст "Итого:")

Ой. и в том скроллпане еще один тейбл?

На случай если у тебя под фикседколумнс тоже отдельный тейбл - похвастаюсь: у меня фиксированные и горизонтально-прокручиваемые колонки в одном тейбле. Автор идеи - какой-то не то индус не то японец, правда в его реализации был полный бардак с убиванием эдитора после редактирования, так что код пришлось перетрясти слегка.
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34117628
alexx726
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот-вот
Кстати, хороший вопрос для обсуждения - наличие 4-х Tables вместо одной :)
Я пока встретил только плохую и очень плохую реализации. Думаю, что и первоисточник у нас с тобой один :) Только когда я вижу paint() с вызовом getRowcount(), я плачу
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34118263
Vladimir Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexx726вот-вот
Кстати, хороший вопрос для обсуждения - наличие 4-х Tables вместо одной :)
Я пока встретил только плохую и очень плохую реализации. Думаю, что и первоисточник у нас с тобой один :) Только когда я вижу paint() с вызовом getRowcount(), я плачу

Похоже что да, первоисточник один. Во всяком случае paint() с вызовом getRowcount() там присутствует. Кстати, покажи код editingStopped из твоего варианта - там в первоисточнике один очень сомнительный кусочек кода, интересно глянуть что ты с ним сделал :) А то у меня большое подозрение что там вкопана мина в виде Invalid Cast Exception...
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34118352
alexx726
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дык я ж его не юзал - говорю, заплакал когда увидел перерисовку всех ячеек таблицы (и видимых, и невидимых) после каждого чиха. Не знаю я, как его переделать...
Так что у меня 4 JTable )))
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34118643
Vladimir Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexx726дык я ж его не юзал - говорю, заплакал когда увидел перерисовку всех ячеек таблицы (и видимых, и невидимых) после каждого чиха. Не знаю я, как его переделать...
Так что у меня 4 JTable )))

4 JTable тоже не кузяво... секса с синхронизацией многовато должно быть. Так что надо искать решение.
Кстати, нигде не попадались какие-то коммерческие гриды в сорцах? Можно было бы там подглядеть по какому пути они пошли.

А что касается перерисовки после каждого чиха - так у меня в приложении есть одна хитропопая таблица, там при отключении всех фильтров и ограничений вылазит >2000 строк, при этом 3 столбца зафиксированы а еще 10 прокручиваются. Основная шиза - ячейки в этих 10 столбцах вычисляемые, причем на каждую ячейку дергается заранее отпрепаренная хранимая процедура на сервере ASA (правда вычисленные значения датасет кэширует, так что попусту два раза одна ячейка сервер не дернет, да и ASA - пацанчик шустренький). Плюс к тому серверная процедура вызывается только для тех ячеек которые на экране умещаются.
Так вот, взял я свою дельфишную программу (которую на жабу портирую), там такой же грид, и по секундомеру засек время полной прокрутки грида из начала в конец. Потом с явовской то же самое сделал. Время совпадает с точностью плюс-минус 5 процентов... так что не всё так плохо...
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34118740
alexx726
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть сырцы JSuite, но там только RowLabel (видимо что-то типа JList)
пробовал декомпилять JIDE, но там такая обфускация, что черт ногу сломит. Правда, похоже что также n-ое число гридов.
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34118848
alexx726
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Kozlov
А что касается перерисовки после каждого чиха...

По поводу сравнения скоростей - полностью согласен. Отличие от Дельфи - в хранении данных (я вот все думаю - не избавица ли мне от BigDecimal :))
Вот и получается, что при равноценных DataSet жаба выигрывает при перевалирующем кол-ве String полей, а дельфа - числовых. Увы, DataSet обычно больше числовые (
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34118914
Vladimir Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexx726Отличие от Дельфи - в хранении данных (я вот все думаю - не избавица ли мне от BigDecimal :))
Вот и получается, что при равноценных DataSet жаба выигрывает при перевалирующем кол-ве String полей, а дельфа - числовых. Увы, DataSet обычно больше числовые (

Вот я думаю - а не сделать ли типизированные поля, чтоб в зависимости от FieldType пихать значение не в объект а в простой тип.
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34119112
alexx726
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Kozlov alexx726Отличие от Дельфи - в хранении данных (я вот все думаю - не избавица ли мне от BigDecimal :))
Вот и получается, что при равноценных DataSet жаба выигрывает при перевалирующем кол-ве String полей, а дельфа - числовых. Увы, DataSet обычно больше числовые (

Вот я думаю - а не сделать ли типизированные поля, чтоб в зависимости от FieldType пихать значение не в объект а в простой тип.

Простые низзя ( я только getObject() пользую), только если репперы. Даже имею галку на DataSet'е. В итоге получаем выигрыш по памяти 1.5-2 раза (даже если Long использовать)
Правда, однотипность полей облегчает всяческие проверки и т.д. Но боюсь в результате организации некоего своего черного ящичка ничего хорошего не получица
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34121049
Vladimir Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexx726
Простые низзя ( я только getObject() пользую), только если репперы. Даже имею галку на DataSet'е. В итоге получаем выигрыш по памяти 1.5-2 раза (даже если Long использовать)
Правда, однотипность полей облегчает всяческие проверки и т.д. Но боюсь в результате организации некоего своего черного ящичка ничего хорошего не получица

Почему же? Хранить в метаданных поля int который определяет тип данных, и сделать набор перегруженных методов get/set оперирующих простыми типами.
Соответственно в самом поле - набор значений разных простых типов.
Далее - сравниваем тип поля с ожидаемым в методе, если совпадает - работаем с требуемым значением как с простым типом, а если не совпадает - вытаскиваем значение в соответствии с типом поля и приводим к нужному типу. В большинстве случаев - вызываться будет тот перегруженный get/set который надо, а сравнить 2 инта - по скорости несравненно быстрее чем каждый раз Object туды-сюды кастить...

Кстати похоже что относительно лишнего кода в paint ты был абсолютно прав... ну ту модельку я все равно созраню - для небольших табличек самое то что надо, а для жирных и тяжелый - сваяю QuadGrid.
Причем он будет создавать внутри своего контейнера переменное количество таблиц в зависимости от FixedColCount/FooterRowCount. Погонял сейчас прототип - всё путем, скорость замечательная. Осталось вложенные заголовки припаять туды и с авторазмерами распахаться... ну еще фильтр и сортировку до кучи, функции в футерах, события OnSelectedRowChanged/OnCellValueChanged/OnEditorNeeded/OnCellRender - и чихать тогда на девэкспресс :)
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34121415
alexx726
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Kozlov[quot alexx726]
Кстати похоже что относительно лишнего кода в paint ты был абсолютно прав... ну ту модельку я все равно созраню - для небольших табличек самое то что надо, а для жирных и тяжелый - сваяю QuadGrid.
Причем он будет создавать внутри своего контейнера переменное количество таблиц в зависимости от FixedColCount/FooterRowCount. Погонял сейчас прототип - всё путем, скорость замечательная. Осталось вложенные заголовки припаять туды и с авторазмерами распахаться... ну еще фильтр и сортировку до кучи, функции в футерах, события OnSelectedRowChanged/OnCellValueChanged/OnEditorNeeded/OnCellRender - и чихать тогда на девэкспресс :)

Мне к сожалению нельзя делать "здесь играем - там не играем". Я планирую полностью настраиваемый Framework, сериализованный из базы...Варианты конечно могут быть, но от обилия вариаций уже и так крыша трещит:)

QuadGrid ))
Мы с тобой должны эту фигню запатентовать с таким названием (учитывая абсолютно идентичный способ реализации:))
Меня только бесит, что нет понятия Visible=False.
Кстати, когда нарисуешь (думаю, ты это быстро сделаешь - там помощь особая не нужна, главное -терпение), расскажи дураку, как задать preferredSize для scrollPane так, чтобы он менялся в зависимости от наличия scrollBar? А то некрасиво получаца...(сам увидишь в Summary)

А вот по поводу этого "очень плохого" механизьма реализации FixedColumns имеет смысл подумать...
Ты понял, почему нуно прорисовывать весь Grid? Я понимал так, что ежели мы имеем на руках VisibleRowCount, то все уже не так плохо. Попробовал - ни фига не выходит. Загадочный этот JTable...
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34121442
Vladimir Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexx726
Кстати, когда нарисуешь (думаю, ты это быстро сделаешь - там помощь особая не нужна, главное -терпение), расскажи дураку, как задать preferredSize для scrollPane так, чтобы он менялся в зависимости от наличия scrollBar? А то некрасиво получаца...(сам увидишь в Summary)


Что-то я не заметил что там некрасивого такого... можешь скриншот показать?

Кстати я наткнулся на другую проблему:

есть основная панель с BorderLayout, в ней на южной стороне панель для summary, всё остальное место занимает JSplitpane ну и в summary синхронизированная с ней JSplitpane. Это для того чтоб гриды с фиксированными столбцами ресайзить. Далее, ColumnModel из фиксированной части таблицы присвоен ColumnModel-у фиксированной части Summary (для того чтобы при ресайзе колонок в фиксированных столбцах зацепить ресайзинг Summary). И вот тут фигня начинается - когда авторесайз и у фиксированной части и у ее summary стоит в OFF - синхронизация ресайза колонок пашет нормально но грид естественно не подгоняется под JSplitPane. Ставлю для подгонки под JSplitPane авторесайз по последней колонке фиксированной части - и из-за того что ColumnModel расшарен на два грида таблица начинает страдать дурью... видимо ColumnModel сама себе эвенты кидает и у нее крыша съезжает :)

alexx726
А вот по поводу этого "очень плохого" механизьма реализации FixedColumns имеет смысл подумать...
Ты понял, почему нуно прорисовывать весь Grid? Я понимал так, что ежели мы имеем на руках VisibleRowCount, то все уже не так плохо. Попробовал - ни фига не выходит. Загадочный этот JTable...

Есть у меня подозрение что VisibleRowCount в JScrollPane работает неадекватно. Можно попробовать считать самому исходя из высоты области прокрутки и высоты строки...
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34121453
alexx726
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Kozlov
Что-то я не заметил что там некрасивого такого... можешь скриншот показать?


Дык на работе всё. Это у меня на выходных вместо того чтоп спокойно пиво пить, какие-то мысли дурные в голову лезут :)
Постараюсь на пальцах. Есть scrollPane, к ней снизу другая scrollPane (я не парился со сплитом - сумммари, он и есть суммари). Ей неплохо бы выставить size (по умолчанию размер ну очень большой). Хорошо, выставляю preferredSize (высоту) как table.getRowHeight()+scrollBar.getHeight().
И все...Когда пропадает горизонтальный scrollBar (при resize), высота fixedScrollPane больше не меняется...Пытался перегрузить getPreferredSize() у scrollPane, но не понимаю - как получить видимость scrollBar (isVisible() не прокатывает).

А с resize колонок - это отдельная песня :) Я например аж целых 2 часа догадывался как бы это так сделать, чтобы при resize fixedColumns табличка раздвигалась...
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34121459
alexx726
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а по по воду VisibleRowCount() ты не понял :)
(кстати, а есть такая фича штоле - а я сам считал :(( )
Я пробовал фигачить прорисовку на эту хрень, навешивать какую-то ерунду на selectionChanged(), но без толку...Видимо плохо пытался.
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34121694
Vladimir Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexx726
Постараюсь на пальцах. Есть scrollPane, к ней снизу другая scrollPane (я не парился со сплитом - сумммари, он и есть суммари). Ей неплохо бы выставить size (по умолчанию размер ну очень большой). Хорошо, выставляю preferredSize (высоту) как table.getRowHeight()+scrollBar.getHeight().
И все...Когда пропадает горизонтальный scrollBar (при resize), высота fixedScrollPane больше не меняется...Пытался перегрузить getPreferredSize() у scrollPane, но не понимаю - как получить видимость scrollBar (isVisible() не прокатывает).


Скроллер в суммари идет лесом. Вот мой код конструктора (кое-где не хватает проверок на нулл, но прототип есть прототип, потом дошлифую)
Да, суммари под фиксед я пока оставил в нерабочем состоянии - с синхронизацией при ресайзе уперся в тупик, видимо придется руками писать...

Код: plaintext
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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
     public  QuadGrid( int  cols,  int  rows) {
        m_cols = cols;
        m_rows = rows;
         this .setLayout( new  BorderLayout());
         this .setBackground(Color.ORANGE);
         if  (m_rows> 0 ) {
            // create footer panel
            panelFooter =  new  JPanel( new  BorderLayout());
             this .add(panelFooter, BorderLayout.SOUTH);
             if  (m_cols> 0 ) {
                // create splitted footer
                splitFOOTER =  new  JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
                splitFOOTER.setDividerSize( 2 );
                tableFIXFOOTER =  new  JTable();
                tableFIXFOOTER.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                scFIXFOOTER =  new  JScrollPane(tableFIXFOOTER);
                
                splitFOOTER.setLeftComponent(scFIXFOOTER);
                
                tableFOOTER =  new  JTable();
                tableFOOTER.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                scFOOTER =  new  JScrollPane();
                scFOOTER.setViewportView(tableFOOTER);
                splitFOOTER.setRightComponent(scFOOTER);
                panelFooter.add(splitFOOTER,BorderLayout.CENTER);
            }  else  {
                // create simple footer
                tableFOOTER =  new  JTable();
                tableFOOTER.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                scFOOTER =  new  JScrollPane(tableFOOTER);
                panelFooter.add(scFOOTER,BorderLayout.CENTER);
            }
        }
        // create main tables
         if  (m_cols> 0 ) {
            // create splitted footer
            splitMAIN =  new  JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
            splitMAIN.setDividerSize( 2 );
            tableFIXMAIN =  new  JTable();
            tableFIXMAIN.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
            scFIXMAIN =  new  JScrollPane(tableFIXMAIN);
            splitMAIN.setLeftComponent(scFIXMAIN);
            tableMAIN =  new  JTable();
            tableMAIN.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            scMAIN =  new  JScrollPane(tableMAIN);
            splitMAIN.setRightComponent(scMAIN);
            add(splitMAIN,BorderLayout.CENTER);
        }  else  {
            // create simple footer
            tableMAIN =  new  JTable();
            tableMAIN.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            scMAIN =  new  JScrollPane(tableMAIN);
            add(scMAIN,BorderLayout.CENTER);
        }
        // create Split Sync
         if  (splitMAIN!= null ) {
            splitMAIN.addPropertyChangeListener( new  PropertyChangeListener() {
                 public   void  propertyChange(PropertyChangeEvent evt) {
                     if  (splitFOOTER!= null ) {
                        splitFOOTER.setDividerLocation(splitMAIN.getDividerLocation());
                    }
                }
            });
        }
        
        // sync scrollbars
         if  ((scMAIN!= null ) && (scFIXMAIN!= null )) {
            scMAIN.setVerticalScrollBar(scFIXMAIN.getVerticalScrollBar());
        }
         if  ((tableMAIN!= null ) && (tableFIXMAIN!= null )) {
            tableMAIN.setSelectionModel(tableFIXMAIN.getSelectionModel());
        }
         if  ((scMAIN!= null ) && (scFOOTER!= null )) {
            scMAIN.setHorizontalScrollBar(scFOOTER.getHorizontalScrollBar());
        }
         if  ((scFIXMAIN!= null ) && (scFIXFOOTER!= null )) {
            scFIXMAIN.setHorizontalScrollBar(scFIXFOOTER.getHorizontalScrollBar());
        }
        
        panelFooter.setPreferredSize( new  Dimension( 2000 , 5 +m_rows*tableFOOTER.getRowHeight()));
        
         if  (splitMAIN!= null ) {
            splitMAIN.setDividerLocation( 250 );
        }
        
    }

alexx726
А с resize колонок - это отдельная песня :) Я например аж целых 2 часа догадывался как бы это так сделать, чтобы при resize fixedColumns табличка раздвигалась...

Лобовое решение - использовать сплиты.

Кстати руки продолжают чесаться в плане добавления еще двух однострочных гридов сверзу - для запихивания в них комбобоксов фильтра :)
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34122311
alexx726
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Kozlov
alexx726
А с resize колонок - это отдельная песня :) Я например аж целых 2 часа догадывался как бы это так сделать, чтобы при resize fixedColumns табличка раздвигалась...
Лобовое решение - использовать сплиты.


А вот нет - достаточно на ComponentListener от fixedColumnsGrid'a (а именно на resize) повесить нехитрый код:

Код: plaintext
1.
((JViewport) this .getParent()).setPreferredSize( this .getPreferredSize())
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34127441
Vladimir Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexx726
А вот нет - достаточно на ComponentListener от fixedColumnsGrid'a (а именно на resize) повесить нехитрый код:

Код: plaintext
1.
((JViewport) this .getParent()).setPreferredSize( this .getPreferredSize())


Хм... и хде были мои мозги? За идейку спасибо, попробую (но чуть позже - у меня щас период активных битв с JasperReports).

Но вариант с одной таблицей более удобен в плане копипастинга в эксель :)
...
Рейтинг: 0 / 0
TreeTable - кто каким пользуется?
    #34128567
alexx726
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Vladimir Kozlov]

Хм... и хде были мои мозги? За идейку спасибо, попробую (но чуть позже - у меня щас период активных битв с JasperReports).
quot]

Ага... Jasper...Тоже интересно )
Когда закончишь -отпиши, реально ли перевести готовые достаточно навороченные отчеты (мы вовсю использовали Crystal Reports) на Jasper? Правда, у нас есть главное требование - на входе эта штука может иметь обычный DataSet...
...
Рейтинг: 0 / 0
39 сообщений из 39, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / TreeTable - кто каким пользуется?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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