框架组件及其添加组件
一、JFrame结构层次
1、层次结构:
2、当JFrame创建时,4种面板被自动创建并添加到JFrame中,可以使用get方法获取相应的操作,作用如下:
方法 | 作用 |
---|---|
public JRootPane getRootPane() | 获取JFrame的根面板并通过方法返回,它是JRootPane类的对象。 |
public JLayeredPane getLayeredPane() | 获取JFrame的分层面板并通过方法返回,它是JLayeredPane 类的对象 |
public Container getContentPane() | 获取JFrame的内容面板并通过方法返回,虽然返回值为Container ,但它是JPanel类的对象。 |
public Component getGlassPane() | 获取JFrame的玻璃面板并通过方法值返回,虽然返回值为Component ,但它是JPanel类的对象。 |
此外,可以使用add方法将组件添加到JFrame中。
方法 | 作用 |
---|---|
public Component add(Component comp) | 将组件添加到默认位置。 |
public Component add(Component comp,int index) | 将组件添加到容器指定位置 |
例:
import java.awt.BorderLayout; import javax.swing.JButton; import javax.swing.JFrame;
public class MyFrame1 extends JFrame {
private static final long serialVersionUID = 1L;
JButton bt1,bt2,bt3,bt4,bt5;//定义5个按钮
MyFrame1(){
this.setSize(400, 300);//设置框架的宽、高
this.setLocationRelativeTo(null);//设置框架在屏幕居中
//设置关闭框架时默认执行的操作,此操作为退出程序。
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//给5个按钮命名。
bt1 = new JButton("East"); bt2 = new JButton("Wast"); bt3 = new JButton("South");
bt4 = new JButton("North"); bt5 = new JButton("Center");
//J2SE5.0之前,需先获取内容面板getContentPane(),然后才能添加组件。
//BorderLayout:边框布局管理器,内容面板默认的布局管理器。及整个界面分为东、西、南、北,它是BorderLayout类中定义的静态常量。
this.getContentPane().add(bt1, BorderLayout.EAST);
this.getContentPane().add(bt2, BorderLayout.WEST);
//J2SE5.0之后,可以使用this.add的形式添加组件,但依然添加到内容面板上而不是JFrame上。
this.add(bt3, BorderLayout.SOUTH);
this.add(bt4, BorderLayout.NORTH);
//在使用边框布局管理时,不指定组建的添加位置,默认被添加到中央区域。
this.add(bt5);
//设置显示框架。
this.setVisible(true);
}
public static void main(String[] args) {
new MyFrame1();
}}
二、面板介绍
1、玻璃面板
玻璃面板默认是不可见的,可通过“void setVisible(boolean b);”设置组件可见(true)或不可见(false)。若基本组件设置不可见,它不会在容器中显示;若容器组件设为不可见,则容器及其容纳的所有组件均不显示。
还可以通过“void setOpaque(boolean b);”设置组件不透明或透明。setOpaque方法是在JComponent类中定义的,只有通过JComponent或其子类的对象引用才能调用该方法。若组件设置为透明的,它的背景色不起作用,但它容纳的组件正常显示,并保持组件自身的透明性。若玻璃面板设置为可见、不透明,内容面板及其容纳的组件将被遮挡。
例:
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class MyFrame2 extends JFrame {
private static final long serialVersionUID = 1L;
JPanel jc1,glassPane;
MyFrame2(){
this.setSize(400, 300);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jc1 = (JPanel)this.getContentPane();
//设置内容面板的布局管理为空,可以在指定位置放置组件。
jc1.setLayout(null);
JLabel jl1 = createLabel("内容面板上的标签",10,10,Color.yellow);
jc1.add(jl1);
testGlassPane();
this.setVisible(true);
}
private void testGlassPane() {
//getGlassPane的返回类型为Component类的引用,不能通过
//它调用setOpaque方法设置组件透明性,因此将其强制转换为Jpanel。
//通过查看JFrame类的源代码可知,玻璃面板是一个JPanel类的对象。
glassPane = (JPanel)this.getGlassPane();
glassPane.setLayout(null);
glassPane.setBackground(Color.cyan);
glassPane.setOpaque(true);
glassPane.add(createLabel("玻璃面板上的标签",50,80,Color.green));
glassPane.setVisible(true);
}
private JLabel createLabel(String s, int x, int y, Color c) {
JLabel jl = new JLabel(s);
jl.setSize(200,100);
jl.setLocation(x, y);
jl.setBackground(c);
//设置标签文字水平方向左对齐
jl.setHorizontalAlignment(JLabel.LEFT);
//设置标签文字竖直方向居中
jl.setVerticalAlignment(JLabel.CENTER);
jl.setOpaque(true);
return jl;
}
public static void main(String[] args) {
new MyFrame2();
}}
结果1、若注释掉构造方法中的语句“testGlassPane();”如图:此时玻璃面板处于不可见状态
结果2、若取消注释如图:此时玻璃面板处于不透明状态,可以观察到玻璃面板的背景色及其容纳的标签组件,但内容面板被遮挡。
结果3、注释掉testGlassPane()方法中的glassPane.setOpaque(true);,如图:此时玻璃面板设置为可见、透明状态,玻璃面板的背景色不再起作用,所以可以观察到玻璃面板和内容面板上的组件。
结论:在玻璃面板和内容面板上分别放置组件,可以达到组件分层效果,但玻璃面板一般用于接受鼠标事件或在其上绘图,组件分层应该通过分层面板实现。
三、分层面板(JLayeredPane类的对象)
1、分层面板中的层次用正数表示:
(1) 用add方法添加组件指定层次数
layeredPane.add(component,new Integer(123));
(2) 用setLayer方法更改组件层次
layeredPane.setLayer(component,layer);