`
barrywey
  • 浏览: 4121 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Swing中窗口菜单动态变化的实现

    博客分类:
  • Java
阅读更多

本帖最初发表于我另外一个帐号上,先转贴过来。

 

MDI窗体中一般都会提供“窗口”菜单,其菜单项是 MDI 父窗体中打开的所有子窗体的标题或者其他信息。并且可以在“窗口”菜单中进行相应的选择,使用户选择的窗体能够显示在最前列。这样的功能在 WinForm 中实现太简单了,只需要将“窗口”菜单指定为 MDI 菜单即可,所有相关的操作 ( 比如新建子菜单之后窗口菜单中会多一个菜单项,用户在菜单中选中后将选中的子窗口激活等 ) 全部都可以自动完成 ( 再次膜拜 Microsoft 的强大,虽然有很多人每天都在骂,但 Microsoft 在桌面应用方面的优势至少在这个地球上,还无人能及 ) 。反观我喜爱并忠诚的 Java 中,所有这些操作都要自己去实现了。

 

 

    跟MDI 窗体相关的 JDesktopPane  JInternalFrame 之间的关系,再次就不再重复了,还不太清楚的朋友自行带着小板凳回家面壁思过就好了。重点说说当一个 JInternalFrame 被实例化出来的时候, JDesktopPane 和主面板上的“窗口”菜单如何进行相应就好了。

 

需要完成的事情:

1.当一个JInternalFrame 被实例化出来的时候,窗口菜单中应该多一个选项,并默认被选中

2. 当关闭一个JInternalFrame 的时候,窗口菜单中应该减少对应的一个菜单选项

3. 当用户在窗口菜单中选择时,应该将用户选中的JInternalFrame 显示到最前

4. 当用户选中某个JInternalFrame 时,窗口菜单中对应的菜单选项应该处于选中状态

 

JDesktopPane 中有这样一个方法 setDesktopManager() ,此方法中传入的参数是一个 DesktopManager 接口,并且在 JDK 中已经有一个默认实现类 DefaultDesktopManager 。其实我们需要做的事情,就是实现这个接口,用我们自己的方式 ( 以上要完成的任务为核心 ) 去实现它即可。

 

我们写一个类MyDesktopManager 继承自 DefaultDesktopManager 类,实现其中我们需要关心的方法。为完成以上的任务,我们需要重写 DefaultDesktopManager 中相应的方法。经常需要重写的方法可能包括一下几个:

void activateFrame(JInternalFrame f)  //窗口被激活 ( 获取焦点 ) 时触发

void deactivateFrame(JInternalFrame f)  //窗口失去焦点时触发

void openFrame(JInternalFrame f)   //根据 JDK 文档,这个该死的方法一般 不触发

void closeFrame(JInternalFrame f)  //关闭窗口时出发

 

根据以上的信息,我们完全可以想办法实现“窗口”菜单的动态变化。当新的子窗口被打开的时候,我们可以向菜单中加入一个新的菜单选项。这个实现,可以放置在openFrame() 方法中。但是, 请注意openFrame() 方法一般情况下不会触发 ,因为,在JInternalFrame 被加入到 JDesktopPane 中以后,应该手动调用这个方法,使之触发。实现如下:

public void openFrame(JInternalFrame f) {  
    f.setTitle("untitled document "+frameCount + " ");//文档标题  
    item = new JRadioButtonMenuItem(f.getTitle());//用文档标题做菜单文本  
    item.setSelected(true);//默认选中  
    btnGroup.add(item);//实现互斥效果  
    item.addActionListener(new SelectedAction(f));//事件监听  
    frMain.getWindowMenu().add(item);//加入到主面板的“窗口”菜单中  
    super.openFrame(f);//此方法不可以删除  
}

 以上实现之后,在将JInternalFrame  JDesktopPane 进行组合时,手动调用这个方法,如下:

JInternalFrame internal = new JInternalFrame("爷爷的",true,true,true,true);  
        internal.setSize(new Dimension(480,320));  
        //加入到desktop中  
        frMain.getDesktopPane().add(internal);  
        frMain.getDesktopPane().getDesktopManager().openFrame(internal);//调用  
        internal.setVisible(true);  

 在关闭子窗体时应该将加入的菜单选项从菜单中移除,这样实现:

public void closeFrame(JInternalFrame f) {  
        JMenu menu = frMain.getWindowMenu();//得到“窗口”菜单  
        int count = menu.getItemCount();//得到该菜单中选项的个数,注意分割线也算是菜单选项  
        for (int i = 0; i < count; i++) {  
            JMenuItem it = menu.getItem(i);  
            if(it!=null) {  
                if(it.getText().equals(f.getTitle())) {  
                    menu.remove(i);  
                    break;  
                }  
            }  
        }     
        super.closeFrame(f);  
    }  
 实现窗体激活和失去焦点的相应,实现起来也很简单,因此就不再重复,感兴趣的童鞋可以下载代码研究。

 

 

其实,Swing 是可以很美的。 ( 不记得是那句广告词了,暂时先拿来用。 )

0
0
分享到:
评论

相关推荐

    原创:swing中根据xml实现对菜单的操作

    本项目结合了Swing和XML,实现了动态更新菜单的功能,特别是针对不同用户展示个性化的菜单结构,而且支持无限级子菜单的创建。下面我们将详细探讨这一技术实现的关键知识点。 1. **Swing组件与菜单系统** Swing...

    Java Swing实现一个记事本

    1. **JFrame**: JFrame是Java Swing中的顶级容器,它是窗口的基础。在记事本应用中,JFrame用来承载所有其他的组件,如菜单栏、文本区、状态栏等。 2. **JTextArea**: JTextArea是Swing中用于显示多行文本的组件,...

    Swing框架的学生管理系统实现班级、学生、年级

    3. **JMenuItem和JPopupMenu**: 在Swing中,JMenuItem用于创建菜单项,JPopupMenu则可以创建右键弹出菜单,这些元素可以与事件监听器结合,实现各种操作,如新增、删除、修改等。 4. **ActionListener**: 这是事件...

    swing rich client

    例如,滑动菜单、旋转按钮等都是通过巧妙运用Timer和组件的可见性、位置变化来实现的。同时,Swing的JLayer类允许开发者对组件进行自定义渲染,从而实现更复杂、更个性化的动画效果。 "图形"在Swing中也是不可或缺...

    swing 手册 英文版

    在本手册中,读者将学习到如何使用Swing组件创建复杂的窗口应用,包括窗口的创建(JFrame)、组件的添加和布局管理、事件处理的实现、以及定制组件和外观(LookAndFeel)。同时,手册也会深入讲解高级特性,如拖放...

    Java Swing 学习代码

    1. **计算器**:在Swing中,可以使用JTextField作为输入字段,配合ActionListener监听按键事件,实现计算功能。通过ButtonGroup管理数字、运算符按钮,根据用户输入和操作执行相应的计算逻辑。 2. **文本框...

    Swing文本编辑器

    首先,我们需要创建一个`JFrame`作为应用程序的主窗口,`JFrame`是Swing中顶级容器,用于承载其他组件。接着,我们在`JFrame`内添加`JScrollPane`,并将`JTextArea`设置为`JScrollPane`的查看区(viewport)。这样,...

    swing版按键控制台

    首先,创建Swing应用通常从`javax.swing.JFrame`类开始,这是所有Swing窗口的基础。在控制台应用中,开发者可能需要一个`JTextArea`或`JTextPane`来显示输出,这两个组件可以接受和显示多行文本。`JTextField`或`...

    javaSwing(源码)

    同时,这些代码也可能是解决特定问题或实现特定功能的示例,有助于你在实际项目中应用Swing。 总之,Java Swing 是一个强大且灵活的GUI工具包,提供了丰富的组件和功能,使开发者能够创建出美观且功能丰富的桌面...

    Swing事件源可能触发的事件

    在Java Swing库中,用户界面(UI)组件是事件的源,它们能够触发多种类型的事件,这些事件通常与用户的交互、组件的状态变化或应用程序的内部操作相关。以下是对标题和描述中提到的Swing组件及其可能触发的事件的...

    动画视频_窗口动态视频实例_动画_

    这种实例通常涉及到图形用户界面(GUI)的设计和实现,特别是涉及到窗口状态的变化,如打开、关闭、最小化、最大化等,以及窗口内元素的动态展示,比如动态加载的进度条、滑动菜单等。 动画部分主要涉及到计算机...

    swing仓库管理

    在这个特定的仓库管理系统中,Swing被用来构建用户界面,包括各种窗口、按钮、表格、下拉菜单等元素,以实现库存跟踪、入库、出库、查询等功能。 首先,让我们深入了解一下Swing的主要特点和组件: 1. **轻量级...

    Java中图形界面设计中的几个Swing程序小例子

    在这个名为"Swingdemo"的压缩包中,我们可以期待找到一些使用Swing库创建的示例程序,这些程序对于初学者来说是非常有价值的实践资源。 Swing库提供了许多组件,用于构建桌面应用程序,如按钮(JButton)、文本框...

    一些Swing应用实例Java源码包

    在这个“一些Swing应用实例Java源码包”中,我们可以深入学习和理解Swing的各种组件和用法。下面将详细解释其中涉及的知识点。 1. **选项框(JComboBox)**:JComboBox是一种下拉列表,用户可以从预定义的选项中...

    swing 新应用

    Swing还提供了JDesktopPane和JInternalFrame,实现了MDI(多文档界面)模式,让用户可以在单个应用程序窗口中同时打开多个子窗口。此外,Swing还支持拖放(Drag and Drop)功能,使得数据交换更加直观和便捷。 在源码...

    窗口淡出的实现

    例如,在Java中,我们可以使用`javax.swing.Timer`配合`java.awt.event.ActionListener`来实现定时改变窗口的透明度。每过一定时间,alpha值会减小,直到达到0,窗口便会变得不可见。代码示例如下: ```java import...

    java-SWING2.rar_site:www.pudn.com_swing2

    在Swing中,窗口系统由JFrame、JDialog、JWindow等类来实现。这些窗口类可以包含各种组件,并可以通过设置窗口属性如大小、位置、可见性等来控制其显示效果。同时,Swing还提供了JMenuBar和JMenuItem等类来创建菜单...

    JAVA Swing常用组件

    1. **JFrame**: JFrame是Swing中的顶级容器,用于创建窗口应用程序的基础。你可以在这个框架中添加其他组件,如按钮、文本框等。 2. **JPanel**: JPanel是一个轻量级组件,通常用来组织和管理其他组件。它可以被...

    Java_swing.rar_JavaSwing_swing

    在压缩包中的“案例”文件可能包含了使用Swing构建的各种示例程序,比如一个简单的“Hello, World!”窗口应用、含有菜单栏和工具栏的复杂应用,或者具有多面板和对话框的进阶案例。通过学习这些案例,开发者可以掌握...

    Swing 移动矩形

    在Swing中,我们通常使用`JFrame`作为应用程序的主窗口,并在其上添加`JPanel`或其他自定义组件来进行绘图。`JPanel`类继承自`JComponent`,它提供了一个`paintComponent(Graphics g)`方法,这是我们在Swing中进行...

Global site tag (gtag.js) - Google Analytics