swing中的分层
swing中的分层
摘自:https://blog.csdn.net/levelmini/article/details/26692205
今天在练习swing相关的内容。突然想到,html中的CSS可以控制分层,windows中的纸牌也是按层显示的,java也肯定有了。看了半天API没找到控制层的方法,在网上倒是找到不少分层显示的例子,但是按照例子练习的时候结果总是不理想,总有各种小瑕疵,完全不知道是怎么回事。再次百度的时候发现了关于 swing 重叠组件 的层次(废话篇)这个日志,说的就是分层的东西。在这个日志里又找到另外一篇教程,++ Swing窗口与面板的使用 。 大概看了一下,虽然还没做实验,但想来这个结果应该是极好的。于是记下来。因为大部分都是别人的东西,所以虽然是我自己找来的资料,也只能放到“转载”里面了。
下面就是教程的原文。
====================================================================================================================================
4-1-1:JFrame的使用: 类层次结构图: java.lang.Object --java.awt.Component --java.awt.Container --java.awt.Window
--java.awt.Frame --javax.swing.JFrame 结构函数: JFram() JFrame(String title) 例子:JFrame1.java
-
import java.awt.*;
-
import java.awt.event.*;
-
import javax.swing.*;
-
-
public class JFrame1 implements ActionListener{
-
public JFrame1(){
-
JFrame f=new JFrame("JFrameDemo");
-
/*我们要在JFrame中加入其他组件必须取得Content Pane,然后再加入组件到此Content Pane中。
-
*相对于AWT,若要在AWT中的Frmae加入某一个组件只要直接调用add()方法即可,不需要先取得
-
*Content Pane再加入组件。Swing这样的做法似乎多了一道手续,却带来更强大、更有弹性的
-
*功能,原因就在于Swing的JFrame具有层次(Layer)的概念,可以让你在JFrame中放入的组件不
-
*会造成混乱。例如当一个JFrame有按钮(JButton)、菜单(JMenu)、快速菜单(Pop-up menu)、
-
*工具栏(Toolbar)与工具栏符号提示(Tool tip)时,到底哪个组件应该摆在什么组件上面或
-
*下面,JFrame都有办法处理。以后我们再讨论这个问题。
-
*/
-
Container contentPane=f.getContentPane();
-
JButton b=new JButton("Click me to get new Window");
-
b.addActionListener(this);
-
contentPane.add(b);
-
f.pack();
-
f.show();//使JFrame变成可看见的(Visible)
-
f.addWindowListener(
-
new WindowAdapter(){
-
public void windowClosing(WindowEvent e){
-
System.exit(0);
-
}
-
}
-
);
-
}
-
public void actionPerformed(ActionEvent e){
-
JFrame newf=new JFrame();//产生一个没有标题的JFrame
-
newf.setSize(200,200);
-
newf.show();
-
}
-
public static void main(String[] args){
-
new JFrame1();
-
}
-
}
中间的参数越大越浮于上层,第三个参数越小越浮于上层
4-1-2:Swing的容器结构与JLayeredPane的使用:类层次结构图:
java.lang.Object
--java.awt.Compontent
--java.awt.Container
--javax.swing.JComponent
--javax.swing.JLayeredPane
我们可把Swing容器的结构看似如下图所示:
|Grass Pane
|
Root Pane|
| |Content Pane
|Layered Pane|
|Menu Bar
其中,Root Pane可以看成是虚拟的容器,包含着Grass Pane、Layered Pane、Content Pane与Menu Bar。Swing的容器包括JApplet,JFrame,JDialog,JWindow与JInternalFrame都是构造在此结构上,JApplet、JFrame、JDialog、JWindow都是heavyweight容器,只有JInternalFrame是lightweight容器。当我们要加入某个组件到Swing的容器中时,并不是直接加入到Root Pane,而是加入到RootPane下面的某一成员(Layered Pane或Content Pane)。
Content Pane与Menu Bar只是Layered Pane的其中一层,我们称此层为Frame-Content Layer.若你想知道Frame-Content Layer在Layered Pane的层次是什么?你可以由JLayeredPane类中的Frame_Content_layer类常数取得。
由此我们可以知道,Layered Pane基本上可拥有非常多的“层”(Layer),那么如何分辨哪一层是在哪一层的上面或下面呢?
答案是Z_order.Z_order本身具有两个整数值,一个是代表层(Layer)的深度,另一个代表同层的相关位置(Position),当Z_order的Layer数值越小时,表示其位置就在越底层,当Z_order的Layer数值越大时,表示其位置就在越上层。在JLayeredPane类中,共定义了6个Z_order常数供用户参考,如下所示:
DEFAULT_LAYER:Z_order的Layer数值为0,以整数对象Integer(0)来表示,一般我们加入的组件若没有标记是第几层,默认值就把组件放在此Default Layer中。
PALETTE_LAYER:Z_order的Layer数值为100,以整数对象Integer(100)来表示,位于Default Layer之上,一般用于放置可移动的工具栏(Floatable Toolbar).
MODAL_LAYER:Z_order的Layer数值为200,以整数对象Integer(200)来表示,位于PALETTE_LAYER之上,一般用于放置对话框(Dialog Box).
POPUP_LAYER:Z_order的Layer数值为300,以整数对象Integer(300)来表示,位于MODAL_LAYER之上,一般用于快捷菜单(Poup Menu)与工具栏提示(Tool Tips)中.
DRAG_LAYER:Z_order的Layer数值为400,以整数对象Integer(400)来表示,位于POPUP_LAYER之上,一般用于拖曳组件使其在不同区域上.
FRAME_CONTENT_LAYER:Z_order的Layer数值为-30000,以整数对象Integer(-30000)来表示,一般来说,Frame Content Layer最底层的是Layer,用来表示Content Pane与Menu Bar的位置,大部份情况我们不会更改到这个数值。
一般程序会提供良好的Z-order自动管理机制,当然java也不例外,因此大部份情况我们不会使用到Z-order,因为系统会自动帮我们管理得好好的。用户只需将所需的组件直接加入Content Pane即可,不需要知道它们之间的顺序关系。但如果今天您必须处理对象之间的层次关系时,例如Word中你可以把某个绘图对象下推至下一层,你就必须亲自处理Z-order的关系了。 下面我们来看如何利用JLayeredPane来控制对象的层次关系: 这个例子分别用7个JLabel对象层层相叠,每个JLabel对象都有不同的Z-order数值,形成7层相叠的效果!
JLayeredPane1.java:
-
import java.awt.*;
-
import java.awt.event.*;
-
import javax.swing.*;
-
-
public class JLayeredPane1 extends JFrame{
-
public JLayeredPane1(){
-
super("JLayeredPane");
-
/*由小到大定义组件深度数值,也就是Z-order layer的大小。
-
*/
-
Integer[] layerConstants={
-
JLayeredPane.DEFAULT_LAYER,JLayeredPane.PALETTE_LAYER,
-
new Integer(101),JLayeredPane.MODAL_LAYER,new Integer(201),
-
JLayeredPane.POPUP_LAYER,JLayeredPane.DRAG_LAYER
-
};
-
/*定义每个JLabel的颜色
-
*/
-
Color[] colors={
-
Color.red,Color.blue,Color.magenta,Color.cyan,Color.yellow,
-
Color.green,Color.pink
-
};
-
Point position=new Point(10,10);
-
JLabel[] label=new JLabel[7];
-
JLayeredPane layeredPane=getLayeredPane();//取得窗口的Layered Pane
-
-
for(int i=0;i<7;i++){
-
label[i]=createLabel("第"+(i+1)+"层",colors[i],position);
-
position.x=position.x+20;
-
position.y=position.y+20;
-
//将组件(JLabel)放入Layered Pane中并给予深度(Z-order layer)的数值。
-
layeredPane.add(label[i],layerConstants[i]);
-
}
-
setSize(new Dimension(280,280));
-
show();
-
addWindowListener(
-
new WindowAdapter(){
-
public void windowClosing(WindowEvent e){
-
System.exit(0);
-
}
-
}
-
);
-
}
-
public JLabel createLabel(String content,Color color,Point position){
-
JLabel label=new JLabel(content,JLabel.CENTER);
-
label.setVerticalAlignment(JLabel.TOP);
-
label.setBackground(color);
-
label.setForeground(Color.black);
-
label.setOpaque(true);
-
label.setBounds(position.x,position.y,100,100);
-
return label;
-
}
-
public static void main(String[] args){
-
new JLayeredPane1();
-
}
-
}
从上面的例子可以看出,虽然“Button1”的层次比“按钮一”低,但它却显示在“按钮一”之上,原因"按钮一"是加在Content Pane中而不是加在LayeredPane上,因此显示时以Content Pane与加在Content Pane上的组件来做层次的比较。
从面的例子可以看出,Z-order layer数值越小的组件在越底层,也就会被Z-order layer值较大的组件所覆盖。那如果两个组件都在同一层且相互重叠,怎么知道它们之间的层次关系呢?答案是利用Z-order的另外一个整数值:position。position数值的关系跟 Z-order的layer数值恰好相反,在同一层中的对象,若position数值越小者则在越上层,position数值越大者则在越下层。position的数值是从-1~n~1,n是指在同一层中组件的个数,数值-1代表最底层,意思跟n-1一样;数值0代表最上层。你可以使用JLayeredPane类提供的moveToBack()方法将组件推至position为-1(最底端)的位置,或是使用moveToFront()方法将组件推至position为0(最顶端)的位置。我们来看下面的范例:
JLayeredPane3.java
-
import java.awt.*;
-
import java.awt.event.*;
-
import javax.swing.*;
-
-
public class JLayeredPane3 extends JFrame{
-
public JLayeredPane3(){
-
super("JLayeredPane");
-
-
JLabel label1=new JLabel("左Label",JLabel.CENTER);
-
label1.setVerticalAlignment(JLabel.TOP);
-
label1.setBackground(Color.red);
-
label1.setForeground(Color.black);
-
label1.setOpaque(true);
-
label1.setBounds(20,20,150,150);
-
-
JLabel label2=new JLabel("右sLabe2",JLabel.CENTER);
-
label2.setVerticalAlignment(JLabel.TOP);
-
label2.setBackground(Color.red);
-
label2.setForeground(Color.black);
-
label2.setOpaque(true);
-
label2.setBounds(50,50,150,150);
-
-
JLayeredPane layeredPane=getLayeredPane();
-
layeredPane.add(label1,new Integer(10),1);
-
layeredPane.add(label2,new Integer(10),0);
-
-
setSize(new Dimension(280,280));
-
show();
-
addWindowListener(
-
new WindowAdapter(){
-
public void windowClosing(WindowEvent e){
-
System.exit(0);
-
}
-
}
-
);
-
}
-
public static void main(String[] args){
-
new JLayeredPane3();
-
}
-
}
swing中的分层的更多相关文章
- Swing杂记——Swing中引入Android的NinePatch技术,让Swing拥有Android的外观定制能力
[摘要] 本文诣在展示如何在Swing中引入 NinePatch技术(早期有文章里中文译作九格图,暂且这么叫吧^_^,但此术非传统移动手机上的功能布局——九格图哦). [准备篇] Q:何为 NineP ...
- 【Swing】理解Swing中的事件与线程
talk is cheap , show me the code. Swing中的事件 事件驱动 所有的GUI程序都是事件驱动的.Swing当然也是. GUI程序不同于Command Line程序,一 ...
- Java学习笔记——可视化Swing中JTable控件绑定SQL数据源的两种方法
在 MyEclipse 的可视化 Swing 中,有 JTable 控件. JTable 用来显示和编辑常规二维单元表. 那么,如何将 数据库SQL中的数据绑定至JTable中呢? 在这里,提供两种方 ...
- DDD中的分层架构
DDD中的分层架构很好的应用了关注点分离原则Separation of Concerns(SOC),每一层做好自己的事情,减少交叉 表现层 表现层提供用来完成任务的用户界面,如webform wpf ...
- 详解Swing中JTree组件的功能
JTree组件是另外一个复杂组件,它不像 JTable 那样难用,但是也不像 JList 那么容易.使用 JTree 时麻烦的部分是它要求的数据模型. JTree组件的功能来自树的概念,树有分支和叶子 ...
- 转:swing 中paint与paintComponent的区别(jcomponent)
http://blog.csdn.net/q597756870/article/details/17854247 查API文档,查得在类Jcomponent下的paint方法有以下解释: ...
- 【代码总结● Swing中的一些操作与设置】
Swing中设置关闭窗口验证与添加背景图片 package com.swing.test; import java.awt.EventQueue; import java.awt.Image; imp ...
- .NET Core 2.1中的分层编译(预览)
如果您是.NET性能的粉丝,最近有很多好消息,例如.NET Core 2.1中的性能改进和宣布.NET Core 2.1,但我们还有更多的好消息.分层编译是一项重要的新特性功能,我们可以作为预览供任何 ...
- 深入浅出Java多线程(2)-Swing中的EDT(事件分发线程) [转载]
本系列文章导航 深入浅出Java多线程(1)-方法 join 深入浅出Java多线程(2)-Swing中的EDT(事件分发线程) 深入浅出多线程(3)-Future异步模式以及在JDK1.5Concu ...
随机推荐
- Xcode7 修改项目名完全攻略
1.先把整个工程文件夹名改为新的工程名. 2 .将旧项目文件夹和Tests文件名夹修改为新的名称,修改后如下图所示 3.右击 ,选择“show content package”(中文:显示包内容),看 ...
- LG4360 [CEOI2004]锯木厂选址
题意 原题来自:CEOI 2004 从山顶上到山底下沿着一条直线种植了 n 棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能朝山下运.山脚下有一个锯木厂 ...
- 洛谷 P2920 [USACO08NOV]时间管理Time Management
传送门 题目大意: 每个工作有截至时间和耗费时间,n个工作求最小开始时间. 题解: 贪心 从n-1安排,让结束时间尽量的晚. 注意:优先级 cout<<st<0?-1:st; (X ...
- 如何给 FastAdmin 单独设置域名
如何给 FastAdmin 单独设置域名 (声明:不建议给后台固定的域名,主要是安全问题) FastAdmin 是基于 ThinkPHP5 框架编写的,ThinkPHP 5 支持域名路由,可对模块单独 ...
- php 日期时间运算比较
$sql= "select * from t_datestudy where id='4750' and agreemode='2' and school_agree !='1'" ...
- 在TreeView 控件上,如果双击任何一个节点的checkbox 只会收到一次After_Check事件 但是check属性变化两次(从false到true 再从true到false),请问该如何解决,谢谢!
在TreeView 控件上,如果双击任何一个节点的checkbox 只会收到一次After_Check事件 但是check属性变化两次(从false到true 再从true到false),请问该如何解 ...
- Google Cloud VM上在线扩硬盘
Google Cloud VM是可以在线扩展Disk的大小的. 一.创建VM和磁盘 比如我有一台VM,附加了一块Disk,大小是120GB.如下图: 在VM中进行格式化: mkfs.ext4 -F / ...
- debian修改主机名
hostnamectl set-hostname aaa 或者 vim /etc/hostname 记得更新 /etc/hosts
- 接口规范,js处理json,php返回给ajax的数据格式
ajax异步获取php数据. 一般php会在后台处理请求,并返回结果给前端. 必须是echo的方式,不然ajax获取不到. 返回的类型包括,字符串,数字,json. 最常用的就是json. 返回后,前 ...
- 事件调度器及C++中的使用
转自:http://blog.ch-wind.com/ue4-event-dispatcher-and-delegate/ 事件调度器非常的适合在各个蓝图之间实现通信功能. 当前UE4版本4.8.3. ...