java创建以任意图片为背景的窗口
作者:_Thomas 发布时间:2021-11-16 03:08:14
标签:java,图片,背景,窗口
swing自带的窗体是不能够满足我们的应用需求的,所以需要制作任意图片和形状的JFrame框体,比如下图:
并且可以设置窗体背景图片的透明度
下面说明如何做到上图的效果:
(1)首先你得需要一张好看的图片,比如羊皮纸。但是这个下载的图片是方方正正的矩形,羊皮纸的形状在图片的内部,所以我们用美图秀秀或者PS中的抠图功能将羊皮纸抠出来,如下:
(2)将图片保存为透明背景即可。
(3)接着写一个myJFrame继承JFrame,代码如下:
import com.sun.awt.AWTUtilities;
import javax.swing.*;
import java.awt.*;
public class myJFrame extends JFrame{
private float alpha;
public myJFrame(String bgPath,float alpha){
super();
myContentPane rp = new myContentPane(bgPath);
rp.setOpaque(false);//设置内容面板为透明
this.setContentPane(rp);
this.setUndecorated(true);
this.setSize(rp.img.getIconWidth(),rp.img.getIconHeight());
AWTUtilities.setWindowOpaque(this, false);//设置为JFrame为透明
this.alpha = alpha;
}
private class myContentPane extends JPanel{
public ImageIcon img;
public myContentPane(String bgPath) {
super();
img = new ImageIcon(Test.class.getResource(bgPath));
}
@Override
protected void paintComponent(Graphics g) {
AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
Composite old = ((Graphics2D) g).getComposite();
((Graphics2D) g).setComposite(ac);
if(img!=null){
g.drawImage(img.getImage(), 0, 0, getWidth(), getHeight(), this);
}
((Graphics2D) g).setComposite(old);
super.paintComponent(g);
}
}
}
上面的程序主要代码在于:设置JFrame为透明,JFrame去掉边框,设置内容面板为透明,然后将图片画到内容面板上。
(4)写一个测试类Test:
import javax.swing.*;
import java.awt.*;
public class Test {
public static void main(String[] args) {
/**
* 设置背景图和背景图的透明度,0为全透明,1.0f为不透明。
*/
myJFrame f = new myJFrame("ab.png",0.7f);
f.setLayout(null);
Font font = new Font("宋体",Font.PLAIN,30);
JLabel user = new JLabel("用户名");
user.setFont(font);
user.setBounds(100,150,100,30);
JTextField userInput = new JTextField();
userInput.setFont(font);
userInput.setBounds(200,145,250,40);
JLabel ps = new JLabel("密码");
ps.setFont(font);
ps.setBounds(110,200,90,30);
JTextField psInput = new JTextField();
psInput.setFont(font);
psInput.setBounds(200,195,250,40);
f.add(user);
f.add(userInput);
f.add(ps);
f.add(psInput);
f.setLocation(300,100);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
(5)由于去掉了边框,所以窗体不能拖动和拉伸,拖动和拉伸功能的实现见这篇文章swing实现窗体拖拽和拉伸
来源:http://blog.csdn.net/A694543965/article/details/78405773
0
投稿
猜你喜欢
- 嵌入式Servlet容器在Spring Boot中,默认支持的web容器有 Tomcat, Jetty, 和 Undertow1、原理分析那
- 在安卓开发中,会碰到选开始日期和结束日期的问题。特别是在使用Pad时,如果弹出一个Dialog,能够同时选择开始日期和结束日期,那将是极好的
- 前言无论Spring的XML配置或者Java配置,都可以配置自动扫描,也就是在指定包及其子包下的component,都会被自动扫描并被Spr
- 本文实例讲述了Android的三种菜单。分享给大家供大家参考。具体分析如下:Android的菜单分为三种类型:选项菜单(Option Men
- 其实如果我们不进行设置,只是修改了代码,运行程序以后,其出错界面如下图1所示:图1抛出异常如下:************** Excepti
- 本文实例为大家分享了Java多线程实现第三方数据同步的具体代码,供大家参考,具体内容如下一、场景最近的一项开发任务是同步第三方数据,而第三方
- route_generator是什么这是一个简单的 Flutter 路由生成库,只需要少量的代码,然后利用注解配合源代码生成,自动生成路由表
- 一:父级pom.xml文件 resources目录下新建指定文件夹,存放Spring配置文件<profiles> &
- 一、添加依赖<!--SpringBoot使用Swagger2构建API文档的依赖--> <dep
- 日常的开发中经常会需要用到自定义View,这次刚好有个需求,需要用到带有节点的进度条。东西很简单直接继承View就行了。首先定义一些需要的属
- 如下所示:class Program {
- java有四种访问控制修饰符。publicprotectedprivatedefault(默认为空,不加任何修饰)为了用代码对比出其中的区别
- 总之是用jdbc 的游标移动package com.sp.person.sql.util; import java.sql.Connecti
- 介绍上图就是循环依赖的三种情况,虽然方式不同,但是循环依赖的本质是一样的,就A的完整创建要依赖与B,B的完整创建要依赖于A,相互依赖导致没办
- 本文实例讲述了Android开发实现的标准体重计算器功能。分享给大家供大家参考,具体如下:运行结果界面: 界面设计<Rela
- 面向对象编程(Object Oriented Programming)有三大特性:封装、继承、多态。在这里,和大家一起加深对三者的理解。封装
- 简介String是我们最常用的一个类,和普通java类一样其对象会存在java堆中。但是String类有其特殊之处,可以通过new方法生成,
- 一、问题描述有时候,我们会遇到在遍历List集合的过程中删除数据的情况。看着自己写的代码,感觉完全没有问题,但就是达不到预期的效果,这是为什
- 研究背景 我們在搞新的配置中心Nacos的時候,为了获取新的配置中心的配置文件中配置的 dat
- 线程的同步是保证多线程安全访问竞争资源的一种手段。线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源、什么时候需要考虑同