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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Строим "правильный" GUI 
:(
    Опции темы
diablero
Дата 29.1.2008, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

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



Передо мной поставлена задача, написать редактор, чтобы не объяснять его суть, назову его графическим редактором. Бизнес логика уже готова. Осталось написать графический интерфейс. И тут я задумался над его архитектурой. Суть вот в чем, что в зависимости от настроек пользователю должны обрезаться некоторые функции.  

Т.е. в итоге я имею панель инструментов, и основную рабочую панель. Панелью инструментов будет являться  группа JToolBar’орв и рабочая JPanel. 

Какой я пока вижу вариант формирования панелей инструментов.  В файле конфигурации редактора перечисляется кнопки, в зависимости от этого перечня строиться панели.
Код

public abstract class Buttons {
    public JButton button;

    public void init() {
        button = new JButton();
    }
    public JButton getButton() {
        return button;
    }
    public void addActionListener(ActionListener listener) {
        button.addActionListener(listener);
    }
}

Код

public abstract class ToolBars {
    public JToolBar toolBar;

    public void init() {
        toolBar = new JToolBar();
    }
    public void addComponent(JComponent component) {
        toolBar.add(component);
    }
    public JToolBar getToolBar() {
        return toolBar;
    }
}

Код

public class ButtonBuilder {
    public static HashMap<String, String> mappings;
    static {
        mappings = new HashMap<String, String>();
        mappings.put("new", "NewButton");
    }
    public Buttons getButton(String key) throws Exception{
        String className = mappings.get(key);
        return className==null ? null : (Buttons)Class.forName(className).newInstance();
    }
}

Код

public class DocumentToolBar extends ToolBars{
    private String []buttons = {"new"};
    public DocumentToolBar() {
        super.init();
        Editor editor = Editor.getInstance();
        ButtonBuilder builder = editor.getButtonBuilder();
        for(String str: buttons) {
            try {
                Buttons button = builder.getButton(str);
                button.init();
                addComponent(button.getButton());
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }
    public JToolBar getToolBar() {
        return toolBar;
    }
}

Т.е. в итоге я получаю, что каждая кнопка это отдельный класс, со своим листенером. Кнопки легко добавлять, удалять. Вроде?smile
Осталось все листенеры связать с JPanel, рабочей области программы. Я пока думаю как это сделать.
Кто как подобное решает? Что можете подсказать?



--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
gibbzy
Дата 30.1.2008, 05:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Читайте тему ActionEvent
я пытался написать что то подобное, код там конечно дико индусский но вроде работает я тож сталкнулся с тем же вопросом что и вы. Мне ответили. 
Мне так думаеться что всё проще реализовать при помощи JToolBar и JMenuBar так будет лучче и логичней. Почитайте описание реализации экшенов, там всё достаточно просто под каждую кнопку пишеться отдельный класс который включает в себя метод public void actionPerformed(ActionEvent arg0) {} в кротором пишеться что соббсно должна делать эта кнопка. 

Это сообщение отредактировал(а) gibbzy - 30.1.2008, 05:34
PM MAIL WWW ICQ   Вверх
diablero
Дата 30.1.2008, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

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



Код должен получиться не индуский, это дело принципа.
gibbzy вы не поняли то, что я написал. Вот так будет выглядеть одна из многих кнопок:
Код

public class NewButton extends Buttons {
    public void init() {
        super.init();
        button.setText("new");
        addActionListener(new NewListener());
    }
    class NewListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            
        }
    }
}




--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
w1nd
Дата 30.1.2008, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


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

Репутация: 23
Всего: 54



Есть такой замечательный интерфейс - Action. Просто используйте его реализацию (возможно, дополнив) и не изобретайте велосипедов smile


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
diablero
Дата 30.1.2008, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

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



Цитата(w1nd @  30.1.2008,  11:36 Найти цитируемый пост)
Есть такой замечательный интерфейс - Action. Просто используйте его реализацию (возможно, дополнив) и не изобретайте велосипедов

А можно пример, чтобы не изобретать вилосипедsmile


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
w1nd
Дата 30.1.2008, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


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

Репутация: 23
Всего: 54





--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
diablero
Дата 30.1.2008, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

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



Разобрался, Action - это красиво и всегда клево smile
Код

abstract public class Worker extends AbstractAction {
    abstract public void init(String text, ImageIcon icon, String desc, Integer mnemonic);
}

Код

public class NewWorker extends Worker {
    public void init(String text, ImageIcon icon, String desc, Integer mnemonic) {
        putValue(NAME, text);
        putValue(SMALL_ICON, icon);
        putValue(SHORT_DESCRIPTION, desc);
        putValue(MNEMONIC_KEY, mnemonic);
    }
    public void actionPerformed(ActionEvent e) {

    }
}


У меня такой вопрос пока не решенный. Как всем воркерам получать доступ до панели?


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
bluecat
Дата 25.2.2008, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(diablero @ 30.1.2008,  21:38)

У меня такой вопрос пока не решенный. Как всем воркерам получать доступ до панели?


А это и есть, как мне кажется, самая большая проблема с Action'ами - их надо интегрировать с другими частями приложения. В частности, с бизнес-логикой (это еще называется visibility problem).

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

Action'ы наиболее удобны, когда их нужно обрабатывать локально. Чем дальше нужно передать событие, сгенерированное Action'ом, тем больше проблем. Потому что в любом случае нужно, во-первых, знать, куда передавать, а во-вторых, знать, как передавать, т.е., обеспечить доступ и проинициализировать ссылки.
PM MAIL   Вверх
COVD
Дата 25.2.2008, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

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

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


 




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


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

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