Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Документация jMonkeyEngine
        jMonkeyEngine Уроки и Документация
            Вклады
                tonegodGUI
                    Создание новых элементов управления

Создание новых элементов управления

Опубликованно: 02.05.2017, 17:08
Последняя редакция, Andry: 02.05.2017 19:22

Создание настраиваемых элементов управления

В этом разделе я расскажу вам о создании настраиваемого элемента управления и, надеюсь, дам несколько советов и помогу стандартизировать построение элементов управления. Таким образом (если вы пожелаете) вы можете поделиться своими элементами управления с другими, и все будут точно знать, как использовать ваш элементы управления.

Контекстное меню многоразового использования

Мы будем строить многоразовое контекстное меню открываемое правой кнопки мыши, который будет:

  • Блокировать и разблокировать определенные функции стандартного окна/панели(window/panel)
  • Позволяет добавлять/удалять элементы меню, относящиеся к каждому окну, когда его вызывают.

ШАГ 1: Добавление рамки для нового класса.

Сначала мы создадим класс и добавим три стандартных конструктора. Мы будем использовать информацию о стиле меню, по умолчанию. Класс останется абстрактным, чтобы использовать существующий метод обратного вызова суперкласса Menu.

public abstract class ContextualMenu extends Menu {
    public ContextualMenu(Screen screen, String UID, Vector2f position, boolean isScrollable) {
        this(screen, UID, position,
            screen.getStyle("Menu").getVector2f("defaultSize"),
            screen.getStyle("Menu").getVector4f("resizeBorders"),
            screen.getStyle("Menu").getString("defaultImg"),
            isScrollable
        );
    }

    public ContextualMenu(Screen screen, String UID, Vector2f position, Vector2f dimensions,
            boolean isScrollable) {
        this(screen, UID, position, dimensions,
            screen.getStyle("Menu").getVector4f("resizeBorders"),
            screen.getStyle("Menu").getString("defaultImg"),
            isScrollable
        );
    }
    public ContextualMenu(Screen screen, String UID, Vector2f position, Vector2f dimensions,
            Vector4f resizeBorders, String defaultImg, boolean isScrollable) {
        // Вызовите суперкласс, чтобы построить наше основное меню
        super(screen, UID, position, dimensions, resizeBorders, defaultImg, false);
    }
}

ШАГ 2. Добавление public метода для создания стандартных опций.

Этот метод будет использоваться при вызове окон, чтобы гарантировать, что меню начинается с только параметров по умолчанию. Если конкретному окну вызова требуются дополнительные параметры, мы можем добавить их после вызова этого метода.

public void resetMenuOptions() {
    // Сначала очистите текущие menuItems
    getMenuItems().clear();
    // Теперь добавьте элементы по умолчанию
    /** Параметры:
      * String Заголовок
      * Object value - Мы будем хранить строку, которая дает нам подсказку о функции пункта меню
      * Menu subMenu - null, потому что нет ни одного
      * boolean isToggleItem - Добавляет CheckBox к пункту меню
      */
    addMenuItem("Lock window position", "position", null, true);
    addMenuItem("Lock window size", "dimensions", null, true);
    addMenuItem("Lock current alpha setting", "alpha", null, true);
}

Добавление нашего нового элемента управления на экран

// Создать один экземпляр многоразового контекстного меню
ContextualMenu rcMenu = new ContextualMenu(screen, "rcMenu", Vector2f.ZERO) {
    // Переопределить метод абстрактного события
    @Override
    public void onMenuItemClicked(int index, Object value, boolean isToggled) {
        // Теперь мы перейдем к нашему окну вызова.
        getCallerElement().setOption((String)value, isToggled);
    }
};
rcMenu.resetMenuOptions();
screen.add(rcMenu);

Расширение класса Window для использования нашего элемента управления

ШАГ 1: Расширьте класс Window и добавьте несколько методов

Нам нужно расширить класс Window, для того чтобы добавить обработчик события клика правой кнопкой мыши и обработать вызов методом setOption() из нашего класса ContextualMenu.

public abstract class ContextualWindow extends Window implements MouseButtonListener {
    // Добавьте 3 стандартных конструктора из класса Window и переименуйте их

    // Реализовать все абстрактные методы слушателей и добавить следующее:
    @Override
    public void onRightMouseReleased(MouseButtonEvent evt) {
        ContextualMenu rcMenu = screen.getElementById("rcMenu");
        // Установить состояние toggle для каждой из опций
        rcMenu.getMenuItem(0).setIsToggled(getIsMovable());
        rcMenu.getMenuItem(1).setIsToggled(getIsResizable());
        rcMenu.getMenuItem(2).setIsToggled(getIgnoreGlobalAlpha());
        // Показать меню
        rcMenu.showMenu(this, screen.getMouseXY().x, screen.getMouseXY().y);
    }

    // Добавить метод setOption для обработки событий пунктов меню
    public void setOption(String value, boolean isToggled) {
        if (value.equals("position")) {
            setIsMovable(isToggled);
        } else if (value.equals("dimensions")) {
            setIsResizable(isToggled);
        } else if (value.equals("alpha")) {
            setIgnoreGlobalAlpha(isToggled);
        }
    }
}

Переведено для jmonkeyengine.ru, оригинал
Автор перевода: Andry

Добавить комментарий

jMonkeyEngine.ru © 2017. Все права сохранены.