火烈鸟 即时通讯
在本文中,我将为您提供文档,以轻松使用Flamingo框架,更准确地说是其功能区小部件。
介绍
永远不要说微软永远不会创新:在Office中,它引入了一个有趣的概念,即功能区。
功能区是一种工具栏。 但是,虽然工具栏是固定的,但是功能区的布局可以根据其显示的宽度而改变。 如果您有这样的应用程序,只需使用它几秒钟,您就会发现魔术发生了。
最新版本的Swing没有此类小部件。 但是,我在java.net上找到了Flamingo项目 。 火烈鸟制作的示例看起来与Office非常相似。
首次尝试使用Flamingo并非易事,因为除了Javadocs和测试应用程序的源代码之外,网络上没有任何文档。 以下是我开始尝试和错误之旅以来的理解。
基础
语义学
- 功能区是上面截图中的大条。 一个框架只能有一条色带
- 任务是一个或多个频段的选项卡式组。 在屏幕截图上,任务是页面布局,编写,动画等。
- 带是一组一个或多个小部件。 在屏幕截图上,带是剪贴板,快速样式,字体等。
基本概念
工具栏上的按钮和功能区栏中的带区之间的核心区别在于,带区的大小可以调整。 例如,这些是显示文档带的步骤,涉及其相对宽度和色带宽度。
最后一步称为图标化状态。 当您单击按钮时,它将整个乐队显示为弹出窗口。
你的第一个丝带
建立
为了使用Flamingo框架,第一步是下载它 。 如果您使用的是Maven,祝您好运! 我在中央库或java.net存储库中都找不到火烈鸟。 因此,无论如何都要下载并手动将其安装在本地(或企业)存储库中。 有关信息,我选择了net.java.dev.flamingo:flamingo位置。
框架
如果您从头开始,那么您很幸运。 只需继承自JRibbonFrame
:方法getRibbon()
将为您提供功能区实例的引用。 从那里,您将能够向其中添加任务。
但是,您可能已经拥有了自己的框架层次结构。 在这种情况下,您必须实例化JRibbon
并将其添加到BorderLayout
-ed框架的NORTH
位置。
在这两种情况下,结果都应类似于以下内容:
添加任务
任务代表逻辑带分组。 它们看起来像标签,并且也扮演了角色。 让我们添加两个这样的任务,分别命名为“ One”和“ Two”。
publicclassMainFrameextendsJRibbonFrame{
publicstaticvoidmain(String[]args){
SwingUtilities.invokeLater(newRunnable(){
@Override
publicvoidrun(){
MainFrameframe=newMainFrame();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
RibbonTasktask1=newRibbonTask("One");
RibbonTasktask2=newRibbonTask("Two");
frame.getRibbon().addTask(task1);
frame.getRibbon().addTask(task2);
}
});
}
}
注意getRibbon()
上的JRibbonFrame
getRibbon()
方法。 它是功能区栏上的参考。
还要注意, addTask()
方法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
的构造JRibbonBand
采用两个参数,即标签和先前未知类ResizableIcon
的实例。 下一节将详细介绍。
到目前为止,如果仅使用对JRibbonBand的引用创建RibbonTask并启动该应用程序,则会收到以下错误消息:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Inconsistent preferred widths Ribbon band 'Hello has the following resize policies org.jvnet.flamingo.ribbon.resize.CoreRibbonResizePolicies$None with preferred width -4 org.jvnet.flamingo.ribbon.resize.CoreRibbonResizePolicies$Low2Mid with preferred width -4 org.jvnet.flamingo.ribbon.resize.CoreRibbonResizePolicies$Mid2Mid with preferred width -4 org.jvnet.flamingo.ribbon.resize.CoreRibbonResizePolicies$Mirror with preferred width -4 org.jvnet.flamingo.ribbon.resize.CoreRibbonResizePolicies$Mid2Low with preferred width -4 org.jvnet.flamingo.ribbon.resize.CoreRibbonResizePolicies$High2Mid with preferred width -4 org.jvnet.flamingo.ribbon.resize.IconRibbonBandResizePolicy with preferred width 42
还记得乐队的大小吗? 火烈鸟需要有关如何做的信息。 在初始显示之前,它将检查这些策略是否一致。 默认情况下,它们不是,这就是它抱怨的原因:Flamingo要求您至少拥有必须放在最后的图标化策略。 但是,在大多数情况下,您需要在策略列表中至少具有正常显示。
让我们修改代码来做到这一点:
JRibbonBandband1=newJRibbonBand("Hello",null);
JRibbonBandband2=newJRibbonBand("world!",null);
band1.setResizePolicies((List)Arrays.asList(newIconRibbonBandResizePolicy(band1.getControlPanel())));
band2.setResizePolicies((List)Arrays.asList(newIconRibbonBandResizePolicy(band1.getControlPanel())));
RibbonTasktask1=newRibbonTask("One",band1);
RibbonTasktask2=newRibbonTask("Two",band2);
前面的代码至少让我们看到了一些东西:
添加按钮(最后!)
即使前一个编译并运行,它仍然没有兴趣。 现在是时候添加一些按钮了!
JCommandButtonbutton1=newJCommandButton("Square",null);
JCommandButtonbutton2=newJCommandButton("Circle",null);
JCommandButtonbutton3=newJCommandButton("Triangle",null);
JCommandButtonbutton4=newJCommandButton("Star",null);
band1.addCommandButton(button1,TOP);
band1.addCommandButton(button2,MEDIUM);
band1.addCommandButton(button3,MEDIUM);
band1.addCommandButton(button4,MEDIUM);
太可惜了,没有结果! 我们的按钮在哪里? 好吧,它们隐藏得很好。 还记得调整大小的政策吗? 只有一个,图标化的状态,其目的只是显示图标化的状态。 只需使用以下代码更新策略行:
band1.setResizePolicies((List)Arrays.asList(
newCoreRibbonResizePolicies.None(band1.getControlPanel()),
newIconRibbonBandResizePolicy(band1.getControlPanel())));
最初的结果看起来是一样的,但是当您调整框架的大小时,它看起来像这样:
即使它在视觉上不是很吸引人,它看起来也比以前更好。 我们在四个按钮上看到了taks,乐队的名称和标签。
可调整大小的图标
JCommandButton
构造函数具有2个参数:一个用于标签,另一个用于特殊的Flamingo类ResizableIcon
。 由于Flamingo都是要以不同的大小显示相同的按钮,因此不足为奇。 可调整大小的图标可以从Image
,ico资源甚至SVG构建。
让我们在框架中添加一个实用程序方法,并为UI增添趣味:
publicstaticResizableIcongetResizableIconFromResource(Stringresource){
returnImageWrapperResizableIcon.getIcon(MainFrame.class.getClassLoader().getResource(resource),newDimension(48,48));
}
...
JCommandButtonbutton1=newJCommandButton("Square",getResizableIconFromResource("path"));
JCommandButtonbutton2=newJCommandButton("Circle",getResizableIconFromResource("to"));
JCommandButtonbutton3=newJCommandButton("Triangle",getResizableIconFromResource("the"));
JCommandButtonbutton4=newJCommandButton("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
。
政策是:
政策 | 描述 |
---|---|
| Command buttons will be represented in the |
| Command buttons that have |
| Command buttons that have |
| Command buttons that have |
| Command buttons that have |
| Command buttons that have |
| Command buttons will be represented in the priority they were assigned to |
| Command buttons will be not represented. The entire band will be represented by a command button that when pressed will show a popup of the unconstrained band. |
现在,您拥有所有元素,可以决定要应用哪些策略。 不过,有一条规则:设置策略时,波段的宽度必须越来越低,并且策略的索引越高(并且必须以IconRibbonBandResizePolicy
),您将得到一个讨厌的IllegalStateException: Inconsistent preferred widths
(请参见上文) )。
让我们对乐队应用一些策略:
band1.setResizePolicies((List)Arrays.asList(
newCoreRibbonResizePolicies.None(band1.getControlPanel()),
newCoreRibbonResizePolicies.Mirror(band1.getControlPanel()),
newCoreRibbonResizePolicies.Mid2Low(band1.getControlPanel()),
newCoreRibbonResizePolicies.High2Low(band1.getControlPanel()),
newIconRibbonBandResizePolicy(band1.getControlPanel())));
这将为我们带来以下结果:
在我的示例中,不会出现任何图标化状态,因为该乐队不会与另一乐队竞争太空。
更多功能
火烈鸟的功能区功能还可以使您:
- 向功能区添加标准的Swing组件
- 在左上角添加菜单
- 与标准外观融合
- 与Substance L&F紧密集成
这些也没有记录,但是您自己更容易理解。
它还具有其他功能:
- 面包屑栏
- 命令按钮条和面板
结论
火烈鸟是一款不错且功能强大的产品,但由于缺少文档而受阻。 我希望本文将朝着将其记录的方向迈出一步。
以下是Eclipse / Maven格式的本文资源 。
— 2010年6月28日编辑:基里尔的反馈意见—
- 5.0版不再要求存在“已图标化”策略
- 我强烈建议不要使用基于图像的图标。 推荐的方法是使用脱机过程将SVG文件转码为基于Java2D的类,然后在运行时使用这些类。 这是我在
BasicCheckRibbon
类中BasicCheckRibbon
。
火烈鸟 即时通讯