实验十四 Swing图形界面组件
1、实验目的与要求
(1) 掌握GUI布局管理器用法;
(2) 掌握各类Java Swing组件用途及常用API;
2、实验内容和步骤
实验1: 导入第12章示例程序,测试程序并进行组内讨论。
测试程序2
测试程序3
测试程序4
测试程序5
测试程序6
测试程序7
测试程序9
测试程序10
测试程序11
测试程序12
测试程序13
测试程序14
测试程序15
测试程序16
实验2:组内讨论反思本组负责程序,理解程序总体结构,梳理程序GUI设计中应用的相关组件,整理相关组件的API,对程序中组件应用的相关代码添加注释。
测试程序8:
MenuTest.java
package menu; import java.awt.*; import javax.swing.*; /** * @version 1.24 2012-06-12 * @author Cay Horstmann */ public class MenuTest { public static void main(String[] args) { EventQueue.invokeLater(() -> { JFrame frame = new MenuFrame();//构建一个MenuFrame类对象 frame.setTitle("MenuTest");//设置Title属性,确定框架标题栏中的文字 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置默认关闭操作,退出并关闭 frame.setVisible(true);//设置Visible属性,组件可见 }); } }
MenuFrame.java
package menu; import java.awt.event.*; import javax.swing.*; /** * 带有示例菜单栏的框架。 */ public class MenuFrame extends JFrame { private static final int DEFAULT_WIDTH = 300; private static final int DEFAULT_HEIGHT = 200; private Action saveAction;// private Action saveAsAction; private JCheckBoxMenuItem readonlyItem;//用给定的readonlyItem标签构造一个复选框菜单项 private JPopupMenu popup;//弹出菜单 /** * 将操作名称打印到System.out的示例操作 */ class TestAction extends AbstractAction { public TestAction(String name) { super(name); } public void actionPerformed(ActionEvent event) { System.out.println(getValue(Action.NAME) + " selected.");//实现接口方法 } } public MenuFrame() { setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); JMenu fileMenu = new JMenu("File");//菜单对象 fileMenu.add(new TestAction("New"));//将TestAction对象添加到菜单中 // 演示加速器 JMenuItem openItem = fileMenu.add(new TestAction("Open")); openItem.setAccelerator(KeyStroke.getKeyStroke("ctrl O"));//调用setAccelerator方法将加速器键关联到一个菜单项上,使用KeyStroke类型的对象作为参数,将CTRL+O关联到OpenItem菜单项 fileMenu.addSeparator();//Jmenu的一个方法将新分隔符追加到菜单的末尾。 saveAction = new TestAction("Save"); JMenuItem saveItem = fileMenu.add(saveAction); saveItem.setAccelerator(KeyStroke.getKeyStroke("ctrl S")); saveAsAction = new TestAction("Save As");//将要执行的行为赋值给菜单子项 fileMenu.add(saveAsAction); fileMenu.addSeparator(); fileMenu.add(new TestAction("Exit")// AbstractAction或者TestAction都可以,,,因为子类继承了出构造器外的所有方法 { public void actionPerformed(ActionEvent event) { System.exit(0); } }); // 演示复选框和单选按钮菜单 readonlyItem = new JCheckBoxMenuItem("Read-only");//创建复选框菜单项 readonlyItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { boolean saveOk = !readonlyItem.isSelected(); saveAction.setEnabled(saveOk);//调用setEnable方法,启用save菜单项 saveAsAction.setEnabled(saveOk);//调用setEnable方法,启用saveAs菜单项 } }); //将单选钮菜单项加入到按钮组中,当按钮组中的一个按钮被选中时,其他的按钮都自动的变为未选择项 ButtonGroup group = new ButtonGroup(); JRadioButtonMenuItem insertItem = new JRadioButtonMenuItem("Insert"); insertItem.setSelected(true);//调用setSelected方法,设置insert这个菜单项的选择状态 JRadioButtonMenuItem overtypeItem = new JRadioButtonMenuItem("Overtype"); group.add(insertItem); group.add(overtypeItem); // 演示图标 Action cutAction = new TestAction("Cut"); cutAction.putValue(Action.SMALL_ICON, new ImageIcon("cut.gif"));//使用关联的键设置此对象的一个属性 Action copyAction = new TestAction("Copy"); copyAction.putValue(Action.SMALL_ICON, new ImageIcon("copy.gif")); Action pasteAction = new TestAction("Paste"); pasteAction.putValue(Action.SMALL_ICON, new ImageIcon("paste.gif")); JMenu editMenu = new JMenu("Edit");//构建一个JMenu类对象,为每一个菜单建立一个菜单对象 editMenu.add(cutAction); editMenu.add(copyAction); editMenu.add(pasteAction); // 演示嵌套菜单 JMenu optionMenu = new JMenu("Options"); optionMenu.add(readonlyItem); optionMenu.addSeparator(); optionMenu.add(insertItem); optionMenu.add(overtypeItem); editMenu.addSeparator(); editMenu.add(optionMenu); // 说明助记符 JMenu helpMenu = new JMenu("Help"); helpMenu.setMnemonic('H');//调用setMnemonic方法,为help菜单设置快捷键 JMenuItem indexItem = new JMenuItem("Index"); indexItem.setMnemonic('I');//调用setMnemonic方法,为index菜单设置快捷键,该字符会在标签中以带下划线的形式显示 helpMenu.add(indexItem); // 您还可以向操作添加助记符键 Action aboutAction = new TestAction("About"); aboutAction.putValue(Action.MNEMONIC_KEY, new Integer('A'));//把快捷键作为Action.MNEMONIC_KEY的键值添加到对象中 helpMenu.add(aboutAction); // 将所有顶级菜单添加到菜单栏 JMenuBar menuBar = new JMenuBar(); setJMenuBar(menuBar);//调用setMenuBar方法将菜单栏添加到框架上 menuBar.add(fileMenu); menuBar.add(editMenu); menuBar.add(helpMenu); // 显示弹出窗口 popup = new JPopupMenu(); popup.add(cutAction); popup.add(copyAction); popup.add(pasteAction); JPanel panel = new JPanel(); panel.setComponentPopupMenu(popup); add(panel); } }
输出结果:
Open快捷键:Ctrl+0 Save快捷键:Ctrl+S
单击鼠标右键,弹出菜单。
相关组件API:
创建一个菜单栏:JMenuBarmenuBar=new JMenuBar();
调用框架的setJMenuBar方法可将一个菜单栏对 象添加到框架上:frame.setJMenuBar(menuBar);
创建菜单对象,并将菜单对象添加到菜单栏中:JMenueditMenu=new Jmenu("Edit"); menuBar.add(editMenu);
向菜单对象添加一个菜单项:JMenItempasteItem=new JMenItem(); editMenu.add(pasteItem);
向菜单对象添加分隔符行:editMenu.addSeperator();
向菜单对象项添加子菜单:JMenuoptionsMenu=new Jmenu(“option”); editMenu.add(optionsMenu);
图标添加到一个动作上:cutAction.putValue(Action.SMALL_ICON,new ImageIcon("cut.gif"));
单选按钮菜单项:ButtonGroup group = new ButtonGroup( );
创建一个弹出菜单:JPopupMenupopup = new JPopupMenu();
然后用常规方法为弹出菜单添加菜单项:JMenuItem item = new JMenuItem("Cut"); item.addActionListener(listener); popup.add(item);
为菜单项设置快捷键:JMenuItem CutItem=new JMenuItem(" Index"); CutItem.setMnemonic(" I");此快捷键就会自动显示在菜单项中,快捷键下面 有一条下划线。
屏蔽/启用菜单项:aMenuItem.setEnabled(boolean)
创建弹出菜单:JPopupMenupopup = new JPopupMenu();
显示一个弹出菜单:void show(Component c, int x,int y)
设置弹出式触发器:component.setComponentPopupMenu(popup);
使用SetAccelerator方法可以将加速器关联到一个菜单项:openItem.setAccelerator(KeyStroke.getKeyStroke("ctrl o" ));
实验总结:
此次实验,我们组主要负责菜单这一节的学习
首先,菜单的创建,首先创建一个菜单栏,调用框架的setJMenuBar方法可将一个菜单栏对象添加到框架上;创建菜单对象,并将菜单对象添加到菜单栏中;向菜单对象添加一个菜单项;向菜单对象添加分隔符行;向菜单对象项添加子菜单。
其次,将菜单事件监听器插入,当用户选择菜单时,将触发一个动作事件,要为每个菜单项安装一个动作监听器,菜单对象的add方法可返回创建的子菜单项;
然后,可以添加菜单项中的图标。
我们还学到了单选按钮菜单项,单选按钮菜单项与普通单选按钮的工作方式一样 ,必须将它们加入的按钮组中。当按钮组中的一 个按钮被选中时,其它按钮就自动变为选择项。使用这些菜单项,不需要立即得到用户选择菜单 项的通知而是使用isSelected方法来测试。
还有弹出菜单,如何设置弹出式触发器,让用户点击鼠标某个键时弹出菜单。
以及快捷键的创建,为菜单项设置快捷键。在当前菜单打开的情 况下,可以按下某菜单项的快捷键,相当于鼠标单击了该菜单项。再如加速器,加速器可以在不打开菜单的情况下选中菜单项的快捷键,当用户按下加速器组合键时,就自动选择了相应的菜单项,同时激活一个动作事件。加速器只能关联在菜单项,而不能关联菜单。加速器实际上并不打开菜单,而是直接激活菜单关联 的动作事件。
最后是启用和禁用菜单项,在程序运行过程中,经常需要屏蔽某些暂时不适用 的命令,待到条件允许时再使之重新可用。如果需要动态启用/屏蔽某菜单项,则需要为 “menu selected”事件注册监听器。
我对于网格组布局的第十个程序还存在一些不懂的地方,希望第十组的同学可以讲解。
通过这次小组协作的学习,我觉得相较于之前的个人学习,小组协作可以和同学交换意见,查漏补缺,虽然中间出现了一些意见不同的地方,但是我们最后还是解决了问题,而且我还发现同组的同学对于一些知识点比我掌握的更加准确,是一次很好的相互学习的机会。