譬如想在实例化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()的显示容器的方法。