В этой статье я предоставлю вам документацию для удобного использования платформы Flamingo и, точнее, ее виджета с лентой.
Вступление
Никогда не говорите, что Microsoft никогда не вводит новшества: в Office она представила интересную концепцию ленты.
Ленточная лента — это своего рода панель инструментов. Но в то время как панели инструментов фиксированы, расположение лент может меняться в зависимости от ширины, которую они отображают. Если у вас есть такое приложение, просто поиграйте с ним несколько секунд, и вы увидите, что волшебство происходит.
Последние версии Swing не имеют таких виджетов. Тем не менее, я нашел проект Flamingo на java.net. Примеры, сделанные с помощью фламинго, выглядят очень похожими на Office.
Попытка использовать Flamingo в первый раз — это немалый подвиг, поскольку в Интернете нет документации, кроме Javadocs и источника для тестового приложения. Вот что я понял с тех пор, как начал свой путь проб и ошибок.
Основы
Семантика
- лента — большая полоса на скриншоте выше. Для рамки может быть только одна лента
- Задача — это группа с вкладками из одной или нескольких групп. На скриншоте задачами являются макет страницы, запись, анимация и т. Д.
- группа — это группа из одного или нескольких виджетов. На скриншоте полосы — это буфер обмена, быстрые стили, шрифт и т. Д.
Основные понятия
Основное различие между кнопками на панели инструментов и полосой на ленточной панели состоит в том, что полосы имеют изменяемый размер. Например, это шаги для отображения полосы документа с точки зрения как относительной ширины, так и ширины ленты.
Последний шаг известен как иконизированное состояние. Когда вы нажимаете на кнопку, он отображает всю полосу в виде всплывающего окна.
Твоя первая лента
Настроить
Чтобы использовать платформу Flamingo, первым делом нужно загрузить ее . Если вы используете Maven, удачи! Я не нашел фламинго в центральных репозиториях java.net. Так что загрузите его в любом случае и установите вручную в своем локальном (или корпоративном) хранилище. Для информации я выбрал местоположение net.java.dev.flamingo: flamingo.
Рамка
Если вы начинаете с нуля, вам повезло. Просто наследуйте от JRibbonFrame: метод getRibbon () предоставит вам ссылку на экземпляр ленты. Оттуда вы сможете добавлять задачи к нему.
Однако, скорее всего, у вас, вероятно, уже есть собственная иерархия кадров. В этом случае вам нужно создать экземпляр JRibbon и добавить его в СЕВЕРНОЕ местоположение вашего фрейма BorderLayout-ed.
В обоих случаях результат должен быть примерно таким:
Добавление задачи
Задачи представляют собой логическую группу групп. Они похожи на вкладки и тоже играют роль. Давайте добавим две такие задачи, названные «Один» и «Два».
public class MainFrame extends JRibbonFrame { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { MainFrame frame = new MainFrame(); frame.setDefaultCloseOperation(EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); RibbonTask task1 = new RibbonTask("One"); RibbonTask task2 = new RibbonTask("Two"); frame.getRibbon().addTask(task1); frame.getRibbon().addTask(task2); } }); }}
Обратите внимание на метод getRibbon () в JRibbonFrame. Это ссылка на ленточной панели.
Также обратите внимание, что метод addTask () принимает задачу, но также и переменные JRibbonBand. И если вы запустите приведенный выше код, он с треском провалится со следующей ошибкой:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Cannot have empty ribbon task at org.jvnet.flamingo.ribbon.RibbonTask.<init>(RibbonTask.java:85) at MainFrame$1.run(MainFrame.java:37) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) at java.awt.EventQueue.dispatchEvent(EventQueue.java:597) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Добавление полос
Чтобы удовлетворить нашего друга Фламинго, давайте добавим ленту ленты к каждой задаче. Конструктор JRibbonBand принимает два аргумента: метку и экземпляр ранее неизвестного класса ResizableIcon. Это будет подробно рассмотрено в следующем разделе.
На данный момент, если вы просто создадите RibbonTask со ссылкой на JRibbonBand и запустите приложение, вы получите такую ошибку:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Cannot have empty ribbon task at org.jvnet.flamingo.ribbon.RibbonTask.<init>(RibbonTask.java:85) at MainFrame$1.run(MainFrame.java:37) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) at java.awt.EventQueue.dispatchEvent(EventQueue.java:597) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Помните, что полосы могут быть изменяемого размера? Фламинго нужна информация о том, как это сделать. Перед начальным отображением он проверит соответствие этих политик. По умолчанию это не так, и это причина, по которой он жалуется: Flamingo требует, чтобы у вас была хотя бы иконизированная политика, которая должна быть на последнем месте. В большинстве случаев, однако, вы захотите иметь хотя бы нормальное отображение в списке политик.
Давайте изменим код, чтобы сделать это:
JRibbonBand band1 = new JRibbonBand("Hello", null);JRibbonBand band2 = new JRibbonBand("world!", null);band1.setResizePolicies((List) Arrays.asList(new IconRibbonBandResizePolicy(band1.getControlPanel())));band2.setResizePolicies((List) Arrays.asList(new IconRibbonBandResizePolicy(band1.getControlPanel())));RibbonTask task1 = new RibbonTask("One", band1);RibbonTask task2 = new RibbonTask("Two", band2);
Предыдущий код позволил нам хоть что-то увидеть:
Добавление кнопок (наконец-то!)
Даже если предыдущий компилируется и запускается, он все равно не представляет интереса. Сейчас самое время добавить несколько кнопок!
JCommandButton button1 = new JCommandButton("Square", null);JCommandButton button2 = new JCommandButton("Circle", null);JCommandButton button3 = new JCommandButton("Triangle", null);JCommandButton button4 = new JCommandButton("Star", null);band1.addCommandButton(button1, TOP);band1.addCommandButton(button2, MEDIUM);band1.addCommandButton(button3, MEDIUM);band1.addCommandButton(button4, MEDIUM);
Жаль, что нет результата! Где наши кнопки? Ну, они хорошо спрятаны. Помните правила изменения размера? Там только один, иконизированный, и его цель — только отобразить иконизированное состояние. Просто обновите строку политики с кодом:
band1.setResizePolicies((List) Arrays.asList(new CoreRibbonResizePolicies.None(band1.getControlPanel()), new IconRibbonBandResizePolicy(band1.getControlPanel())));
Вначале результат выглядит одинаково, но при изменении размера фрейма это выглядит так:
Даже если это визуально не очень привлекательно, это выглядит намного лучше, чем раньше. Мы видим таксы, название группы и ярлыки на наших четырех кнопках.
Изменяемые размеры иконок
Конструктор JCommandButton имеет 2 параметра: один для метки, другой для специального класса Flamingo, ResizableIcon. Так как Flamingo предназначен для отображения одной и той же кнопки разных размеров, это не удивительно. Изменяемые размеры иконки могут быть созданы из изображений, ресурсов ICO или даже SVG.
Давайте добавим в наш фрейм служебный метод и оживим наш интерфейс:
public static ResizableIcon getResizableIconFromResource(String resource) { return ImageWrapperResizableIcon.getIcon(MainFrame.class.getClassLoader().getResource(resource), new Dimension(48, 48));}...JCommandButton button1 = new JCommandButton("Square", getResizableIconFromResource("path"));JCommandButton button2 = new JCommandButton("Circle", getResizableIconFromResource("to"));JCommandButton button3 = new JCommandButton("Triangle", getResizableIconFromResource("the"));JCommandButton button4 = new JCommandButton("Star", getResizableIconFromResource("resource"));band1.addCommandButton(button1, TOP);band1.addCommandButton(button2, MEDIUM);band1.addCommandButton(button3, MEDIUM);band1.addCommandButton(button4, MEDIUM);
Это несколько более удовлетворительно:
Выбор политики
Теперь мы готовы заняться основным бизнесом Flamingo, изменив размеры управления. Если у вас есть Office, и вы поиграли с ним, вы увидели, что политики изменения размера очень богаты. И мы также видели ранее, что только с двумя скудными политиками мы можем видеть иконку или полный экран.
Посмотрим, как мы можем пойти дальше. Вы, вероятно, заметили, что addCommandButton () JRibbonBand имеет 2 параметра: кнопку для добавления и приоритет. Именно этот приоритет и политика, которую Фламинго использует для выбора способа отображения группы.
Приоритеты следующие: TOP, MEDIUM и LOW.
Политики:
политика | Описание |
---|---|
CoreRibbonResizePolicies.None | Командные кнопки будут представлены в состоянии TOP (большая кнопка с меткой и значком) |
CoreRibbonResizePolicies.Mid2Mid | Командные кнопки, имеющие приоритет MEDIUM, будут представлены в состоянии MEDIUM (маленькая кнопка с меткой и значком) |
CoreRibbonResizePolicies.Mid2Low | Командные кнопки со средним приоритетом будут представлены в состоянии LOW (только маленькая кнопка) |
CoreRibbonResizePolicies.High2Mid | Командные кнопки, имеющие ВЫСОКИЙ приоритет, будут представлены в СРЕДНЕМ состоянии |
CoreRibbonResizePolicies.High2Low | Командные кнопки, имеющие высокий приоритет, будут представлены в состоянии LOW |
CoreRibbonResizePolicies.Low2Mid | Командные кнопки, имеющие НИЗКИЙ приоритет, будут представлены в СРЕДНЕМ состоянии |
CoreRibbonResizePolicies.Mirror | Кнопки команд будут представлены в том порядке, в котором они были назначены |
IconRibbonBandResizePolicy | Будет Кнопка управления не представлена. Весь диапазон будет представлен командной кнопкой, которая при нажатии покажет всплывающее окно неограниченного диапазона. |
Теперь у вас есть все элементы, чтобы вы могли решить, какие политики применять. Однако есть одно правило: при настройке политик ширина полосы должна уменьшаться и уменьшаться по мере увеличения индекса политики (и он должен заканчиваться IconRibbonBandResizePolicy), что позволит получить неприятное исключение IllegalStateException: непоследовательная предпочтительная ширина (см. Выше). ).
Давайте применим некоторые правила к нашей группе:
band1.setResizePolicies((List) Arrays.asList( new CoreRibbonResizePolicies.None(band1.getControlPanel()), new CoreRibbonResizePolicies.Mirror(band1.getControlPanel()), new CoreRibbonResizePolicies.Mid2Low(band1.getControlPanel()), new CoreRibbonResizePolicies.High2Low(band1.getControlPanel()), new IconRibbonBandResizePolicy(band1.getControlPanel())));
Это даст нам следующий результат:
Примечание: в моем примере не будет никакого обозначенного состояния, поскольку группа не конкурирует за место с другим.
Больше возможностей
Функция ленты Фламинго позволяет вам также:
- добавить стандартные компоненты Swing на ленту
- добавить меню в верхнем левом углу
- интеграция со стандартным внешним видом
- тесная интеграция с веществом L & F
Они также недокументированы, но гораздо проще понять сами.
У этого также есть другие особенности:
- Панировочный батончик
- Командные кнопки и панели
Вывод
Flamingo — это хороший и мощный продукт, которому мешает отсутствие документации. Я надеюсь, что эта статья сделает один шаг к документированию.
Вот источники для этой статьи в формате Eclipse / Maven.
Чтобы идти дальше:
- Flamingo сайт
- Некоторые демонстрационные приложения
- Последняя версия (4.2) страница загрузки
- Кирилл Grouchnivkov (отец отеля Flamingo) сайт , где он блоги о Flamingo и других продуктов