使用SWT创建一个菜单条,模拟实现了多级菜单,分隔符,快捷键,响应事件等功能.
代码如下:
- import org.eclipse.swt.SWT;
- import org.eclipse.swt.events.SelectionEvent;
- import org.eclipse.swt.events.SelectionListener;
- import org.eclipse.swt.graphics.Image;
- import org.eclipse.swt.widgets.Display;
- import org.eclipse.swt.widgets.Menu;
- import org.eclipse.swt.widgets.MenuItem;
- import org.eclipse.swt.widgets.Shell;
- public class MenuTest {
- static Display display = new Display();
- static Shell shell = new Shell(display);
- /*
- * 创建多级菜单, 采用SWT.CASCADE样式值可以加入子菜单,采用SWT.PUSH样式值不可以加入子菜单
- */
- public static void createMenu() {
- shell.setSize(500, 500);
- shell.setText("menu test window");
- shell.setImage(new Image(display, "images/Home.png"));
- // 通过shell对象和SWT.BAR样式值来创建一个菜单条
- Menu menu = new Menu(shell, SWT.BAR);
- // 在菜单条的基础之上创建一个File的菜单
- MenuItem file = new MenuItem(menu, SWT.CASCADE);
- file.setText("&File");
- // 先在Shell上创建一个下拉框,然后将下拉框添加到File菜单上
- Menu filemenu = new Menu(shell, SWT.DROP_DOWN);
- file.setMenu(filemenu);
- // 在下拉框上创建菜单项Open
- final MenuItem openItem = new MenuItem(filemenu, SWT.CASCADE);
- openItem.setText("&Open");
- // 在shell上创建一个下拉框,并把它加到open菜单上
- Menu childmenu = new Menu(shell, SWT.DROP_DOWN);
- openItem.setMenu(childmenu);
- // 在open菜单上创建一个子菜单child
- final MenuItem childItem = new MenuItem(childmenu, SWT.PUSH);
- childItem.setText("&Child");
- // 在open菜单上创建一个子菜单dialog
- final MenuItem dialogItem = new MenuItem(childmenu, SWT.PUSH);
- dialogItem.setText("&Dialog");
- // 在菜单项之间创建一个分隔符
- new MenuItem(filemenu, SWT.SEPARATOR);
- // 在下拉框上创建菜单项Exit
- MenuItem exitItem = new MenuItem(filemenu, SWT.PUSH);
- exitItem.setText("&Exit");
- // 设置edit菜单
- MenuItem edit = new MenuItem(menu, SWT.CASCADE);
- edit.setText("&Edit");
- Menu editmenu = new Menu(shell, SWT.DROP_DOWN);
- edit.setMenu(editmenu);
- MenuItem cutItem = new MenuItem(editmenu, SWT.PUSH);
- cutItem.setText("&Cut\tCTRL+X");
- // 设置快捷键
- cutItem.setAccelerator(SWT.CTRL + 'X');
- // 在菜单项之间创建一个分隔符
- new MenuItem(editmenu, SWT.SEPARATOR);
- MenuItem copyItem = new MenuItem(editmenu, SWT.PUSH);
- copyItem.setText("&Copy\tCTRL+C");
- // 设置快捷键
- copyItem.setAccelerator(SWT.CTRL + 'C');
- // 在菜单项之间创建一个分隔符
- new MenuItem(editmenu, SWT.SEPARATOR);
- MenuItem pasteItem = new MenuItem(editmenu, SWT.PUSH);
- pasteItem.setText("&Paste\tCTRL+V");
- // 设置快捷键
- pasteItem.setAccelerator(SWT.CTRL + 'V');
- // 设置window菜单
- MenuItem window = new MenuItem(menu, SWT.CASCADE);
- window.setText("&Window");
- Menu windowmenu = new Menu(shell, SWT.DROP_DOWN);
- window.setMenu(windowmenu);
- final MenuItem maxItem = new MenuItem(windowmenu, SWT.PUSH);
- maxItem.setText("&Max");
- // 在菜单项之间创建一个分隔符
- new MenuItem(windowmenu, SWT.SEPARATOR);
- MenuItem minItem = new MenuItem(windowmenu, SWT.PUSH);
- minItem.setText("&Min");
- // 设置help菜单
- MenuItem help = new MenuItem(menu, SWT.CASCADE);
- help.setText("&Help");
- Menu helpmenu = new Menu(shell, SWT.DROP_DOWN);
- help.setMenu(helpmenu);
- MenuItem aboutItem = new MenuItem(helpmenu, SWT.PUSH);
- aboutItem.setText("&About");
- // 添加一个option菜单,用于添加单选菜单和复选菜单
- MenuItem option = new MenuItem(menu, SWT.CASCADE);
- option.setText("&Option");
- Menu optionmenu = new Menu(shell, SWT.DROP_DOWN);
- option.setMenu(optionmenu);
- MenuItem checkItem1 = new MenuItem(optionmenu, SWT.CHECK);
- checkItem1.setText("Check1");
- MenuItem checkItem2 = new MenuItem(optionmenu, SWT.CHECK);
- checkItem2.setText("Check2");
- // 设置默认为选中
- checkItem2.setSelection(true);
- // 设置分隔符
- new MenuItem(optionmenu, SWT.SEPARATOR);
- MenuItem radioItem1 = new MenuItem(optionmenu, SWT.RADIO);
- radioItem1.setText("Radio1");
- // 设置默认为选中
- radioItem1.setSelection(true);
- MenuItem radioItem2 = new MenuItem(optionmenu, SWT.RADIO);
- radioItem2.setText("Radio2");
- // 为菜单添加相应的事件
- childItem.addSelectionListener(new SelectionListener() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- // TODO Auto-generated method stub
- Shell parent = (Shell) maxItem.getParent().getParent()
- .getParent();
- Shell child = new Shell(parent, SWT.RESIZE | SWT.MAX);
- child.setText("child item has been clicked");
- child.setImage(new Image(display, "images/Alert.png"));
- child.setSize(400, 100);
- child.open();
- }
- @Override
- public void widgetDefaultSelected(SelectionEvent arg0) {
- // TODO Auto-generated method stub
- }
- });
- // 将菜单条添加到shell上
- shell.setMenuBar(menu);
- // 弹出右键菜单
- shell.setMenu(createEditPopup());
- shell.open();
- while (!shell.isDisposed()) {
- if (display.readAndDispatch()) {
- display.sleep();
- }
- }
- display.dispose();
- }
- /*
- * 创建一个右键菜单 通过样式值SWT.POP_UP来创建一个右键弹出菜单
- */
- public static Menu createEditPopup() {
- Menu popMenu = new Menu(shell, SWT.POP_UP);
- MenuItem cutItem = new MenuItem(popMenu, SWT.PUSH);
- cutItem.setText("&Cut");
- MenuItem copyItem = new MenuItem(popMenu, SWT.PUSH);
- copyItem.setText("&Copy");
- MenuItem pasteItem = new MenuItem(popMenu, SWT.PUSH);
- pasteItem.setText("&Paste");
- cutItem.addSelectionListener(new SelectionListener() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- // TODO Auto-generated method stub
- System.out.println("cut");
- }
- @Override
- public void widgetDefaultSelected(SelectionEvent arg0) {
- // TODO Auto-generated method stub
- }
- });
- pasteItem.addSelectionListener(new SelectionListener() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- // TODO Auto-generated method stub
- System.out.println("paste");
- }
- @Override
- public void widgetDefaultSelected(SelectionEvent arg0) {
- // TODO Auto-generated method stub
- }
- });
- copyItem.addSelectionListener(new SelectionListener() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- // TODO Auto-generated method stub
- System.out.println("copy");
- }
- @Override
- public void widgetDefaultSelected(SelectionEvent arg0) {
- // TODO Auto-generated method stub
- }
- });
- return popMenu;
- }
- public static void main(String[] args) {
- MenuTest.createMenu();
- }
- }
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
public class MenuTest {
static Display display = new Display();
static Shell shell = new Shell(display);
/*
* 创建多级菜单, 采用SWT.CASCADE样式值可以加入子菜单,采用SWT.PUSH样式值不可以加入子菜单
*/
public static void createMenu() {
shell.setSize(500, 500);
shell.setText("menu test window");
shell.setImage(new Image(display, "images/Home.png"));
// 通过shell对象和SWT.BAR样式值来创建一个菜单条
Menu menu = new Menu(shell, SWT.BAR);
// 在菜单条的基础之上创建一个File的菜单
MenuItem file = new MenuItem(menu, SWT.CASCADE);
file.setText("&File");
// 先在Shell上创建一个下拉框,然后将下拉框添加到File菜单上
Menu filemenu = new Menu(shell, SWT.DROP_DOWN);
file.setMenu(filemenu);
// 在下拉框上创建菜单项Open
final MenuItem openItem = new MenuItem(filemenu, SWT.CASCADE);
openItem.setText("&Open");
// 在shell上创建一个下拉框,并把它加到open菜单上
Menu childmenu = new Menu(shell, SWT.DROP_DOWN);
openItem.setMenu(childmenu);
// 在open菜单上创建一个子菜单child
final MenuItem childItem = new MenuItem(childmenu, SWT.PUSH);
childItem.setText("&Child");
// 在open菜单上创建一个子菜单dialog
final MenuItem dialogItem = new MenuItem(childmenu, SWT.PUSH);
dialogItem.setText("&Dialog");
// 在菜单项之间创建一个分隔符
new MenuItem(filemenu, SWT.SEPARATOR);
// 在下拉框上创建菜单项Exit
MenuItem exitItem = new MenuItem(filemenu, SWT.PUSH);
exitItem.setText("&Exit");
// 设置edit菜单
MenuItem edit = new MenuItem(menu, SWT.CASCADE);
edit.setText("&Edit");
Menu editmenu = new Menu(shell, SWT.DROP_DOWN);
edit.setMenu(editmenu);
MenuItem cutItem = new MenuItem(editmenu, SWT.PUSH);
cutItem.setText("&Cut\tCTRL+X");
// 设置快捷键
cutItem.setAccelerator(SWT.CTRL + 'X');
// 在菜单项之间创建一个分隔符
new MenuItem(editmenu, SWT.SEPARATOR);
MenuItem copyItem = new MenuItem(editmenu, SWT.PUSH);
copyItem.setText("&Copy\tCTRL+C");
// 设置快捷键
copyItem.setAccelerator(SWT.CTRL + 'C');
// 在菜单项之间创建一个分隔符
new MenuItem(editmenu, SWT.SEPARATOR);
MenuItem pasteItem = new MenuItem(editmenu, SWT.PUSH);
pasteItem.setText("&Paste\tCTRL+V");
// 设置快捷键
pasteItem.setAccelerator(SWT.CTRL + 'V');
// 设置window菜单
MenuItem window = new MenuItem(menu, SWT.CASCADE);
window.setText("&Window");
Menu windowmenu = new Menu(shell, SWT.DROP_DOWN);
window.setMenu(windowmenu);
final MenuItem maxItem = new MenuItem(windowmenu, SWT.PUSH);
maxItem.setText("&Max");
// 在菜单项之间创建一个分隔符
new MenuItem(windowmenu, SWT.SEPARATOR);
MenuItem minItem = new MenuItem(windowmenu, SWT.PUSH);
minItem.setText("&Min");
// 设置help菜单
MenuItem help = new MenuItem(menu, SWT.CASCADE);
help.setText("&Help");
Menu helpmenu = new Menu(shell, SWT.DROP_DOWN);
help.setMenu(helpmenu);
MenuItem aboutItem = new MenuItem(helpmenu, SWT.PUSH);
aboutItem.setText("&About");
// 添加一个option菜单,用于添加单选菜单和复选菜单
MenuItem option = new MenuItem(menu, SWT.CASCADE);
option.setText("&Option");
Menu optionmenu = new Menu(shell, SWT.DROP_DOWN);
option.setMenu(optionmenu);
MenuItem checkItem1 = new MenuItem(optionmenu, SWT.CHECK);
checkItem1.setText("Check1");
MenuItem checkItem2 = new MenuItem(optionmenu, SWT.CHECK);
checkItem2.setText("Check2");
// 设置默认为选中
checkItem2.setSelection(true);
// 设置分隔符
new MenuItem(optionmenu, SWT.SEPARATOR);
MenuItem radioItem1 = new MenuItem(optionmenu, SWT.RADIO);
radioItem1.setText("Radio1");
// 设置默认为选中
radioItem1.setSelection(true);
MenuItem radioItem2 = new MenuItem(optionmenu, SWT.RADIO);
radioItem2.setText("Radio2");
// 为菜单添加相应的事件
childItem.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent arg0) {
// TODO Auto-generated method stub
Shell parent = (Shell) maxItem.getParent().getParent()
.getParent();
Shell child = new Shell(parent, SWT.RESIZE | SWT.MAX);
child.setText("child item has been clicked");
child.setImage(new Image(display, "images/Alert.png"));
child.setSize(400, 100);
child.open();
}
@Override
public void widgetDefaultSelected(SelectionEvent arg0) {
// TODO Auto-generated method stub
}
});
// 将菜单条添加到shell上
shell.setMenuBar(menu);
// 弹出右键菜单
shell.setMenu(createEditPopup());
shell.open();
while (!shell.isDisposed()) {
if (display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
/*
* 创建一个右键菜单 通过样式值SWT.POP_UP来创建一个右键弹出菜单
*/
public static Menu createEditPopup() {
Menu popMenu = new Menu(shell, SWT.POP_UP);
MenuItem cutItem = new MenuItem(popMenu, SWT.PUSH);
cutItem.setText("&Cut");
MenuItem copyItem = new MenuItem(popMenu, SWT.PUSH);
copyItem.setText("&Copy");
MenuItem pasteItem = new MenuItem(popMenu, SWT.PUSH);
pasteItem.setText("&Paste");
cutItem.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("cut");
}
@Override
public void widgetDefaultSelected(SelectionEvent arg0) {
// TODO Auto-generated method stub
}
});
pasteItem.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("paste");
}
@Override
public void widgetDefaultSelected(SelectionEvent arg0) {
// TODO Auto-generated method stub
}
});
copyItem.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("copy");
}
@Override
public void widgetDefaultSelected(SelectionEvent arg0) {
// TODO Auto-generated method stub
}
});
return popMenu;
}
public static void main(String[] args) {
MenuTest.createMenu();
}
}
效果图如下: