java 关于Frame类

Python014

java 关于Frame类,第1张

当需要扩展Frame的功能或者想在实例化的多做功能的时候,就写上extends frame,

譬如想在实例化Frame的同时设定size

public class MyFrame extends Frame {

public MyFrame(String s, int width, int height) {

super(s)

super.setSize(width, height)

}

}

这样你实例化MyFrame的时候就已经设定好大小了,少写一些代码

public static void main(String args[]){

MyFrame frame = new MyFrame("My Frame", 300, 200)

}

同样功能的不继承,则需要

public static void main(String args[]){

Frame frame = new Frame("My Frame")

frame.setSize(300, 200)

}

clear?

一般而言可以用两种方法实现。

第一种

import javax.swing.*

public class FrameDemo1 {

public static void main(String[] args) {

//创建一个JFrame对象

JFrame jf = new JFrame()

//设置窗口的标题栏

jf.setTitle("窗口一")

//创建一个标签组件

JLabel jl = new JLabel("窗口里的标签组件")

//把标签组件添加到窗口界面

jf.add(jl)

//设置窗口的位置

jf.setLocation(200,120)

//设置窗口的大小

jf.setSize(300, 280)

//设置窗口的可见性

jf.setVisible(true)

}

}

第二种方法

import java.awt.*

import java.awt.event.*

import javax.swing.*

//写一个类去继承JFrame

public class FrameDemo2 extends JFrame{

//定义组件

JLabel jl

JButton jb

public FrameDemo2() {

//初始化组件

jl = new JLabel("窗口里的标签组件")

jb = new JButton("窗口里的按钮")

//给按钮添加事件响应,点击按钮改变标签组件上的文字的颜色

jb.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

jl.setForeground(Color.RED)

}

})

//设置窗口的布局,为边界布局

this.setLayout(new BorderLayout())

//添加组件到指定的位置

this.add(jl,BorderLayout.CENTER)

this.add(jb,BorderLayout.SOUTH)

//窗口的this.setLocation(120,100) 和this.setSize(300,280)的整合写法setBounds(....)

this.setBounds(120, 100, 300, 280)

//设置点击窗口的关闭按钮执行的默认操作,关闭程序

this.setDefaultCloseOperation(EXIT_ON_CLOSE)

//设置窗口的标题栏

this.setTitle("窗口二")

//窗口默认是不可见的,所以需要设置窗口的可见性为true

this.setVisible(true)

}

public static void main(String[] args) {

new FrameDemo2()

}

}

[Panel]

Panel is the simplest container class. A panel provides space in which an ap

plication can attach any other component, including other panels.

<详见java.awt.Panel>

<注意:以下大写指类,小写泛指对象,比如Frame指Frame类,frame泛指Frame对象。>

好象是看出区别了:Frame是Window的子类,一个Frame对象就是一个有标题有边界

的顶层窗口。Panel是最简单的容器类,是Container的子类。一个Panel对象就是要给应

用程序提供空间,用来添加组件,包括其它的Panel对象。

追本溯源,其实Frame和Panel还是有些亲戚关系的:Frame是Window的直接子类,W

indow又是Container的直接子类,而Panel是Container的直接子类,它们都是从Contai

ner里扩展出来的,是叔侄关系。它们的老祖宗是Component(Container是Component的

子类),Component是基类,回溯本源到此为止,已经是根了。

Frame和Panel都是容器类,那么它们在使用上有什么区别呢?

你可以创建一个panel对象,在上面添加组件,比如单独建立一个TestPanel.java

的源文件(TestPanel extends Panel)。但是因为Panel不是顶层容器,所以你不能直

接显示你创建的这个panel对象,必须装在顶层容器里比如嵌入一个frame里,才能显示

。(为什么Frame对象可以直接显示,而Panel对象不能,文章最后有解释。)

Frame是顶层容器,一般不单独使用(注意只是一般,还是可以直接嵌入组件的),而是

习惯在frame里嵌入panel,再在panel上面添加组件。你在用Jbuilder创建一个Applica

tion(比如TestApp和TestAppFrame)的时候,在你的框架文件TestAppFrame里就会自动

生成一个叫contentPane的JPanel对象。

Panel是一般容器,可以自身嵌套(比如在panel1里嵌入panel2);但Frame已经是

顶层容器了,自身不能嵌套。

我们用得最多的JFrame和JPanel,就是Frame和Panel在Swing下的扩展(JFrame是Fr

ame子类和JPanel是Panel的子类)。

我们用Jbuilder创建Application时会自动生成一些代码,其中的frame.pack()一句

是什么意思?<注:frame是一个已生成的框架类对象>

我们在java.awt.Frame的源文件里找不到pack()方法的定义。看了java.awt.Window

才知

道,原来在Window类里定义了pack()和show()两个显示窗口的方法,被Frame继承了过来

。这可能也是panel无法单独使用的一个原因吧,Panel和它的直接超类Container里,都

没有定义类似pack()和show()的显示容器的方法。