Статьи

Фламинго Учебник

В этой статье я предоставлю вам документацию для удобного использования платформы 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 на ленту
  • добавить меню в верхнем левом углу

  • интеграция со стандартным внешним видом

Они также недокументированы, но гораздо проще понять сами.

У этого также есть другие особенности:

  • Панировочный батончик
  • Командные кнопки и панели

Вывод

Flamingo — это хороший и мощный продукт, которому мешает отсутствие документации. Я надеюсь, что эта статья сделает один шаг к документированию.

Вот источники для этой статьи в формате Eclipse / Maven.

Чтобы идти дальше:

 

С http://blog.frankel.ch/flamingo-tutorial