Swing是指被绘制的用户界面类,AWT是指像事件处理这样的窗口工具箱的底层机制。

SWT,JavaFX是可能的代替技术。

创建框架

在Java中,顶层窗口(就是没有包含在其他窗口中的窗口)被称为框架(frame),在AWT库中有一个被称为Frame的类,用于描述顶层窗口。这个类的Swing版本名为JFrame,它拓展于Frame类。JFrame是极少数几个不绘制在画布上的Swing组件之一。因此,它的修饰部件(按钮、标题栏、图标等)由用户的窗口系统绘制,而不是由Swing绘制。

import java.awt.*;//abstract wiindow toolkit
import javax.swing.*;//swing类在java拓展包中 /**
* @version 1.32 2007-06-12
* @author Cay Horstmann
*/
public class SimpleFrameTest
{
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()/*swing组件由事件分派线程进行配置,
线程将鼠标点击和按键控制转移到用户接口组件*/
{
public void run()
{
SimpleFrame frame = new SimpleFrame();
/*
* 定义一个用户关闭框架时的响应动作。
* 在此,让程序简单的退出即可。
*/
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
/*
* 框架起初是不可见的。
*/
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
});
/*
* 主线程终止
*/
}
} class SimpleFrame extends JFrame
{
private static final int DEFAULT_WIDTH = 300;
private static final int DEFAULT_HEIGHT = 200; public SimpleFrame()
{
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
}
}

在每个Swing程序中,有两个技术问题需要强调。

首先,所有的Swing组件必须由事件分派线程(event dispatch thread)进行配置,线程将鼠标点击和按键控制转移到用户接口组件。下面的代码片段是事件分派线程中的执行代码:

  EventQueue.invokeLater(new Runnable()
   {
public void run()
{
//statements
}
});

接下来,定义一个用户关闭这个框架时的响应动作。对于这个程序而言,只是让程序简单退出即可。选择这个响应动作的语句是

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

在包含多个框架的程序中,不能在用户关闭其中的一个框架时就让程序退出。在默认情况下,用户关闭窗口时只是将框架隐藏起来,而程序并没有终止(在最后一个框架不可见之后,程序再终止,这样处理比较合适,而Swing却不是这样工作的)。

After scheduling the initialization statements, the main method exits. Note that exiting main does not terminate the program—just the main thread. The event dispatch thread keeps the program alive until it is terminated, either by closing the frame or by calling the System.exit method.

框架定位

JFrame继承了许多用于处理框架大小和位置的方法。重要的有下面几个:

• The setLocation and setBounds methods for setting the position of the frame

• The setIconImage method, which tells the windowing system which icon to display in the title bar, task switcher window, and so on

• The setTitle method for changing the text in the title bar

• The setResizable method, which takes a boolean to determine if a frame will be resizeable by the user

可以让窗口系统控制窗口的位置,如果在显示之前调用

   frame.setLocationByPlatform(true);

窗口系统会选用窗口的位置。

框架属性

确定合适的框架大小:根据屏幕的分辨率编写代码重置框架的大小。

要得到屏幕大小,调用Toolkit类的静态方法getDefaultToolkit得到一个Toolkit对象。然后调用getScreenSize方法,以Dimension对象的形式返回屏幕的大小。Dimension对象同时用共有实例变量width和height保存着屏幕的宽度和高度。Here is the code:

      Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize();
int screenHeight = screenSize.height;
int screenWidth = screenSize.width;

下面,将框架大小设定为上面取值的50%,再告知窗口系统定位框架:

      setSize(screenWidth / 2, screenHeight / 2);
setLocationByPlatform(true);

另外提供一个图标。由于图像的描述与系统有关,所以需要再次使用系统工具箱加载图像。然后将这个图像设置为框架的图标。

      Image img = new ImageIcon("icon.gif").getImage();
setIconImage(img);

• If your frame contains only standard components such as buttons and text fields, you can simply call the pack method to set the frame size. The frame will be set to the smallest size that contains all components. It is quite common to set the main frame of a program to the maximum size. As of Java SE 1.4, you can simply maximize a frame by calling

frame.setExtendedState(Frame.MAXIMIZED_BOTH);

• It is also a good idea to remember how the user positions and sizes the frame of your application and restore those bounds when you start the application again.

在组件中显示信息

You could draw the message string directly onto a frame, but that is not considered good programming practice. In Java, frames are really designed to be containers for components, such as a menu bar and other user interface elements. You normally draw on another component which you add to the frame.

现在将一个绘制消息的组件添加到框架中去。绘制一个组件,需要定义一个拓展JComponent的类,并覆盖其中的paintComponent方法。

class MyComponent extends JComponent{
public void paintComponent(Graphics g){
code for drawing
}
}

无论何种原因,只要窗口需要重新绘图,事件处理器就会通告组件,从而引发执行所有组件的paintComponent方法。如果需要强制刷新屏幕,就需要调用repaint方法,而不是paintComponent方法。它将引发采用相应配置的Graphics对象调用所有组件的paintComponent方法。

在框架中填入一个或多个组件时,如果你只想使用它们的首选大小,可以调用pack方法而不是setSize方法。

import javax.swing.*;
import java.awt.*;
/**
* @version 1.32 2007-06-12
* @author Cay Horstmann
*/
public class NotHelloWorld
{
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
JFrame frame = new NotHelloWorldFrame();
frame.setTitle("NotHelloWorld");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
/**
* A frame that contains a message panel
*/
class NotHelloWorldFrame extends JFrame
{
public NotHelloWorldFrame()
{
add(new NotHelloWorldComponent());
pack();
}
}
/**
* A component that displays a message.
*/
class NotHelloWorldComponent extends JComponent
{
public static final int MESSAGE_X = 75;
public static final int MESSAGE_Y = 100; private static final int DEFAULT_WIDTH = 300;
private static final int DEFAULT_HEIGHT = 200; public void paintComponent(Graphics g)
{
g.drawString("Not a Hello, World program", MESSAGE_X, MESSAGE_Y);
} public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); }
}

Java核心技术卷1Chapter7笔记 图形程序设计的更多相关文章

  1. 《Java核心技术·卷Ⅰ:基础知识(原版10》学习笔记 第5章 继承

    <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 目录 <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 5.1 类.超类和子类 5.1 ...

  2. 《Java核心技术 卷II 高级特性(原书第9版)》

    <Java核心技术 卷II 高级特性(原书第9版)> 基本信息 原书名:Core Java Volume II—Advanced Features(Ninth Edition) 作者: ( ...

  3. 《Java核心技术卷I》观赏指南

    Tomxin7 如果你有想看书的计划,但是还在纠结哪些书值得看,可以简单看看"观赏指南"系列,本文会简单列出书中内容,给还没有买书的朋友提供一个参考. 前言 秋招过去很久了,虽然在 ...

  4. java的优点和误解 《java核心技术卷i》第一章

    <java核心技术卷i>第一章主要内容包括三点: 1:Java白皮书的关键术语:描述Java的十一个关键字: 2:Java applet 3 :关于Java的常见误解   1:第一章:Ja ...

  5. 《Java核心技术卷1》拾遗

    之前对Java的基础知识有过学习,现在开始学习<Java核心技术卷1>,将一些新学的知识点,做简要记录,以备后续回顾: 1.double (1)所有的“非数值”都认为是不相同的 if(x= ...

  6. java中的数据类型,运算符,字符串,输入输出,控制流,大数值,数组; 《java核心技术卷i》 第三章:java基本程序结构;

    <java核心技术卷i> 第三章:java基本程序结构: 每次看书,去总结的时候,总会发现一些新的东西,这次对于java的数组有了更深的了解: java中的数据类型,运算符,字符串,输入输 ...

  7. Java核心技术·卷 II(原书第10版)分享下载

    Java核心技术·卷 II 内容介绍 Java领域最有影响力和价值的著作之一,由拥有20多年教学与研究经验的资深Java技术专家撰写(获Jolt大奖),与<Java编程思想>齐名,10余年 ...

  8. Java核心技术卷阅读随笔--第3章【Java 的基本程序设计结构】

    Java 的基本程序设计结构 现在, 假定已经成功地安装了 JDK,并且能够运行第 2 章中给出的示例程序.我们从现在开始将介绍 Java 应用程序设计.本章主要介绍程序设计的基本概念(如数据类型.分 ...

  9. Java核心技术卷阅读随笔--第2章【Java 程序设计环境】

    Java 程序设计环境 本章主要介绍如何安装 Java 开发工具包( JDK ) 以及如何编译和运行不同类型的程序: 控制台程序. 图形化应用程序以及 applet.运行 JDK 工具的方法是在终端窗 ...

随机推荐

  1. Android中绘制圆角矩形图片及任意形状图片

    圆角矩形图片在苹果的产品中很流行,相比于普通的矩形,很多人都喜欢圆角矩形的图片,因为它避开了直角的生硬,带来更好的用户体验,下面是几个设计的例子: 下面在Android中实现将普通的矩形图片绘制成圆角 ...

  2. Wheel ProgressBar 实现之三——模拟进度过程

    1. 效果展示: 知道如何画圆弧,如何精确画出进度文本之后,我们将进入 Wheel ProgressBar 实现的最后一个过程:模拟其动态呈现过程.如下图所示,初始时显示进度为 0 (上图),点击进度 ...

  3. NVelocity模板引擎学习笔记

    NVelocity模板引擎学习笔记 学习模板引擎有一段时间现在做一些总结

  4. MYSQL报Fatal error encountered during command execution.错误的解决方法

    {MySql.Data.MySqlClient.MySqlException (0x80004005): Fatal error encountered during command executio ...

  5. Inno setup complier将文件添加注册表

    [Registry] Root: HKCR; Subkey:.; ValueType: string; ValueName: ; ValueData:"264file" Root: ...

  6. asp.net MVC 验证注解

    对于Web系统,对于用户的输入验证是必须的.不仅需要在客户端对用户的输入进行验证,在服务端也需要对用户的执行进行验证. asp.net MVC中对于验证提供了一种注解机制.注解是一种通用机制,可以用来 ...

  7. iOS切换window根控制器 (转)

    转自linfengwenyou 在运行过程中更改根控制器的方法:(假设:A为当前根控制器,B为要设的根控制器) 方法一: 1. appdelegate.m中 self.window = [[UIWin ...

  8. C#.net 摄像头驱动程序,用avicap32.dll

    装了摄像头后一般会有 avicap32.dll文件,没有一样可以用这些代码. 不需要在解决方案里面引用这个.dll文件. 下面有二种写法的例子: 例一: using System;using Syst ...

  9. C++ strcpy实现

    char * strcpy(char * strDest,const char * strSrc) { if ((NULL==strDest) || (NULL==strSrc))  throw &q ...

  10. PHP中的数组方法及访问方法总结

    一.数组操作的基本函数 数组的键名和值 array_values($arr);获得数组的值 array_keys($arr);获得数组的键名 array_flip($arr);数组中的值与键名互换(如 ...