1.创建框架

AWT中Frame类用来描述顶层窗口,在Swing中,这个类的名为JFrame,它从Frame类扩展。

JFrame是少数几个在Swing不用绘制在画布上的组件之一,因此,它的修饰部件(按钮、标题栏、图标等)由用户的窗口系统绘制。

import java.awt.EventQueue;
import javax.swing.JFrame; public class SimpleFrameTest {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable(){
public void run (){
SimpleFrame frame = new SimpleFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
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组件必须由事件分派线程进行配置,线程将鼠标点击和按键控制转移到用户接口组件。

  下面的代码片段是事件分派线程中的执行代码:

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

  

  许多Swing程序没有在事件分派线程中初始化用户界面。在主线程中完成初始化是通常采用的方式。
所以写成这种方式也行

public static void main(String[] args) {
SimpleFrame frame = new SimpleFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}

但由于Swing组件十分复杂,无法保证这种方式的安全。所以不用。

2.框架定位

JFrame类本身只包含若干个改变框架外观的方法。当然,通过继承,从JFrame的各个超类中继承了许多用于处理框架大小和位置的方法。其中最重要的有下面几个:

setLocation 和 setBounds 方法用于设置框架的位置。(对于框架来说是相对于整个屏幕的位置)

setIconImage 用于告诉窗口系统在标题栏、任务切换窗口等位置显示哪个图标。

setTitle 用于改变标题栏的文字。

setLocationByPlatform 设置窗口下次可见时应该出现的位置:本机窗口系统的默认位置,还是当前位置

setResizable 利用一个boolean值确定框架的大小是否允许用户改变。

JFrame类的继承层次

                 ┌--JComponent---JPanel

Object--Component--Container--┤

                   └--Window---Frame---JFrame

对于专业的应用程序来说,应该检查屏幕的分辨率,并根据分辨率编写代码重置框架的大小。
得到屏幕大小的步骤:
1、调用Toolkit类的静态方法getDefaultToolkit得到一个Toolkit对象(Toolkit类包含很多与本地窗口系统打交道的方法)
2、调用getScreenSize方法,这个方法以Dimension对象的形式返回屏幕的大小。Dimension对象同事用公有实例变量width和height保存着屏幕的宽度和高度。

代码如下:

public class FrameAutoChange {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable(){
public void run (){
JFrame frame = new JFrame();
frame.setTitle("这是一个例子"); Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize();
int screenWidth = screenSize.width;
int screenHeight = screenSize.height;
//将框架大小调整为屏幕长宽的一半
frame.setSize(screenWidth/2, screenHeight/2);
frame.setLocationByPlatform(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}

本例生成一个长宽均为屏幕一半的窗口。

如果框架中只包含标准的组件,如按钮和文本框,那么可以通过调用pack方法设置框架大小。框架将被设置为刚好能够放置所有组件的大小。在通常情况下,将程序的主框架设置为最大:frame.setExtendedState(Frame.MAXIMIZED_BOTH); //全屏

如果编写一个使用多个显示屏幕的应用程序,应该利用GraphicsEnvironment和Graphics Device类获得显示屏幕的大小

常用方法:

java.awt.Component
boolean isVisible()
void setVisible(boolean b)   //设置visible属性
void setSize(int wideh , int height) //使用给定的宽度和高度,重新设置组件的大小
void setLocation(int x, int y ) //将组件移到一个新的位置上,如果这个组件不是顶层组件,x和y坐标是容器坐标,否则是屏幕坐标
voidee setBounds(int x , int y,int width , int height) //移动并重新设置组件大小
Dimension getSize()
void setSize(Dimension d)

java.awt.Window
void toFront() //将这个窗口显示在其他窗口前面
void toBack() //将这个窗口移到桌面窗口栈的后面,并重新排列所有的可见窗口
boolean isLocaionByPlatform()
void setLocationByPlatform(boolean b) //设置locationByPlatform属性。这个属性在窗口显示之前被设置,由平台选择一个合适的位置

java.awt.Frame
boolean isResizale()
void setResizable(boolean b) //获取或设置resizable属性。这个属性设置后,用户可以重新设置框架的大小。
String getTitle()
void setTitle(String s) //获取或设置title属性,这个属性确定框架标题栏中的文字void getIconImage()
void setIconImage(Image image)//获取或设置iconImage属性,这个属性确定框架的图标,窗口系统可能会将图标作为框架装饰或其他部位的一部分显示。
boolean isUndecorated()
void setUndecorated(boolean b) //获取或设置undecorated属性。这个属性设置后,框架显示中没有标题栏或关闭按钮这样的装饰.
int getExtendedState()
void setExtendedState(int state)
获取或设置窗口状态。状态为下列值之一:
Frame.NORMAL
Frame.ICONIFIED
Frame.MAXIMIZED_HORIZ
Frame.MAXIMIZED_VERT
Frame.MAXIMIZED_BOTH

java.swt.Toolkit
static Toolkit getDefaultToolkit() 返回默认的工具箱
Dimension getScreenSize() //返回用户屏幕尺寸

javax.swing.ImageIcon
ImageIcon(String filename) 构造一个图标,其图像存储在一个文件中
Image getImage() 获得该图标的图像

3.在组件中显示信息

可以将字符直接绘制到框架中,这不是一种好习惯。框架是用来放组件的容器,可以将菜单栏和其他用户界面元素放置在其中。在通常情况下,应该在另一组件中绘制信息,并将组件添加到框架中。

JFrame中有四层面板,其中的根面板、层级面板、玻璃面板人们不太关心,他们是用来组织菜单栏和内容窗格以及实现观感的。Swing程序员最关心的是内容窗格。在设计框架的时候,要使用下列代码将所有的组件添加到内容窗格中:

Container contentPane = frame.getContentPane();
Component c = ...;
contentPane.add(c);

在之前版本中JFrame类中的add方法抛出一个异常:"Do not use JFrame.adde() .Use JFrame.getContentPane().add instead",Java SE5.0不再提示,只是调用内容窗格的add.

绘制一个组件,需要定义一个扩展JComponent的类,并覆盖其中的paintComponent方法 。
paintComponent方法有一个Graphics类型的参数,这个参数保存着用于绘制图像和文本的设置,如字体、当前颜色。在Java中,所有的绘制必须使用Graphics对象,其中包含了绘制图案、图像、文本的方法。

下列代码给出了如何创建一个能够进行绘制的组件:

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

只要窗口需要重新绘图,事件处理器会通告组件,从而引发执行所有组件的paintComponent方法。
一定不要自己调用paintComponent方法。(如果需要强制刷新平幕,需要调用repaint方法,而不是paintComponent方法)
触发这个自动响应的过程:如用户扩大窗口、极小化窗口,后恢复窗口的大小时会引发重新绘图。用户弹出另一个窗口,此窗口覆盖了已经存在的窗口,被覆盖的窗口不可见,则需重新绘制。

public class MyPane {
public static final int DEFAULT_WIDTH= 300;
public static final int DEFAULT_HEIGHT =200;
public static void main(String[] args) {
JFrame frame = new JFrame();
MyComponent mcomp = new MyComponent();
frame.add(mcomp);
frame.setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
} class MyComponent extends JComponent{
public static final int MESSAGE_X=75;
public static final int MESSAGE_Y =100; public void paintComponent(Graphics g){
//code for drawing
g.drawString("Test program!!!!!!", MESSAGE_X,MESSAGE_Y);
}
}

  也可扩展JPanel。JPanel是一个可以包含其他组件的容器,同样可以再其上进行绘制。有一点不同之处是,面板不透明,这意味着要在面板的边界内绘制所有的像素。最容易的实现方法是,在每个面板子类的paintComponent方法中调用super.paintComponent来用背景色绘制面板

class MyPanel extends JPanel{
public static final int MESSAGE_X=75;
public static final int MESSAGE_Y =100; public void paintComponent(Graphics g){
//code for drawing
super.paintComponent(g);
g.drawString("Test panel program!!!!!!", MESSAGE_X,MESSAGE_Y);
}
}

  效果:框架上的面板显示字符串:Test panel program!!!!!!

  

Java学习笔记--Swing的更多相关文章

  1. Java学习笔记--Swing用户界面组件

    很多与AWT类似. 事件处理参考:Java学习笔记--AWT事件处理 1.设计模式: 模型:存储内容视图:显示内容控制器:处理用户输入· 2. 文本输入常用组件 2.1 文本域: JLabel lab ...

  2. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  3. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  4. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  5. 0035 Java学习笔记-注解

    什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...

  6. Java学习笔记(04)

    Java学习笔记(04) 如有不对或不足的地方,请给出建议,谢谢! 一.对象 面向对象的核心:找合适的对象做合适的事情 面向对象的编程思想:尽可能的用计算机语言来描述现实生活中的事物 面向对象:侧重于 ...

  7. 0032 Java学习笔记-类加载机制-初步

    JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...

  8. 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用

    垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...

  9. 0025 Java学习笔记-面向对象-final修饰符、不可变类

    final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...

随机推荐

  1. Nunit工具做C#的单元测试

      Nunit工具做C#的单元测试 学习心得 编写人:罗旭成 时间:2013年9月2日星期一 1.开发人员如何做单元测试 单元测试是针对最小的可测试软件元素(单元)的,它所测试的内容包括单元的内部结构 ...

  2. Spring+C3P0数据库连接池配置

    一.xml文件读取.properties文件连接数据库 1.xml文件中的配置 <bean id="dataSourceLocal" name="dataSourc ...

  3. C#事件与委托的区别

    C#事件与委托的区别 1. 委托 事件是利用委托来定义的,因此先解释委托.委托是一个类,它与其他类如int,string等没有本质区别,int代表的是所有的整形,而string代表的是字符串,委托则代 ...

  4. putty 使用 注意事项

    putty命令行模式,修改文本 小心数字小键盘 变命令!! 务必在putty--选项 Terminal->Features 里,找到 Disable application keypad mod ...

  5. AngularJS1.X学习笔记4-内置事件指令及其他

    AngularJS为我们定义了一系列事件指令,方便我们对用户的操作作出响应.甚至他还有一个可选模块提供了触摸事件和手势事件的支持,为移动端开发提供了可能.现在开始学习一下AngularJS的事件指令. ...

  6. 【ASP.NET MVC】MVC概述

    描述 本篇文章主要概述ASP.NET MVC,具体包括如下内容: 1.MVC模式概述 2.WebForm概述 3.WebForm与MVC区别 4.ASP.NET MVC发展历程 5.运用程序结构 6. ...

  7. Java第三次实验敏捷开发与XP实验

    实验三-1 1.实验要求: 实验三 敏捷开发与XP实践 http://www.cnblogs.com/rocedu/p/4795776.html, Eclipse的内容替换成IDEA 参考 http: ...

  8. Linux命令速记

    apropos 通过命令描述,找到匹配的所有命令 ZSH 包含了自动纠错机制,可以用来来替代 Bash 作为你的命令行 shell. 速记表 https://www.maketecheasier.co ...

  9. tomcat支持https的历程

    tomcat真是业界良心啊,文档写的详细无比. 一.https是什么? 简单的说,就是http+SSL/TLS 协议还是http,但是在传输层过程中使用了加密(涉及握手.秘钥分发.加密.解密等过程). ...

  10. Gauva的安装——入门篇

    Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] .缓存 [caching] .原生类型支持 [primitives support] ...