最大化 AWT Frame 并取消它的修饰

转载 2004年07月10日 17:30:00

发信人: ttlink (SkyWalker), 信区: Java
标  题: 最大化 AWT Frame 并取消它的修饰
发信站: 日月光华 (2002年12月19日10:49:26 星期四), 站内信件

http://www.cn-java.com/target/news.php?news_id=237


Java 1.4 现在允许除去 Frame 的 Title bar 并允许通过编程控制将 Frame 最大化。
通过这个快速入门,John Zukowski 详细描述并演示了这些变化,同时还说明了如何支
持在没有拖曳区域的情况下移动 Frame。请在讨论论坛与本文作者和其他读者交流关于
本文的心得。

 

在阅读 J2SE 平台最新发行版的增强功能时,您会立即注意到 Sun 最终还是听取了我们
的建议。我并不是要暗示以前他们根本不听我们的建议,但他们好象把注意力更多地放
在添加大规模的 API 上,而不是修补那些已经投入使用几年的 API 上。例如 AWT
Frame 类。虽然 Sun 在版本 1.2 中添加了通过编程将 Frame 图标化的功能,您仍然无
法隐藏 Title bar 或将 Frame 最大化。虽然您可以使用 Window 来避开 Title bar,
但一些任务要求的是一个顶级的 Frame 而不是窗口。基本上不会出现侥幸的情况。

 


现在,使用 1.4 发行版,您可以通过编程隐藏特定于平台的窗口修饰,如 Title bar,
并将 Frame 最大化。这两种功能都是早在 1997 年就被首次提出的。无修饰 Frame 支
持的产生是由于在 1997 年春季,Sun 的错误数据库记录了相关错误,错误标识号为
4038769,Frame 缩放支持在 1997 年 8 月被提出,错误标识号为 4071554。我将在本
文中说明如何使用这两种功能。

 


无修饰的 Frame

使用这两种功能的最简单之处是支持无修饰 Frame。要隐藏 Frame 上的 Title bar,需
要将指定 Frame 的 undecorated 属性设为 true。缺省情况下,该值为 false,当
Frame 显示出来后,您就无法更改此设置(如果您尝试更改的话,系统会抛出一个
IllegalComponentStateException 异常)。

 


清单 1. 创建一个无修饰的 Frame

  Frame frame = new Frame();
  frame.setUndecorated(true);

 

 

 

由于 Title bar 和其它的窗口修饰现在都已被隐藏,您无法依靠底层窗口管理系统提供
对拖曳 Frame 的支持。您必须自己用一对鼠标侦听器来添加该支持。

 


清单 2. 添加拖曳支持

  // Avoid creating a point with each mousePressed() call
  Point origin = new Point();
  frame.addMouseListener(new MouseAdapter() {
    public void mousePressed(MouseEvent e) {
      origin.x = e.getX();
      origin.y = e.getY();
    }
  });
  frame.addMouseMotionListener(new MouseMotionAdapter() {
    public void mouseDragged(MouseEvent e) {
      Point p = frame.getLocation();
      frame.setLocation(
        p.x + e.getX() - origin.x,
        p.y + e.getY() - origin.y);
    }
  });

 

 

 

最大化 Frame

版本 1.2 中添加了 setState() 方法可实现编程控制图标化。现在,在版本 1.4 中用
的是 setExtendedState() 方法。这种方法使用可接受状态(共 4 种)的位掩码标志。
第 5 个标志 MAXIMIZED_BOTH,是其它两者的组合。可接受状态有:

 

 

 

 

NORMAL — Frame 正常大小状态

ICONIFIED — 图标化状态

MAXIMIZED_BOTH — Frame 最大化状态(水平最大化和垂直最大化)

MAXIMIZED_HORIZ — 水平最大化状态(窗口环境可能不支持)

MAXIMIZED_VERT — 垂直最大化状态(窗口环境可能不支持)

 

 

 

通常情况下,您可能只用前 3 种状态。如果您发现需要组合状态,比如您希望将
Frame 图标化,但又要保留其当前最大化状态,您就要使用竖线(|)组合多种状态。然
后,一旦您已经确定了正确的状态,就要使用新的 setExtendedState() 方法来更改
Frame 状态。


清单 3. 保留最大化状态

  // Preserve maximized
  frame.setExtendedState(Frame.ICONIFIED
    | frame.getExtendedState());

 

 

 

一个完整的示例

下面是一个完整的示例,它隐藏 Frame 修饰,然后添加用于最大化、正常化、图标化(
最小化)窗口的窗口按钮,并通过简单的 AWT 按钮组件关闭这个 Frame。除了按钮之外
,还有一个区域可供拖曳 Frame。

 


清单 4. Frame 修饰的完整示例

import java.awt.*;
import java.awt.event.*;

public class FrameTest {
  static Point origin = new Point();
  public static void main (String args[]) {
    final Frame frame = new Frame();
    frame.setUndecorated(true);
    frame.addMouseListener(new MouseAdapter() {
      public void mousePressed(MouseEvent e) {
        origin.x = e.getX();
        origin.y = e.getY();
      }
    });
    frame.addMouseMotionListener(new MouseMotionAdapter() {
      public void mouseDragged(MouseEvent e) {
        Point p = frame.getLocation();
        frame.setLocation(
          p.x + e.getX() - origin.x,
          p.y + e.getY() - origin.y);
      }
    });
    frame.setSize(300, 300);
    Button b1 = new Button("Maximize");
    b1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        frame.setExtendedState(Frame.MAXIMIZED_BOTH);
      }
    });
    Button b2 = new Button("Iconify");
    b2.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        // Preserve maximizing
        frame.setExtendedState(Frame.ICONIFIED
           | frame.getExtendedState());
      }
    });
    Button b3 = new Button("Normal");
    b3.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        frame.setExtendedState(Frame.NORMAL);
      }
    });
    Button b4 = new Button("Close");
    b4.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        System.exit(0);
      }
    });
    frame.setLayout(new GridLayout(5,1));
    frame.add(b1);
    frame.add(b2);
    frame.add(b3);
    frame.add(b4);
    frame.show();
}

 


--
---
   Everyday is a winding road
---
ftp://10.11.202.202
※ 来源:·日月光华 bbs.fudan.edu.cn·[FROM:the city of Vampire]                                                        

最大化、最小化和关闭按钮

概述 最大化、最小化和关闭按钮是窗口中最主要的元素。首先要说明,说他们是按钮其实是不准确的,按钮是一种窗口,而这三个组件根本就不是窗口,而是一个窗口常见的组成部分。出于习惯的原因,这里还是称呼他们为按...
  • Augusdi
  • Augusdi
  • 2014年08月03日 12:53
  • 2904

java中Frame框架关闭按钮和框架居中的设置方法

import java.awt.Button; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Frame...
  • u011015550
  • u011015550
  • 2015年01月20日 17:19
  • 1676

java学习之图形用户接口AWT组件部分

记录学习Java私塾Java视频培训教程中级-9 图形用户接口AWT组件部分 什么是GUI GUI:Graphical User Interface ,图形用户接口,即人机交互图形化用户界面,就是屏幕...
  • tomorrowtodie
  • tomorrowtodie
  • 2016年10月10日 23:29
  • 468

java中关闭Frame窗体的方法

分三种情况来说明:    1. 用户类继承自Frame;    2. Frame对象作为用户类的数据成员;    3. 用户类继承自WindowAdapter. 1. 用户类继承自...
  • u011523796
  • u011523796
  • 2013年12月03日 23:11
  • 3185

Java学习笔记(AWT组件 之 按钮)

没什么说的,就是当按钮被按下后,会产生ActionEvent 事件,需要用 ActionListener 接口进行监听和处理事件。 下面是一个菜数字大小的游戏 package frame; imp...
  • ygqwan
  • ygqwan
  • 2013年05月16日 23:36
  • 2620

AWT学习笔记一Frame和Panel

JavaGUI图形界面
  • linjinhuo
  • linjinhuo
  • 2017年08月05日 21:51
  • 103

c#设置不显示右上角的最小化最大化关闭按钮

在C#窗体编程时,如何设置不显示右上角的最小化最大化关闭按钮。可以通过this.ControlBox这个属性的值来控制。 在Windows的窗体编程中,基本上每一个窗体都是一个最小化、最大化和关闭按...
  • basycia
  • basycia
  • 2016年01月02日 11:13
  • 3283

Java--AWT事件处理机制

本文部分内容参考:http://bdxnote.blog.163.com/blog/static/844423520134154319780/; 1.事件处理机制:GUI程序和用户操作的交互功能; ...
  • nuisthou
  • nuisthou
  • 2016年05月27日 20:50
  • 1375

MATLAB GUI 窗口初始最大化

% --- Outputs from this function are returned to the command line. function varargout = GUI_MAIN_Out...
  • miao0967020148
  • miao0967020148
  • 2016年09月06日 15:47
  • 2291

C#窗体皮肤制作(二):创建窗体库项目以及最小化、最大化、关闭按钮的实现

很高兴有朋友关注这篇博客,同时也十分抱歉让关注的朋友久等了,隔上一篇博客也有3个月没有更新,主要是由于3月份辞职,4月份初离职到期离开了北京高德,来到了上海张江。目前新工作也是熟悉当中,希望大家能体谅...
  • bbirdsky
  • bbirdsky
  • 2014年05月18日 20:13
  • 6749
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最大化 AWT Frame 并取消它的修饰
举报原因:
原因补充:

(最多只允许输入30个字)