第五次

来源:互联网 发布:java中定义数组 编辑:程序博客网 时间:2024/04/29 09:12
package demo;


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;


import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;


public class GUITest {


    public static void main(String[] args){
        MyJFrame myJFrame = new MyJFrame();
        myJFrame.setTitle("浏览器");
        myJFrame.setBounds(100, 100, 750, 450);
        myJFrame.setVisible(true);
    }
}


class MyJFrame extends JFrame implements MenuListener, ActionListener{
    JMenuBar menuBar;
    JMenu menuFile,menuEdit,menuLook,subMenuOpen,menuClear;
    JMenuItem menuItemSave,menuItemOpenX,menuItemOpenY,
    menuItemCopy,menuItemStop,menuItemRefresh;
    JTextArea showTextArea;//文本区域,用来显示多行文本
    /*
     * 1.String的对象是不可变的;而StringBuilder和StringBuffer是可变的。
     * 2.StringBuilder不是线程安全的;而StringBuffer是线程安全的
     * 3.String中的offset,value,count都是被final修饰的不可修改的;
     *   而StringBuffer和StringBuilder中的value,count都是继承自AbstractStringBuilder类的,
     *   没有被final修饰,说明他们在运行期间是可修改的,而且没有offset变量。
     */
    StringBuffer str = new StringBuffer("注意:按下Alt或者点击一个菜单后菜单栏上的菜单事可以滑动选择的,"
            + "这样就造成鼠标滑动时文本区域输出大量数据\n");//定义一个可变字符串用来不断获取以及更改文本区域内容
    public MyJFrame() {
        /////////////创建菜单栏和一级菜单///////////////
        menuBar = new JMenuBar();
        menuFile = new JMenu("文件(F)");
        menuEdit = new JMenu("编辑(E)");
        menuLook = new JMenu("查看(L)");
        subMenuOpen = new JMenu("打开");
        menuClear = new JMenu("清空文本区域(D)");


        //////////////////创建菜单项/////////////////
        menuItemOpenX = new JMenuItem("打开X");
        menuItemOpenY = new JMenuItem("打开Y");
        menuItemSave = new JMenuItem("保存");
        menuItemCopy = new JMenuItem("复制");
        menuItemStop = new JMenuItem("停止");
        menuItemRefresh = new JMenuItem("刷新");


        /*
         * JMenuItem的点击事件
         * Ctrl+S可以触发,Ctrl+C没有被触发
         */
        menuItemOpenX.addActionListener(this);
        menuItemOpenY.addActionListener(this);
        menuItemSave.addActionListener(this);
        menuItemCopy.addActionListener(this);
        menuItemStop.addActionListener(this);
        menuItemRefresh.addActionListener(this);


        ////////////////创建文本区域/////////////////
        /*
         * 这里15,30的话不需要滚动条,所以滚动条自动隐藏,看效果直接指定为150,500
         */
        showTextArea = new JTextArea(15,60);
        showTextArea.setText(str.toString());
        add(new JScrollPane(showTextArea));//将文本区域放入一个滚动布局中


        ////////////////设置快捷键//////////////////
        menuFile.setMnemonic('F');//文件(F)
        menuItemSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK));//保存 Ctrl+S
        //subMenu不设置快捷键
        menuEdit.setMnemonic('E');//编辑(E)
        menuItemCopy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));//复制 Ctrl+C
        menuLook.setMnemonic('L');//查看(L)
        menuClear.setMnemonic('D');//清空文本区域(D)


        ///////////////设置事件////////////////////
        /*
         * 这里直接用匿名内部类的方式来写的,比较常见的有三种方法,第两种在下边,第三种参考课本
         * JMenu本身没有点击触发事件!!!!
         */
        menuFile.addMenuListener(new MenuListener() {


            @Override
            public void menuSelected(MenuEvent e) {
                // 选择某个菜单时调用
                str = str.append("选择了文件菜单\n");//String转换为StringBuffer
                showTextArea.setText(str.toString());//StringBuffer转换为String
            }


            @Override
            public void menuDeselected(MenuEvent e) {
                // 取消选择某个菜单时调用


            }


            @Override
            public void menuCanceled(MenuEvent e) {
                // 取消菜单时调用


            }
        });


        //事件的第二中种实现方式
        menuClear.addMenuListener(this);
        menuEdit.addMenuListener(this);
        menuLook.addMenuListener(this);


        /////////////将菜单项设置到菜单中/////////////
        subMenuOpen.add(menuItemOpenX);
        subMenuOpen.add(menuItemOpenY);
        menuFile.add(menuItemSave);
        menuFile.add(subMenuOpen);
        menuEdit.add(menuItemCopy);
        menuLook.add(menuItemStop);
        menuLook.add(menuItemRefresh);


        ////////////将菜单设置到菜单栏///////////////
        menuBar.add(menuFile);
        menuBar.add(menuEdit);
        menuBar.add(menuLook);
        menuBar.add(menuClear);


        ////////////将菜单栏设置到窗口//////////////
        setJMenuBar(menuBar);




    }


    //////////JMenu菜单事件的第二种实现方法///////////
    /*
     * 通过实现了MenuListener接口的方式
     * 下边是e.toString()后的结果,说白了就是想实验一下e能不能分辨是哪一个JMenu,结果发现了Text这个属性,那么后面的事就好办了
     * javax.swing.event.MenuEvent[source=javax.swing.JMenu[,0,0,53x23,alignmentX=0.0,
     * alignmentY=0.0,border=javax.swing.plaf.metal.MetalBorders$MenuItemBorder@56a1fd57,
     * flags=384,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,
     * disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom=2,right=2],
     * paintBorder=true,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,
     * rolloverSelectedIcon=,selectedIcon=,text=文件(F)]]
     */
    @Override
    public void menuSelected(MenuEvent e) {
        // TODO Auto-generated method stub
        String eString = e.toString();
        int index = eString.indexOf("text=");//这里是字符串的匹配
        String textStr = eString.substring(index+5, index+7);//只获取Text=后边的两个汉字
        int tap = 0;//标识是哪个JMenu
        if ("编辑".equals(textStr)) {
            tap = 2;
        }else if("查看".equals(textStr)){
            tap = 3;
        }else if("清空".equals(textStr)){
            tap = 4;
        }
        switch (tap) {
        case 2:
            str = str.append("选择了编辑菜单\n");//String转换为StringBuffer
            showTextArea.setText(str.toString());//StringBuffer转换为String
            break;
        case 3:
            str = str.append("选择了查看菜单\n");//String转换为StringBuffer
            showTextArea.setText(str.toString());//StringBuffer转换为String
            break;
        case 4:
            str = new StringBuffer("");//String转换为StringBuffer
            showTextArea.setText(str.toString());//StringBuffer转换为String
            break;


        default:
            str = str.append("程序出问题了!\n");//String转换为StringBuffer
            showTextArea.setText(str.toString());//StringBuffer转换为String
            break;
        }
    }


    //JMenuItem的点击事件
    @Override
    public void menuDeselected(MenuEvent e) {
        // TODO Auto-generated method stub


    }
    @Override
    public void menuCanceled(MenuEvent e) {
        // TODO Auto-generated method stub


    }


    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        String eString = e.toString();
        int index = eString.indexOf("text=");//这里是字符串的匹配
        String textStr = eString.substring(index+5, eString.length());//只获取Text=后边全部,全部
        //因为截取两个不能分辨打开X还是打开Y两个菜单,截取三个复制、停止、刷新又不够三个字符了,所以只能用indexOf()了
        int tap = 0;//标识是哪个JMenu
        if (textStr.indexOf("打开X")!=-1) {
            tap = 2;
        }else if(textStr.indexOf("打开Y")!=-1){
            tap = 3;
        }else if(textStr.indexOf("复制")!=-1){
            tap = 4;
        }else if(textStr.indexOf("停止")!=-1){
            tap = 5;
        }else if(textStr.indexOf("刷新")!=-1){
            tap = 6;
        }else if(textStr.indexOf("保存")!=-1){
        tap = 7;
    }
        switch (tap) {
        case 2:
            str = str.append("选择了打开X菜单\n");//String转换为StringBuffer
            showTextArea.setText(str.toString());//StringBuffer转换为String
            break;
        case 3:
            str = str.append("选择了打开Y菜单\n");//String转换为StringBuffer
            showTextArea.setText(str.toString());//StringBuffer转换为String
            break;
        case 4:
            str = str.append("选择了复制菜单\n");//String转换为StringBuffer
            showTextArea.setText(str.toString());//StringBuffer转换为String
            break;
        case 5:
            str = str.append("选择了停止菜单\n");//String转换为StringBuffer
            showTextArea.setText(str.toString());//StringBuffer转换为String
            break;
        case 6:
            str = str.append("选择了刷新菜单\n");//String转换为StringBuffer
            showTextArea.setText(str.toString());//StringBuffer转换为String
            break;
        case 7:
            str = str.append("选择了保存菜单\n");//String转换为StringBuffer
            showTextArea.setText(str.toString());//StringBuffer转换为String
            break;


        default:
            str = str.append("程序出问题了!\n");//String转换为StringBuffer
            showTextArea.setText(str.toString());//StringBuffer转换为String
            break;
        }
    }
}
原创粉丝点击