Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Строим "правильный" GUI


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

Т.е. в итоге я имею панель инструментов, и основную рабочую панель. Панелью инструментов будет являться  группа 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, рабочей области программы. Я пока думаю как это сделать.
Кто как подобное решает? Что можете подсказать?

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

Автор: diablero 30.1.2008, 08:58
Код должен получиться не индуский, это дело принципа.
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) {
            
        }
    }
}


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

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

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

Автор: w1nd 30.1.2008, 21:10
http://java.sun.com/products/jfc/tsc/articles/actions/index.html, http://java.sun.com/docs/books/tutorial/uiswing/misc/action.html, http://java.sun.com/mailers/techtips/corejava/2006/tt1219.html

Автор: diablero 30.1.2008, 21:38
Разобрался, 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) {

    }
}


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

Автор: bluecat 25.2.2008, 17:17
Цитата(diablero @ 30.1.2008,  21:38)

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


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

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

Action'ы наиболее удобны, когда их нужно обрабатывать локально. Чем дальше нужно передать событие, сгенерированное Action'ом, тем больше проблем. Потому что в любом случае нужно, во-первых, знать, куда передавать, а во-вторых, знать, как передавать, т.е., обеспечить доступ и проинициализировать ссылки.

Автор: COVD 25.2.2008, 18:13
В нетбинс 6 есть тип проекта DesktopApplication . При создании нового проекта генерируется заготовка, в которой применен подход с использованием Action. Уже нет там больше конструкций типа addActionListener .... с анонимными классами. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)