您的位置:首页 > 编程语言 > Java开发

Java Swing Ribbon(Flamingo)的使用04:按钮模式更改

2014-11-02 23:07 573 查看
这篇文章将简单介绍一下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);
}
}
代码上述运行结果如下:



(未完待续)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息