swing中的分层

使用JLayeredPane创建分层面板(Java) 分层面板(JLayeredPane)是Java Swing库中的一个容器组件,它允许在同一位置上放置多个组件,并以不同的层次进行可见性和绘制顺序的控制。在本文中,我们将学习如何使用JLayeredPane创建一个分层面板,并在其中添加和管理组件。分层面板(JLayeredPane)是Java Swing库中的一个容器组件,它允许在同一位置上放置多个组件,并以不同的层次进行可见性和绘制顺序的控制。在本文中,我们将学习如何使用JLayeredPane创建一个分层面板,并在其中添加和管理组件。 阅读详情

今天在练习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();
    }
}
 



JavaSwing_3.5: JLayeredPane(层级面板) JLayeredPane,层级面板。它为容器添加了深度,允许组件在需要时互相重叠。 它将深度范围按层划分,在同一层内又对组件按位置进一步划分,将组件放入容器时需要指定组件所在的层,以及组件在该层内的位置(position/index)。 阅读详情

相关推荐

Java Swing写的图书管理系统毕业设计包:带exe可运行程序、源码和论文文档

一套开箱即用的Java桌面图书管理项目,专为计算机专业毕业生准备。系统用Swing开发,界面完整,功能覆盖图书添加、借阅登记、归还操作、库存查询、读者信息维护等图书馆常见业务。压缩包里有ts.exe——双击就能运行的演示程序,还有全部Java源文件(Form1到Form22、Project3.java等),结构清晰,命名规范,方便理解MVC逻辑和事件驱动流程。配套的《图书馆集成管理系统.doc》是标准格式的毕业论文,包含需求分析、系统设计、数据库说明、核心代码解读和测试截图,可直接参考或修改使用。资源里还包

tgb34567890的博客 227

java分层窗格_Java swing 组件分层介绍:JRootPane,GlassPane,LayeredPane

什么是Swing,什么又是lightweight component---》Swing是JFC中的一部分,现在已被列入JAVA标准类库里面!JFC是Java Foundation Classes的缩写,其功能是提供程序设计者设计图形用户界面用的,JFC主要包括下面的5个部分:1,AWT组件:旧有的窗口组件包2,Swing组件,新的窗口组件包3,Accessibility API:提供一种更先进的沟...

weixin_39562185的博客 672

Java Swing组件分层介绍

分层介绍java Swing组件,详细说明rootPane,LayeredPane,rootPane,contentPane之间的关系

AML LCD debuged

root@k101:/ # cat /sys/class/lcd/debug                                          Usage:     echo basic > debug ; write lcd basic config     echo type > debug ; write lcd type & bits     echo

Sam 的专栏 1476

华为鸿蒙系统也能用!5分钟搞定谷歌三件套安装(附最新APK下载链接)

本文为华为鸿蒙系统用户提供了一份详尽的谷歌三件套(Google Play服务、商店及框架)手动安装指南。文章核心在于无需Root,通过ADB命令获取设备信息,并从可靠来源下载匹配版本的APK,按照正确顺序安装,从而解决海外应用依赖问题,实现5分钟快速部署。

c7d8e9的博客 6461

DeepLearning tutorial(7)深度学习框架Keras的使用-进阶

上一篇文章总结了Keras的基本使用方法,相信用过的同学都会觉得不可思议,太简洁了。十多天前,我在github上发现这个框架的时候,关注Keras的人还比较少,这两天无论是github还是微薄,都看到越来越多的人关注和使用Keras。所以这篇文章就简单地再介绍一下Keras的使用,方便各位入门。主要包括以下三个内容: 训练CNN并保存训练好的模型。 将CNN用于特征提取,用提取出来的特征训练SVM。

wepon的专栏 2万+

java swing 图层_组件分层Java Swing,在悬停时显示的图层

默认情况下,contentPane的布局是BorderLayout。你改变了吗?也许您应该将contentPane设置为JLayeredPane。如果不清楚此建议的任何内容,请发表评论。编辑1:JLayeredPane示例您可以使用我所描述的分层窗格解决此类问题,如下所示,但您必须注意设置大小并使覆盖的JPanel不透明:import java.awt.Dimension;import java....

weixin_28867991的博客 378

OpenMythos深度解析

本文深入解析了kyegomez/OpenMythos项目如何从第一性原理重建Claude Mythos的核心架构。该项目并非直接复制Claude,而是基于公开论文和实验结果推测其可能的设计理念,构建了包含多模态注意力、深度推理引擎、知识检索模块等六大核心组件的模块化架构。重点剖析了分组查询注意力(GQA)的实现细节,展示了KV头扩展等关键技术。该项目已成为大模型开源社区最受关注的研究之一,为理解Claude的架构思想提供了有价值的参考。

Crown_22的博客 518

java jpanel 分层显示_java swing中的JLayeredPane分层面板的问题。。

我在JFrame中就添加一个分层面板,不添加JPanel的时候加到分层面板上的组件可以分层放置并显示出来可是当我再向JFrame里面添加一个JPanel和分层面板的时候,加到分层面板的组件就显示...我在JFrame中 就添加一个分层面板,不添加JPanel的时候 加到分层面板上的组件可以分层放置并显示出来可是当我再向JFrame里面添加一个JPanel 和分层面板的时候 ,加到分层面板的组件就...

weixin_30996983的博客 992

Qt插件之Qt Designer插件实现

相比于通过控件提升来使用自定义控件,在Qt Designer中直接使用自定义控件更加方便和直观。这里就介绍一下如编写和注册Qt Designer插件。Qt Designer插件本质上来说就是一个动态库,和普通的动态库的区别是插件中导出了Qt Designer能识别的接口。...

yang1fei2的博客 3100

10.2 全栈 CRUD 工程结构搭建:Cursor 4 步初始化 + 3 层目录规范

揭示 Cursor 工程初始化中 4 个关键动作如何将 AI 上下文感知能力从 30% 提升至 85%,包括用 pnpm create 显式声明结构契约、通过 monorepo.config.json 设定 workspace 根以支持跨包类型引用、在 shared 包中固化共享类型与协议,以及后续

weixin_42545292的博客 67

java怎么做分层窗口_java swing中的JLayeredPane分层面板的问题。。

我在JFrame中 就添加一个分层面板,不添加JPanel的时候 加到分层面板上的组件可以分层放置并显示出来可是当我再向JFrame里面添加一个JPanel 和分层面板的时候 ,加到分层面板的组件就显示不出来了。。import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.eve...

weixin_39772651的博客 574

C语言试题三之计算并输出 s=1+(1+2^(0.5))+(1+2^(0.5)+3^(0.5))+…+(1+2^(0.5)+3^(0.5)+…+n^(0.5))

1 、题目 计算并输出 s=1+(1+2^(0.5))+(1+2^(0.5)+3^(0.5))+…+(1+2^(0.5)+3^(0.5)+…+n^(0.5)) 2、部分函数说明 C 库函数 double pow(double x, double y) 返回 x 的 y 次幂。 3、源代码实现 #include <stdio.h> #include <...

码莎拉蒂 4609

java swing 项目总结

最近与小团队的一个项目刚刚结束,静下心来写点东西,顺便说说自己在项目中的一些经验体会!

CrazyPig的技术博客 1万+

从零开始跑通3DGS教程:(五)3DGS训练

本文介绍了在Docker环境中训练3DGS(3D Gaussian Splatting)的方法,属于《从零开始跑通3DGS教程》系列文章的第五部分。主要内容包括:Docker环境准备(基于pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime镜像)、容器内conda环境配置(安装必要依赖和3DGS相关组件)、以及训练命令执行步骤。文章提供了详细的命令行操作流程,帮助读者快速搭建3DGS训练环境。适合在Linux系统、Nvidia GPU环境下使用,完整教程可参考系列文章

诺有缸的高飞鸟的博客 1751

7.26华为OD机试真题 新系统 - 炸弹人的雷区数量 (Java/Py/C/C++/Js/Go)

7.26华为OD机试真题 新系统 - 炸弹人的雷区数量 (Java/Py/C/C++/Js/Go)

算法大师! 790

javax.Swing

什么是Swing,什么又是lightweight component         ---》Swing是JFC中的一部分,现在已被列入JAVA标准类库里面!JFC是JavaFoundation Classes的缩写,其功能是提供程序设计者设计图形用户界面用的,JFC主要包括下面的5个部分:            1,AWT组件:旧有的窗口组件包            2,Swing组件,新

JeffGrubby的博客 948

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【Java笔记】Java Swing四大常用容器(JPanel、JScrollPane、JSplitPane、JLayeredPane)简记

1.JPanel面板 2.JScrollPane窗格(滚动窗格) 3.JSplitPane窗格(拆分窗格) 4.JLayeredPane窗格(分层窗格) JComponent是Container的子类,因此,JComponent子类创建的组件也是容器,但很少将JButton,JTextField,JCheckBox等组件当做容器使用。 JComponent专...

我很菜 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

JLayeredPane分层窗格

package app; import java.awt.*; import javax.swing.*; public class JPanel { public static void main(String[] args){ new WindowLayered(); } } class WindowLayered extends JFrame{ WindowLayered(){ //设置窗口位置 setBounds(100,100,30

winds_tide的博客 758

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java Swing中的JTree模型

Java Swing中的JTree模型2009-01-04 10:40本文介绍Java Swing中的JTree模型,介绍如何创建、修改、遍历,设置树。参考Core Java2相关章节及其源代码。Swing树使用人们所熟悉的文件夹和树叶图来显示分层的数据。树由节点组成,节点可以是文件夹,也可以是树叶。文件夹可以有子节点,除根节点之外的所有节点都只有一个父节点。空的文件夹与树

4736

MVC分层结构的优点和缺点

什么是MVC? 话说N多年前,在一个叫SmartTalk的国度出现了一个叫MVC的家伙,后来流窜到了java国,在Java国里呼风唤雨(java的很多有界面的组件,比如swing都是采用MVC模式设计的)。 这个MVC是个什么样的家伙? 首先,此人长了三只手。一只叫Model,它负责业务领域状态的知识,一只叫View,负责业务领域的表示视图,一只叫Controller,负责控制用户输入的流和状态。...

代码学习之路的博客 2220

分层Pane结构与Swing组件高级特性的实现

这个题目起的有点难懂,但也实在想不出更好的题目来。所谓分层Pane结构是指JFrame/JApplet/JDialog等Swing顶层容器的JRootPane/JLayeredPane/GlassPane/ContentPane结构。所谓Swing组件高级特性其实是指某些组件的特殊功能的实现,比如弹出菜单、Tooltip、JComboBox的下拉窗口、Drag and Drop实现、Docking

ycb1689的专栏 883

《Java 2 图形设计卷Ⅱ- SWING》第12章 轻量容器

第12章 轻量容器   本章讨论如下Swing轻量容器:  ·JPanel  ·JRootPane  ·JLayeredPane  ·JTabbedPane  ·JSplitPane  JPanel是AWT的Canvas和Panel类的继承类。文本和图形都可以绘制到JPanel实例中,并且JPanel实例可以用作一个通用容器。  JRootPane是一个包含在窗体、对话框、窗口、内部窗体和Sw...

iteye_14722的博客 184

四大容器java_【Java笔记】Java Swing四大常用容器(JPanel、JScrollPane、JSplitPane、JLayeredPane)简记...

1.JPanel面板2.JScrollPane窗格(滚动窗格)3.JSplitPane窗格(拆分窗格)4.JLayeredPane窗格(分层窗格)JComponent是Container的子类,因此,JComponent子类创建的组件也是容器,但很少将JButton,JTextField,JCheckBox等组件当做容器使用。JComponent专门提供了一些经常用来添加组件的容器:1.JPane...

weixin_39564807的博客 683

JAVA 常用容器

常用容器      JComponent是Container的子类,因此JComponent子类创建的组件也都是容器,但我们很少将JButton、JTextFied. JCheckBox等组件当容器来使用。JComponent专门提供了一些经常用来添加组件的容器。相对于JFrame底层容器,本节提到的容器被习惯地称为中间容器,中间容器必须被添加到底层容器中才能发挥作用。1、JPanel 面板   ...

abc1498880402的博客 1408
上一篇: JAVA获取系统中的变量
下一篇: Hadoop2.2.0单节点安装及测试
levelnini
博客等级 码龄14年 45粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值