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

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


(未完待续)


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值