框架组件及其添加组件

框架组件及其添加组件

一、JFrame结构层次

1、层次结构:

IMG_20181118_165307.png

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();”如图:此时玻璃面板处于不可见状态

结果1.JPG

结果2、若取消注释如图:此时玻璃面板处于不透明状态,可以观察到玻璃面板的背景色及其容纳的标签组件,但内容面板被遮挡。

结果2.JPG

结果3、注释掉testGlassPane()方法中的glassPane.setOpaque(true);,如图:此时玻璃面板设置为可见、透明状态,玻璃面板的背景色不再起作用,所以可以观察到玻璃面板和内容面板上的组件。

结果3.JPG

结论:在玻璃面板和内容面板上分别放置组件,可以达到组件分层效果,但玻璃面板一般用于接受鼠标事件或在其上绘图,组件分层应该通过分层面板实现。

三、分层面板(JLayeredPane类的对象)

1、分层面板中的层次用正数表示:

(1) 用add方法添加组件指定层次数

layeredPane.add(component,new Integer(123));

(2) 用setLayer方法更改组件层次

layeredPane.setLayer(component,layer);


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值