孔维滢 201771010110《面向对象程序设计(java)》第十四周学习总结

实验十四  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”事件注册监听器。

我对于网格组布局的第十个程序还存在一些不懂的地方,希望第十组的同学可以讲解。

通过这次小组协作的学习,我觉得相较于之前的个人学习,小组协作可以和同学交换意见,查漏补缺,虽然中间出现了一些意见不同的地方,但是我们最后还是解决了问题,而且我还发现同组的同学对于一些知识点比我掌握的更加准确,是一次很好的相互学习的机会。

原文地址:https://www.cnblogs.com/Weiron/p/10053683.html