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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> выбор технологии, фреймворков и т.п. что лучше выбрать: swing, swt..... 
V
    Опции темы
kulibin
Дата 28.6.2009, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 9.5.2005
Где: Украина, Запорожь е

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



Стоит такая задачка: написать на java десктопное приложение для работы с БД, Требуется нормальный GUI - с большим упором на таблицы - и с очень к ним большими требованиями.

Немного предыстории: сам я родом с C#.NET. Сейчас по работе меня перекинули на Java-проект, Очень заинтересовала Java - особенно в области Hibernate & EJB & Spring и т.п. И вот я решил одну домашнюю разработку на явке сделать. Вот тут то и началась фигня smile. После знакомства со swing меня такая тоска охватила.... Это в то время, как космические корабли бороздят просторы и т.д. и т.п. - и вот такой вот жостко геморный и лажовый JTable... Вобщем то swing в области теории мне понравился (в сравнении с WinForms) - но в области создания богатого и профессионально ВЫГЛЯДЯЩЕГО ДЛЯ ПОЛЬЗОВАТЕЛЯ (ему ж, родимому, вся эта теория вы сами знаете до какого места!!!) - это ж просто опа!!! Не пойму я совсем - для веба на джаве туева хуча всяких примочек - ричфейсес и куча ещё всего - всё оч круто и наляпано можно наворотить. А что с десктопными приложениями? Они разве уже не нужны?! Или я просто чтото пропустил? Очень на это надеюсь...

Вопрос: подскажите пожалуйста чем на джаве можно сделать красивый и удобный гуй? Скины и красивые кнопочки извращённого вида не интересуют абсолютно. Интересуют гриды - с различными эдиторами для ячеек, с многострочными заголовками с группировкой, с возможностью древовидного отображения - группировки строк и т.п. По сути весь интерфейс будет построен на гридах. JTable я не понял. Если с него и можно чтото выжать - то просто нечеловеческими усилиями - причём учитывая то, что данные будут в виде хибернейтных POJO-объектов - то эти нечеловеческие усилия возможно прийдётся повторить для каждой таблицы приложения.... 

Немного вот пролистнул по SWT описание. Там скрины както поинтереснее чем со свингом выглядят - но всёже таблички както грустновато выглядят :(
Java FX вот ещё чтото мелькало - вообще полностью не в курсе что это...
Какие ещё есть варианты? Т.е. в сторону каких технологий смотреть и в сторону каких компонентов? Возможно и под свинг есть какието гриды с богатыми возможностями и простые в обращении? Кроме возможностей предоставления удобств узеру очень ещё интересует удобство и простота для программиста - т.к. в принципе хороший грид можно и самому с нуля написать - вопрос только в том сколько лет это займёт smile
Да - и ещё - обязательное требование к компонентам - бесплатность - а в идеале опенсурсность.

Буду рад любым мыслям на эту тему. Спасибо.
PM MAIL WWW ICQ   Вверх
COVD
Дата 28.6.2009, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

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



Цитата

Требуется нормальный GUI 

Цитата

чем на джаве можно сделать красивый и удобный гуй?


Ну и запросы. Обычно довольствуются ненормальным, некрасивым и неудобным (шутка)  smile .

Цитата

А что с десктопными приложениями? Они разве уже не нужны?! 


Практика показала, что для многих задач достаточно веб-средств (html + javascript) для реализации клиента. Но в некоторых случаях этого недостаточно. Этот вопрос, на мой взгляд, имеет смысл лишь применительно к конкретной индустрии. Поинтересуйтесь, что используют ваши конкуренты.

Цитата

в принципе хороший грид можно и самому с нуля написать 


"хороший"(заточенный под вашу конкретную задачу) грид надо писать с "нуля". И этот "нуль" - либо JTable из Swing, либо аналог из SWT. Эти компоненты относительно низкого уровня и осваиваются не за 15 минут. Выбор Swing vs SWT  делают по разным критериям, но если делать акцент на таблицы, то у меня сложилось впечатление, что JTable предпочтительнее.    




 
PM MAIL   Вверх
kulibin
Дата 28.6.2009, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 9.5.2005
Где: Украина, Запорожь е

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



Цитата(COVD @  28.6.2009,  08:30 Найти цитируемый пост)
Ну и запросы. Обычно довольствуются ненормальным, некрасивым и неудобным (шутка)  smile .

посмотрев на свинг и на несколько программ на нём сделанных именно к такому выводу я и пришол....
PM MAIL WWW ICQ   Вверх
dorogoyIV
Дата 28.6.2009, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

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



Цитата(kulibin @  28.6.2009,  00:07 Найти цитируемый пост)
Стоит такая задачка: написать на java десктопное приложение для работы с БД

извините, если вы хотите обсудить возможности, то вам в другой раздел., а если есть вопросы по JavaSE vs FX , то задавайте, вам с удовольствием помогут...
PM MAIL   Вверх
kulibin
Дата 28.6.2009, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 9.5.2005
Где: Украина, Запорожь е

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



Щас вот курочу всёже JTable - SWT я забоялся - не охота коллекционировать поверхностные знания о различных технологиях. Путь пока Swing будет - и JTable.
Пытался чтото найти по типу надстройки над JTable - ничего интересного опенсурсного не нашол. Да и платного тоже и мало и не особо оно. 
Сейчас вот писаю модельку для работы JTable с коллекциями POJO-объектов хибернейтных. Вроде получается чтото. Даже немного нравиться начинает smile.

Вот нашкрябал пару классов:

Код

package cito.gui.models;

import java.beans.IntrospectionException;
import java.util.ArrayList;
import java.util.List;

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

public abstract class EntityTableModel<T> implements TableModel {

    List<T> datalist;
    List<TableModelListener> listeners;
    EntityDataHelper entityHelper;
    
    int numcols, numrows;

    // TODO: set column names!!!
    String[] cols;

    public EntityTableModel(List<T> datalist, Class<?> entityClass) {
        
        listeners = new ArrayList<TableModelListener>();
        
        this.datalist = datalist;
        try {
            this.entityHelper = new EntityDataHelper(entityClass);
            this.cols = this.entityHelper.getPropertiesNames();
        } catch (IntrospectionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        numcols = getColumnCount();
        numrows = getRowCount();
    }

    public void addEntityList(List<T> list) {
        datalist.addAll(list);
        fireTableDataChanged();
    }
    
    public void addEntity(T entity) {
        datalist.add(entity);
        fireTableDataChanged();
    }
    
    public void removeEntity(T entity) {
        datalist.remove(entity);
        fireTableDataChanged();
    }
    
    public void clearData() {
        datalist.clear();
        fireTableDataChanged();
    }

    /** Automatically close when we're garbage collected */
    protected void finalize() {
    }

    public int getColumnCount() {
        numcols = cols.length;
        return numcols;
    }

    public int getRowCount() {
        numrows = datalist.size();
        return numrows;
    }

    public String getColHeader(int column) {
        return cols[column];
    }

    public String getColumnName(int column) {
        return cols[column];
    }

    //TODO: тут может нулл вернуться - думаю жтейбл этого не поймёт... пусть пока стринг в таких случаях будет - но чтото наверное нужно с этим сделать...
    public Class<?> getColumnClass(int column) {
        Class<?> cls = this.entityHelper.getPropertyType(getColumnName(column));
        if (cls == null) cls = String.class;
        return cls;
    }

    @SuppressWarnings("unchecked")
    public T getEntityAt(int row) {
        Object obj = datalist.get(row);
        return (T) obj;
    }

    public Object getValueAt(int row, int column) {
        return entityHelper.getPropertyValue(getColumnName(column), datalist.get(row));
    }

    //TODO: тут можно запрещать редактирование столбцов некоторых - надо настраивать по метаданным
    public boolean isCellEditable(int row, int column) {
        return true;
    }

    public void setValueAt(Object value, int row, int column) {
        entityHelper.setPropertyValue(getColumnName(column), datalist.get(row), value);
        fireTableDataChanged();
    }

    public void addTableModelListener(TableModelListener listener) {
        this.listeners.add(listener);
    }

    public void removeTableModelListener(TableModelListener listener) {
        this.listeners.remove(listener);
    }

    private void fireTableDataChanged() {
        for (TableModelListener listener : listeners) listener.tableChanged(new TableModelEvent(this));
    }
}


Код

package cito.gui.models;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

import cito.dao.price.FindInPricesCreteria;
import org.apache.log4j.Logger;

public class EntityDataHelper {
    
    Logger log = Logger.getLogger(FindInPricesCreteria.class);
    private Map<String, PropertyDescriptor> properties;
    private String entityClassName;
    
    
    public EntityDataHelper(Class<?> entityClass) throws IntrospectionException
    {
        BeanInfo componentBeanInfo = Introspector.getBeanInfo(entityClass);
        entityClassName = entityClass.getName();
        
        properties = new HashMap<String, PropertyDescriptor>();
        PropertyDescriptor[]  props = componentBeanInfo.getPropertyDescriptors();
        
        for (PropertyDescriptor pd : props)
        {
         //TODO: проверка простое ли это свойство - или например коллекция?if (pd.getPropertyType().)
         //TODO: чего с объектами делать?! какойто тут тустринг выводить - а в идеале брать пару характеризующих свойств...
         properties.put(pd.getDisplayName(),pd);
        }        
    }
    
    public String[] getPropertiesNames()
    {
        return this.properties.keySet().toArray(new String[]{});
    }
    
    /**May return null!*/
    public Class<?> getPropertyType(String propName)
    {
        return this.properties.get(propName).getPropertyType();        
    }
    
    public Object getPropertyValue(String propName, Object obj)
    {
        Object ret = null;
        Method method = properties.get(propName).getReadMethod();
        try {
            ret = method.invoke(obj, new Object[]{});
        } catch (Exception e) {
            log.error("can't get " + this.entityClassName + "." + propName + " roperty value: ", e);
            e.printStackTrace();
        }
        return ret;
    }
    
    public void setPropertyValue(String propName, Object obj, Object value)
    {
        Method method = properties.get(propName).getWriteMethod();
        
        try {
            method.invoke(obj, value);
        } catch(Exception e) {        
            log.error("can't set " + this.entityClassName + "." + propName + " roperty value: ", e);
            e.printStackTrace();
        }
    }
    
}


Охота заслушать мнения специалистов по поводу этой моей поделки smile
С событиями модели не оч разобрался: вот это

Код

private void fireTableDataChanged() {
        for (TableModelListener listener : listeners) listener.tableChanged(new TableModelEvent(this));
    }


это для кого? для самой JTable - или для обработки редактирования - сохранения в бд и т.п.?
И вообще как принято обрабатывать редактирование модели пользователем: из самой модели вызывать методы сохранения персистентных объектов - или 
только события соответствующие тут генерить?
PM MAIL WWW ICQ   Вверх
aleksandy
Дата 28.6.2009, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(kulibin @ 28.6.2009,  20:35)
С событиями модели не оч разобрался: вот это

Код

private void fireTableDataChanged() {
        for (TableModelListener listener : listeners) listener.tableChanged(new TableModelEvent(this));
    }


это для кого? для самой JTable - или для обработки редактирования - сохранения в бд и т.п.?

Это для любого слушателя модели, коим является и JTable. Обработку редактирования правильно делать в этих самых слушателях.
PM   Вверх
kulibin
Дата 29.6.2009, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 9.5.2005
Где: Украина, Запорожь е

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



Цитата(aleksandy @ 28.6.2009,  22:30)
Цитата(kulibin @ 28.6.2009,  20:35)
С событиями модели не оч разобрался: вот это

Код

private void fireTableDataChanged() {
        for (TableModelListener listener : listeners) listener.tableChanged(new TableModelEvent(this));
    }


это для кого? для самой JTable - или для обработки редактирования - сохранения в бд и т.п.?

Это для любого слушателя модели, коим является и JTable. Обработку редактирования правильно делать в этих самых слушателях.

угу.... интересно.... а я думал в модель эту обработку запихнуть.... куда ж её девать то..... у меня получается есть классы по типу DOA - они же по типу сервисов - их методы будут дёргаться для извлечение энтитей, сохранения, удаления - и они же будут инкапсулировать основную бизнес-логику. И я собирался (пока не делал этого вообще) дёргать эти самые дао/бизнес-сервисы из моделей таблиц.... у меня в принципе и не было уверенности в правильности этого smile - но и нет понимания как лучше это делать. В коде представления то это совсем не уместно будет... Какойто по типу контроллер приложения чтоли вводить - который бы инкапсулировал бы в себе логику работы приложения уровня представления - отображение форм, какието сценарии... У меня чтото смутное предчувствие, что даже если бы нашолся шарящий человек с желанием меня просветить на эту тему - то наверное объяснения понадобились бы довольно объёмистые smile может хотя бы кинете ссылку на статейку какую об архитектурных принципах по типу MVC - в примерах какихто боле-менее жизненных? я и читал чтото такое - но чтото меня от этого плющит smile мозг выворачивается на изнанку - но понимание не приходит :(
PM MAIL WWW ICQ   Вверх
COVD
Дата 29.6.2009, 05:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

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



kulibin, основной принцип Swing - все операции с гуи делаются в одном потоке - EventDispatchThread (EDT). Этот поток извлекает из очереди события и обрабатывает. Когда вы вызываете метод fire..something..Changed(), то в итоге, если необходима перерисовка, создается соответствующий обьект-событие (Event) и помещается в очередь EDT. В эту очередь также попадают и события от мыши, например. 

Теперь главное. Модификация модели (таблицы, графика,...) тоже должна осуществляться через EDT. Если обновления берутся из внешнего источника (файл, база данных, сеть), то на их подготовку (загрузка, парсинг) требуется время. Поэтому подготовку данных надо делать в другом потоке (иначе гуи будет "замораживаться"). Но вставку обновлений в модель, т.е. ее модификацию, только через EDT. Таким образом, нужен контроллер, который этим занимается. 

В IDE NetBeans (бесплатный opensource от Sun) есть среди прочих и шаблон проекта JavaDesktopDatabaseProject. Это "конструктор" заточенный, на мой взгляд, именно под вашу задачу. Со всеми модными делами. И документация на уровне. Сам я не пробовал, но рекомендую взглянуть. 


PM MAIL   Вверх
kulibin
Дата 29.6.2009, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 9.5.2005
Где: Украина, Запорожь е

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



Цитата(COVD @  29.6.2009,  05:26 Найти цитируемый пост)
Теперь главное. Модификация модели (таблицы, графика,...) тоже должна осуществляться через EDT. Если обновления берутся из внешнего источника (файл, база данных, сеть), то на их подготовку (загрузка, парсинг) требуется время. Поэтому подготовку данных надо делать в другом потоке (иначе гуи будет "замораживаться"). Но вставку обновлений в модель, т.е. ее модификацию, только через EDT. Таким образом, нужен контроллер, который этим занимается. 

Спасибо, очень ценная информация - я этот момент благополучно пропустил - как наверное и многие другие smile

Цитата(COVD @  29.6.2009,  05:26 Найти цитируемый пост)
В IDE NetBeans (бесплатный opensource от Sun) есть среди прочих и шаблон проекта JavaDesktopDatabaseProject. Это "конструктор" заточенный, на мой взгляд, именно под вашу задачу. Со всеми модными делами. И документация на уровне. Сам я не пробовал, но рекомендую взглянуть. 

Я эклипс пользую. Сначала мне нетбианс больше понравился - но потом на работе я на нём отлаживал ёжб-проект с жбоссом - и оно в debug-e жостко глючило - отваливались брейкпойнты (не отображались) и там ещё чтото. Подстава была жосткая - я по работе изза нетбианс чуть не выгреб люлей. Пришлось в пожарном порядке ставить эклипс (ещё у нас на работе все эклипс пользуют - и помочь с нетбинс мне никто не смог - может там и мелочь какаято была, может я загнался - но по эклипсу если чтото такое - то хоть есть кому помочь быстро).
А шаблон десктопного приложения на нетбинсе я видел мельком - там чтото очень громоздкое. И не оч нравится то, что в нетбинсе код форм и страничек сильно напоминает родную визуал-студио - такой же избыточный и нечитаемый. Это хорошо только в первые 3 дня изучения - потом нужно срочно переключаться на ручное написание кода форм - чтобы не вошло в привычку. Вот эти вот бэкинг-бины для вёба - и подобный же подход к гую - это зло.
PM MAIL WWW ICQ   Вверх
Connie
Дата 29.6.2009, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
и оно в debug-e жостко глючило - отваливались брейкпойнты (не отображались)
в свойствах проекта включить отладочную информацию и сделать Clean and Build
PM MAIL WWW   Вверх
kulibin
Дата 29.6.2009, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 9.5.2005
Где: Украина, Запорожь е

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



Цитата(Connie @ 29.6.2009,  15:31)
Цитата
и оно в debug-e жостко глючило - отваливались брейкпойнты (не отображались)
в свойствах проекта включить отладочную информацию и сделать Clean and Build

Не оч понял smile интересно конешно.... но щас я уже прочно на эклипс подсел - а тогда времени не было разобраться - была срочная работа
да и к эклипсу много плагинов всяких - и возможно сам чтото начну под эклипс писать - и ещё в сторону SWT поглядываю - хотя пока всёже остановился на Swing-e. Думаю с эклипсом мне больше попути. Хотя было бы интересно заслушать контраргументы - чем нетбианс лучше и т.п. И ещё в связи с этим же возможно про JBoss vs GlassFish - GlassFish & NetBians родные в доску - а эклипс к JBoss ближе
PM MAIL WWW ICQ   Вверх
Connie
Дата 29.6.2009, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.1824 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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