这篇文章将简单介绍一下Ribbon中常用的控件按钮使用的方式和代码实现的过程。在看这篇文章之前建议先看如下的一些文章。当然如果对Flamino-Ribbon已经有一些基本的了解的则不用看了。
01.关于Flamingo-Ribbon的安装与使用:Flamingo-Ribbon的使用01:安装与初始使用
02.关于Fiamingo-Ribbon界面风格设置:Flamingo-Ribbon的使用02:更改界面风格
03.关于Flamingo-Ribbon按钮样式更改:Flamingo-Ribbon的使用03:按钮中添加图片和更改样式
1 一个Task中添加多个Band
如果需要在一个Task(RibbonTask)中添加多个Band(JRibbonBand),则可以在新建Task的时候将Band对象作为构造函数的参数即可,代码如下:
import java.awt.Dimension;
import java.util.Arrays;
import java.util.List;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import org.pushingpixels.flamingo.api.common.JCommandButton;
import org.pushingpixels.flamingo.api.common.icon.ImageWrapperResizableIcon;
import org.pushingpixels.flamingo.api.common.icon.ResizableIcon;
import org.pushingpixels.flamingo.api.ribbon.JRibbonBand;
import org.pushingpixels.flamingo.api.ribbon.JRibbonFrame;
import org.pushingpixels.flamingo.api.ribbon.RibbonElementPriority;
import org.pushingpixels.flamingo.api.ribbon.RibbonTask;
import org.pushingpixels.flamingo.api.ribbon.resize.CoreRibbonResizePolicies;
import org.pushingpixels.flamingo.api.ribbon.resize.IconRibbonBandResizePolicy;
public class MainFrame extends JRibbonFrame {
static {
// 设置界面风格:获取系统样式
try {
javax.swing.UIManager.setLookAndFeel(
"org.pushingpixels.substance.api.skin.SubstanceOfficeBlue2007LookAndFeel");
} catch (Exception e) {
e.printStackTrace();
}
}
//根据图片的地址获取该图片,返回ResizableIcon
public static ResizableIcon getResizableIconFromResource(String resource) {
return ImageWrapperResizableIcon.getIcon(
MainFrame.class.getClassLoader().getResource(resource),
new Dimension(48, 48));
}
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true); //windows功能失效
JDialog.setDefaultLookAndFeelDecorated(true); //Dialog功能失效
SwingUtilities.invokeLater(new Runnable() {
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public void run() {
MainFrame frame = new MainFrame();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
JRibbonBand fileBand = new JRibbonBand("文件", null); //新建一个Band
JRibbonBand operBand = new JRibbonBand("操作", null); //新建一个Band
fileBand.setResizePolicies((List) Arrays.asList(
new CoreRibbonResizePolicies.None(fileBand.getControlPanel()),
new IconRibbonBandResizePolicy(fileBand.getControlPanel())));
operBand.setResizePolicies((List) Arrays.asList(
new CoreRibbonResizePolicies.None(fileBand.getControlPanel()),
new IconRibbonBandResizePolicy(fileBand.getControlPanel())));
JCommandButton button1 =
new JCommandButton("Square",
getResizableIconFromResource("resources/Project.png"));
JCommandButton button2 =
new JCommandButton("Circle",
getResizableIconFromResource("resources/Clear.png"));
JCommandButton button3 =
new JCommandButton("Triangle",
getResizableIconFromResource("resources/ZoomOut.png"));
JCommandButton button4 =
new JCommandButton("Star",
getResizableIconFromResource("resources/ZoomIn.png"));
fileBand.addCommandButton(button1, RibbonElementPriority.TOP);
fileBand.addCommandButton(button2, RibbonElementPriority.MEDIUM);
operBand.addCommandButton(button3, RibbonElementPriority.TOP);
operBand.addCommandButton(button4, RibbonElementPriority.MEDIUM);
//新建一个Task,并将Band添加到该Task中去
RibbonTask task1 = new RibbonTask("One", fileBand, operBand);
//先获取Ribbon,然后在Ribbon上添加一个Task
frame.getRibbon().addTask(task1);
frame.pack();
frame.setVisible(true);
}
});
}
}
运行结果如下:
对于上述代码,有一个RibbonTask对象,该Task中有两个Band:“文件”和“操作”。将Band添加到Task方法很简单。如果有多个Band只要在Task构造方法依次写出来即可,例如:
RibbonTask task1 = new RibbonTask("One", band1, band2, band3, band4, band5, band6);
这样共添加了6个Band。
2 添加下拉菜单按钮
下拉菜单按钮其实还是按钮(JCommandButton),只是展示方式不同,因此在编写代码时需要修改JCommandButton的属性即可,其代码为:
JCommandButton btnLyrSelect = new JCommandButton("图层选择");
btnLyrSelect.setCommandButtonKind(CommandButtonKind.POPUP_ONLY);
btnLyrSelect.setPopupCallback(new PopupPanelCallback() {
@Override
public JPopupPanel getPopupPanel(JCommandButton commandButton) {
JCommandPopupMenu menu = new JCommandPopupMenu();
menu.addMenuButton(new JCommandMenuButton("你好Menu",
getResizableIconFromResource("cn/edu/njnu/resources/Project.png")));
menu.addMenuButton(new JCommandMenuButton("HelloMenu", null));
menu.addMenuSeparator();
return menu;
}
});
其完整代码如下:
import java.awt.Dimension;
import java.util.Arrays;
import java.util.List;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import org.pushingpixels.flamingo.api.common.JCommandButton;
import org.pushingpixels.flamingo.api.common.JCommandButton.CommandButtonKind;
import org.pushingpixels.flamingo.api.common.JCommandMenuButton;
import org.pushingpixels.flamingo.api.common.icon.ImageWrapperResizableIcon;
import org.pushingpixels.flamingo.api.common.icon.ResizableIcon;
import org.pushingpixels.flamingo.api.common.popup.JCommandPopupMenu;
import org.pushingpixels.flamingo.api.common.popup.JPopupPanel;
import org.pushingpixels.flamingo.api.common.popup.PopupPanelCallback;
import org.pushingpixels.flamingo.api.ribbon.JRibbonBand;
import org.pushingpixels.flamingo.api.ribbon.JRibbonFrame;
import org.pushingpixels.flamingo.api.ribbon.RibbonElementPriority;
import org.pushingpixels.flamingo.api.ribbon.RibbonTask;
import org.pushingpixels.flamingo.api.ribbon.resize.CoreRibbonResizePolicies;
import org.pushingpixels.flamingo.api.ribbon.resize.IconRibbonBandResizePolicy;
public class MainFrame extends JRibbonFrame {
static {
// 设置界面风格:获取系统样式
try {
javax.swing.UIManager.setLookAndFeel(
"org.pushingpixels.substance.api.skin.SubstanceOfficeBlue2007LookAndFeel");
} catch (Exception e) {
e.printStackTrace();
}
}
//根据图片的地址获取该图片,返回ResizableIcon
public static ResizableIcon getResizableIconFromResource(String resource) {
return ImageWrapperResizableIcon.getIcon(
MainFrame.class.getClassLoader().getResource(resource),
new Dimension(48, 48));
}
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true); //windows功能失效
JDialog.setDefaultLookAndFeelDecorated(true); //Dialog功能失效
SwingUtilities.invokeLater(new Runnable() {
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public void run() {
MainFrame frame = new MainFrame();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
JRibbonBand fileBand = new JRibbonBand("文件", null); //新建一个Band
fileBand.setResizePolicies((List) Arrays.asList(
new CoreRibbonResizePolicies.None(fileBand.getControlPanel()),
new IconRibbonBandResizePolicy(fileBand.getControlPanel())));
JCommandButton btnLyrSelect = new JCommandButton("图层选择");
btnLyrSelect.setCommandButtonKind(CommandButtonKind.POPUP_ONLY);
btnLyrSelect.setPopupCallback(new PopupPanelCallback() {
@Override
public JPopupPanel getPopupPanel(JCommandButton commandButton) {
JCommandPopupMenu menu = new JCommandPopupMenu();
menu.addMenuButton(new JCommandMenuButton("你好Menu",
getResizableIconFromResource("cn/edu/njnu/resources/Project.png")));
menu.addMenuButton(new JCommandMenuButton("HelloMenu", null));
menu.addMenuSeparator();
return menu;
}
});
fileBand.addCommandButton(btnLyrSelect, RibbonElementPriority.TOP);
//新建一个Task,并将Band添加到该Task中去
RibbonTask task1 = new RibbonTask("One", fileBand);
//先获取Ribbon,然后在Ribbon上添加一个Task
frame.getRibbon().addTask(task1);
frame.pack();
frame.setVisible(true);
}
});
}
}
运行上述代码结果如下:
3 富弹出按钮(Rich Popups)
Rich Popups按钮其实还是按钮(JCommandButton),只是展示方式不同,因此在编写代码时需要修改JCommandButton的属性即可,其代码为:
btnLyrSelect.setDisplayState(CommandButtonDisplayState.BIG);
btnLyrSelect.setCommandButtonKind(CommandButtonKind.POPUP_ONLY);
btnLyrSelect.setPopupCallback(new PopupPanelCallback() {
@Override
public JPopupPanel getPopupPanel(JCommandButton commandButton) {
JCommandButtonPanel panel = new JCommandButtonPanel(CommandButtonDisplayState.BIG);
panel.addButtonGroup("group1");
panel.addButtonGroup("group2");
panel.addButtonToGroup("group1", new JCommandButton("1"));
panel.addButtonToGroup("group1", new JCommandButton("2"));
panel.addButtonToGroup("group1", new JCommandButton("3"));
panel.addButtonToGroup("group1", new JCommandButton("4"));
panel.addButtonToGroup("group1", new JCommandButton("5"));
panel.addButtonToGroup("group2", new JCommandButton("6"));
panel.addButtonToGroup("group2", new JCommandButton("7"));
panel.addButtonToGroup("group2", new JCommandButton("8"));
JCommandPopupMenu menu = new JCommandPopupMenu(panel, 5, 5);
menu.setAutoscrolls(true);
return menu;
}
});
其完整代码如下:
import java.awt.Dimension;
import java.util.Arrays;
import java.util.List;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import org.pushingpixels.flamingo.api.common.CommandButtonDisplayState;
import org.pushingpixels.flamingo.api.common.JCommandButton;
import org.pushingpixels.flamingo.api.common.JCommandButton.CommandButtonKind;
import org.pushingpixels.flamingo.api.common.JCommandButtonPanel;
import org.pushingpixels.flamingo.api.common.JCommandMenuButton;
import org.pushingpixels.flamingo.api.common.icon.ImageWrapperResizableIcon;
import org.pushingpixels.flamingo.api.common.icon.ResizableIcon;
import org.pushingpixels.flamingo.api.common.popup.JCommandPopupMenu;
import org.pushingpixels.flamingo.api.common.popup.JPopupPanel;
import org.pushingpixels.flamingo.api.common.popup.PopupPanelCallback;
import org.pushingpixels.flamingo.api.ribbon.JRibbonBand;
import org.pushingpixels.flamingo.api.ribbon.JRibbonFrame;
import org.pushingpixels.flamingo.api.ribbon.RibbonElementPriority;
import org.pushingpixels.flamingo.api.ribbon.RibbonTask;
import org.pushingpixels.flamingo.api.ribbon.resize.CoreRibbonResizePolicies;
import org.pushingpixels.flamingo.api.ribbon.resize.IconRibbonBandResizePolicy;
public class MainFrame extends JRibbonFrame {
static {
// 设置界面风格:获取系统样式
try {
javax.swing.UIManager.setLookAndFeel(
"org.pushingpixels.substance.api.skin.SubstanceOfficeBlue2007LookAndFeel");
} catch (Exception e) {
e.printStackTrace();
}
}
//根据图片的地址获取该图片,返回ResizableIcon
public static ResizableIcon getResizableIconFromResource(String resource) {
return ImageWrapperResizableIcon.getIcon(
MainFrame.class.getClassLoader().getResource(resource),
new Dimension(48, 48));
}
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true); //windows功能失效
JDialog.setDefaultLookAndFeelDecorated(true); //Dialog功能失效
SwingUtilities.invokeLater(new Runnable() {
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public void run() {
MainFrame frame = new MainFrame();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
JRibbonBand fileBand = new JRibbonBand("文件", null); //新建一个Band
fileBand.setResizePolicies((List) Arrays.asList(
new CoreRibbonResizePolicies.None(fileBand.getControlPanel()),
new IconRibbonBandResizePolicy(fileBand.getControlPanel())));
JCommandButton btnLyrSelect = new JCommandButton("图层选择");
btnLyrSelect.setDisplayState(CommandButtonDisplayState.BIG);
btnLyrSelect.setCommandButtonKind(CommandButtonKind.POPUP_ONLY);
btnLyrSelect.setPopupCallback(new PopupPanelCallback() {
@Override
public JPopupPanel getPopupPanel(JCommandButton commandButton) {
JCommandButtonPanel panel =
new JCommandButtonPanel(CommandButtonDisplayState.BIG);
panel.addButtonGroup("group1");
panel.addButtonGroup("group2");
panel.addButtonToGroup("group1", new JCommandButton("1"));
panel.addButtonToGroup("group1", new JCommandButton("2"));
panel.addButtonToGroup("group1", new JCommandButton("3"));
panel.addButtonToGroup("group1", new JCommandButton("4"));
panel.addButtonToGroup("group1", new JCommandButton("5"));
panel.addButtonToGroup("group2", new JCommandButton("6"));
panel.addButtonToGroup("group2", new JCommandButton("7"));
panel.addButtonToGroup("group2", new JCommandButton("8"));
JCommandPopupMenu menu = new JCommandPopupMenu(panel, 5, 5);
menu.setAutoscrolls(true);
return menu;
}
});
fileBand.addCommandButton(btnLyrSelect, RibbonElementPriority.TOP);
//新建一个Task,并将Band添加到该Task中去
RibbonTask task1 = new RibbonTask("One", fileBand);
//先获取Ribbon,然后在Ribbon上添加一个Task
frame.getRibbon().addTask(task1);
frame.pack();
frame.setVisible(true);
}
});
}
}
运行上述代码结果如下:
点击按钮:
4 RibbonContextualTaskGroup
有时不是希望所有菜单都一直显示的。例如在Word 2013中,“图片工具”菜单和“表格工具”菜单只有在选中了图片或者表格后才会显示出来。当取消选中图片或者表格时,这种菜单就会隐藏,如下图的Word 2013所示:
这种菜单在Flamingo-Ribbon中可通过RibbonContextualTaskGroup来实现。其代码为:
//设置Group
private static void setGroup(JRibbon ribbon, RibbonTask task) {
//ContextualTaskGroup
RibbonContextualTaskGroup r = new RibbonContextualTaskGroup("图层",
new Color(200, 40, 150), task);
ribbon.addContextualTaskGroup(r);
ribbon.setVisible(r, true);
}
其完整代码如下:
import java.awt.Color;
import java.awt.Dimension;
import java.util.Arrays;
import java.util.List;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import org.pushingpixels.flamingo.api.common.CommandButtonDisplayState;
import org.pushingpixels.flamingo.api.common.JCommandButton;
import org.pushingpixels.flamingo.api.common.JCommandButton.CommandButtonKind;
import org.pushingpixels.flamingo.api.common.JCommandButtonPanel;
import org.pushingpixels.flamingo.api.common.JCommandMenuButton;
import org.pushingpixels.flamingo.api.common.icon.ImageWrapperResizableIcon;
import org.pushingpixels.flamingo.api.common.icon.ResizableIcon;
import org.pushingpixels.flamingo.api.common.popup.JCommandPopupMenu;
import org.pushingpixels.flamingo.api.common.popup.JPopupPanel;
import org.pushingpixels.flamingo.api.common.popup.PopupPanelCallback;
import org.pushingpixels.flamingo.api.ribbon.JRibbon;
import org.pushingpixels.flamingo.api.ribbon.JRibbonBand;
import org.pushingpixels.flamingo.api.ribbon.JRibbonFrame;
import org.pushingpixels.flamingo.api.ribbon.RibbonContextualTaskGroup;
import org.pushingpixels.flamingo.api.ribbon.RibbonElementPriority;
import org.pushingpixels.flamingo.api.ribbon.RibbonTask;
import org.pushingpixels.flamingo.api.ribbon.resize.CoreRibbonResizePolicies;
import org.pushingpixels.flamingo.api.ribbon.resize.IconRibbonBandResizePolicy;
public class MainFrame extends JRibbonFrame {
static {
// 设置界面风格:获取系统样式
try {
javax.swing.UIManager.setLookAndFeel(
"org.pushingpixels.substance.api.skin.SubstanceOfficeBlue2007LookAndFeel");
} catch (Exception e) {
e.printStackTrace();
}
}
//根据图片的地址获取该图片,返回ResizableIcon
public static ResizableIcon getResizableIconFromResource(String resource) {
return ImageWrapperResizableIcon.getIcon(
MainFrame.class.getClassLoader().getResource(resource),
new Dimension(48, 48));
}
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true); //windows功能失效
JDialog.setDefaultLookAndFeelDecorated(true); //Dialog功能失效
SwingUtilities.invokeLater(new Runnable() {
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public void run() {
MainFrame frame = new MainFrame();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
JRibbonBand band = new JRibbonBand("文件", null); //新建一个Band
band.setResizePolicies((List) Arrays.asList(
new CoreRibbonResizePolicies.None(band.getControlPanel()),
new IconRibbonBandResizePolicy(band.getControlPanel())));
JCommandButton button1 = new JCommandButton("Square",
getResizableIconFromResource("resources/Project.png"));
JCommandButton button2 = new JCommandButton("Circle",
getResizableIconFromResource("resources/Clear.png"));
JCommandButton button3 = new JCommandButton("Triangle",
getResizableIconFromResource("resources/ZoomOut.png"));
JCommandButton button4 = new JCommandButton("Star",
getResizableIconFromResource("resources/ZoomIn.png"));
band.addCommandButton(button1, RibbonElementPriority.TOP);
band.addCommandButton(button2, RibbonElementPriority.MEDIUM);
band.addCommandButton(button3, RibbonElementPriority.MEDIUM);
band.addCommandButton(button4, RibbonElementPriority.MEDIUM);
//新建一个Task,并将Band添加到该Task中去
RibbonTask task1 = new RibbonTask("One", band);
JRibbon ribbon = frame.getRibbon();
ribbon.addTask(task1);
setGroup(ribbon, task1);
frame.pack();
frame.setVisible(true);
}
});
}
//设置Group
private static void setGroup(JRibbon ribbon, RibbonTask task) {
//ContextualTaskGroup
RibbonContextualTaskGroup r =
new RibbonContextualTaskGroup("图层", new Color(200, 40, 150), task);
ribbon.addContextualTaskGroup(r);
ribbon.setVisible(r, true);
}
}
代码上述运行结果如下:
(未完待续)