Java Swing 层次面板(JLayeredPanel) Demo

概述:

JLayeredPanel 作为Java层次面板是创建多编辑窗口与实现某些特殊显示层次效果的最好方法

当前已经内置支持JLayeredPanel的组件包括JFrame,JDialog,JDesktopPanel本身就是个

JLayeredPanel对象,JLayeredPanel中可以包含多个JComponent组件对象,并且可以相互切换

到编辑状态。

 

Demo程序:

演示JLayeredPanel如何添加JComponent对象,利用JLayeredPanel的特性实现相框效果,主要思路

如下:

1.       创建一个JLayeredPanel对象实例,声明大小

2.       创建一个背景面板(JComponent)对象,贴上你要显示的图像

3.       创建一个前景面板(JComponent)对象,选择一种相框,我是网上找的素材

4.       对前景相框面板进行透明度设置,设置相框内矩形为透明alpha=0

5.       继承JComponent对象的paintComponent()方法把图像绘制到各自面板上

完成测试UI编码,效果显示如下:


两张源图像分别为:


相框图:


特别提示:由于JLayeredPanel没有layoutManager所以必须完成设置setBounds()函数对每个添加到JLayeredPanel的对象,否则会导致无法显示该组件。

 

程序源代码:

背景面板类- JBackGroundPanel

package com.gloomyfish.layer.demo;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;
import javax.swing.JComponent;

public class JBackGroundPanel extends JComponent {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 4639168655243672491L;
	private Dimension size;
	private int startx;
	private int starty;
	private BufferedImage image;
	public JBackGroundPanel() {
		super();
		setOpaque(false);
		startx = 30;
		starty = 30;
		if(size == null) {
			size = new Dimension(400, 400);
		}
		this.setBounds(startx, starty, size.width / 2, size.height / 2);
	}
	
	public JBackGroundPanel(int xp, int yp, int width, int height) {
		super();
		setOpaque(false);
		startx = xp;
		starty = yp;
		size = new Dimension(width, height);
		this.setBounds(startx, starty, size.width, size.height);
	}
	
	private void loadImage() {
		try {
			InputStream stream = this.getClass().getResourceAsStream("frame.jpg");
			image = tunningAlpha(ImageIO.read(stream));
			
		} catch (IOException e) {
			System.out.println("Could not load the image resource...");
		}
	}

	private BufferedImage tunningAlpha(BufferedImage src) {
		int width = src.getWidth();
        int height = src.getHeight();

        int[] inPixels = new int[width*height];
        int[] outPixels = new int[width*height];
        getRGB(src, 0, 0, width, height, inPixels );
        System.arraycopy(inPixels, 0, outPixels, 0, width*height);
        int index = 0;
        for(int row=90; row<height-90; row++) {
        	int ta = 0, tr = 0, tg = 0, tb = 0;
        	for(int col=90; col<width-90; col++) {
        		index = row * width + col;
        		ta = (inPixels[index] >> 24) & 0xff;
                tr = (inPixels[index] >> 16) & 0xff;
                tg = (inPixels[index] >> 8) & 0xff;
                tb = inPixels[index] & 0xff;
                ta = 0;
                outPixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb;
                
        	}
        }
        BufferedImage dest = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);
        setRGB(dest, 0, 0, width, height, outPixels);
        return dest;
	}

	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D) g;
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		
		// do something here.....
		if(image == null) {
			loadImage();
		}
		g2.drawImage(image, startx, starty, size.width, size.height, null);
	}
	
	@Override
	public Dimension getPreferredSize() {
		return size;
	} 
	
	public Dimension getMinimumSize() {
		return size;
	}
	
	/**
	 * A convenience method for getting ARGB pixels from an image. This tries to avoid the performance
	 * penalty of BufferedImage.getRGB unmanaging the image.
	 */
	public int[] getRGB( BufferedImage image, int x, int y, int width, int height, int[] pixels ) {
		int type = image.getType();
		if ( type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )
			return (int [])image.getRaster().getDataElements( x, y, width, height, pixels );
		return image.getRGB( x, y, width, height, pixels, 0, width );
    }

	/**
	 * A convenience method for setting ARGB pixels in an image. This tries to avoid the performance
	 * penalty of BufferedImage.setRGB unmanaging the image.
	 */
	public void setRGB( BufferedImage image, int x, int y, int width, int height, int[] pixels ) {
		int type = image.getType();
		if ( type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )
			image.getRaster().setDataElements( x, y, width, height, pixels );
		else
			image.setRGB( x, y, width, height, pixels, 0, width );
    }
	
}
JMainPanel 类的源代码:

package com.gloomyfish.layer.demo;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;
import javax.swing.JComponent;

public class JMainPanel extends JComponent {

	/**
	 * 
	 */
	private static final long serialVersionUID = -4973612988991524751L;
	private Dimension size;
	private int startx;
	private int starty;
	private BufferedImage image;
	public JMainPanel() {
		super();
		setOpaque(false);
		startx = 60;
		starty = 60;
		if(size == null) {
			size = new Dimension(400, 400);
		}
		this.setBounds(startx, starty, size.width / 2, size.height / 2);
	}
	
	public JMainPanel(int xp, int yp, int width, int height) {
		super();
		setOpaque(false);
		startx = xp;
		starty = yp;
		size = new Dimension(width, height);
		this.setBounds(startx, starty, size.width, size.height);
	}
	
	/**
	 * 
	 */
	private void loadImage() {
		try {
			InputStream stream = this.getClass().getResourceAsStream("kitty.png");
			image = ImageIO.read(stream);
		} catch (IOException e) {
			System.out.println("Could not load the image resource...");
		}
	}

	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D) g;
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		
		// do something here.....
		if(image == null) {
			loadImage();
		}
		g2.drawImage(image, startx, starty, size.width, size.height, null);
	}
	
	@Override
	public Dimension getPreferredSize() {
		return size;
	} 
	
	public Dimension getMinimumSize() {
		return size;
	}
	
}
测试程序DemoUI类源代码:

package com.gloomyfish.layer.demo;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

public class DemoUI extends JFrame implements ActionListener {
	/**
	 * 
	 */
	private static final long serialVersionUID = -2851755643049352576L;
	private JButton changeButton;
	private JButton exitButton;
	public DemoUI() {
		super("Layer Panel Demo - GloomyFish");
		getContentPane().setLayout(new BorderLayout());
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		initComponent();
	}
	private void initComponent() {
		JPanel btnPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
		changeButton = new JButton("Change");
		exitButton = new JButton("Exit");
		btnPanel.add(changeButton);
		btnPanel.add(exitButton);
		changeButton.addActionListener(this);
		exitButton.addActionListener(this);
		
		// create layer panels
		JLayeredPane layerPanel = new JLayeredPane();
		layerPanel.setPreferredSize(new Dimension(400,400));
		
		// background layer
		JBackGroundPanel bgPanel = new JBackGroundPanel(0,0,400,400);
		layerPanel.add(bgPanel, new Integer(2));
		
		JMainPanel imagePanel = new JMainPanel(0,0,400,400);
		layerPanel.add(imagePanel, new Integer(1));
		
		// add to main UI
		getContentPane().add(btnPanel, BorderLayout.SOUTH);
		getContentPane().add(layerPanel, BorderLayout.CENTER);
		
		this.pack();
		this.setVisible(true);
	}
	
	public static void main(String[] args) {
		new DemoUI();
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getActionCommand().equals("Change")) {
			
		} else if(e.getActionCommand().equals("Exit")) {
			this.setVisible(false);
			this.dispose();
		}
	}

}


  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
分层面板(JLayeredPane)是Java Swing中的一个容器,它允许在同一区域内放置多个组件,并且可以通过设置每个组件的层级来控制它们的显示顺序。下面是一个简单的例子,演示如何使用分层面板: ```java import javax.swing.*; public class LayeredPaneExample { public static void main(String[] args) { // 创建一个 JFrame JFrame frame = new JFrame("LayeredPane Example"); // 创建一个分层面板 JLayeredPane layeredPane = new JLayeredPane(); layeredPane.setBounds(0, 0, 400,400); // 创建三个 JPanel,并设置它们的背景色和大小 JPanel panel1 = new JPanel(); panel1.setBackground(Color.RED); panel1.setBounds(50, 50, 200, 200); JPanel panel2 = new JPanel(); panel2.setBackground(Color.GREEN); panel2.setBounds(100, 100, 200, 200); JPanel panel3 = new JPanel(); panel3.setBackground(Color.BLUE); panel3.setBounds(150, 150, 200, 200); // 将三个 JPanel 添加到分层面板中,并设置它们的层级 layeredPane.add(panel1, JLayeredPane.DEFAULT_LAYER); layeredPane.add(panel2, JLayeredPane.PALETTE_LAYER); layeredPane.add(panel3, JLayeredPane.MODAL_LAYER); // 将分层面板添加到 JFrame 中 frame.add(layeredPane); // 设置 JFrame 的大小和可见性 frame.setSize(400, 400); frame.setVisible(true); } } ``` 在这个例子中,我们创建了一个 JFrame,并在其中添加了一个分层面板。然后,我们创建了三个 JPanel,并将它们添加到分层面板中。我们使用 `setBounds()` 方法设置了每个 JPanel 的位置和大小,并使用 `add()` 方法将它们添加到分层面板中。最后,我们将分层面板添加到 JFrame 中,并设置了 JFrame 的大小和可见性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gloomyfish

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值