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实现窗体拖拽和拉伸

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java IO流读取图片供前台显示代码分享

    最近项目中需要用到IO流来读取图片以提供前台页面展示,由于以前一直是用url路径的方式进行图片展示,一听说要项目要用IO流读取图片感觉好复杂一样,但任务下达下来了,做为程序员只有选择去执行喽,于是找了点资料看了会api, 嘿感觉挺简单的,由于是第一次采用IO流的方式进行读取图片供页面显示,所以把以下代码记录一下 后台代码: /** * IO流读取图片 by:long * @return */ @RequestMapping(value = "/IoReadImage/{imgName}"

  • java图片色阶调整和亮度调整代码示例

    对Java图片处理的内容涉猎不深,言辞简陋望请见谅. java实现色阶调整,即调整图片rgb分量,进而也可以调节图片亮度. 测试代码 public static void main(String[] args) { //文件与BufferedImage间的转换 BufferedImage bi=file2img("test.jpg"); //读取图片 BufferedImage bii=img_color_gradation(bi,100,0,0); img2file(bii,&quo

  • Java Swing 多线程加载图片(保证顺序一致)

    大二的时候做的课程设计,图片管理器,当时遇到图片很多的文件夹,加载顺序非常慢.虽然尝试用多个Thread加载图片,却无法保证图片按顺序加载.直到今天学会了使用Callable接口和Future接口,于是心血来潮实现了这个功能. 废话不多说,看代码. 多线程加载图片(核心): package com.lin.imagemgr; import java.awt.Dimension; import java.awt.image.BufferedImage; import java.io.File; i

  • Java实现的图片高质量缩放类定义与用法示例

    本文实例讲述了Java实现的图片高质量缩放类定义与用法.分享给大家供大家参考,具体如下: 找了很多都不理想,最后找个到老外写的,不得不承认老外写的确实牛B. package com.test; import com.sun.image.codec.jpeg.JPEGImageEncoder; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGEncodeParam; import java

  • Java实现的微信图片处理工具类【裁剪,合并,等比例缩放等】

    本文实例讲述了Java实现的微信图片处理工具类.分享给大家供大家参考,具体如下: 现在 外面核心,图片文章比较少,看了拷贝代码,而用不了,用相应jar包处理,很多等比例缩放,达不到 想要的给予的期望:本工具类,是之前做微信打印机写的 基于java自带的类,基于rgb. package com.zjpz.util; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt

  • Java图片处理之获取gif图一帧图片的两种方法

    前言 本文主要给大家介绍了关于Java获取gif图一帧图片的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 一.Java原生代码实现gif获取一帧图片 先看测试代码: public static void main(String[] args) { /*这儿填写你存放要缩小图片的文件夹全地址*/ String src = "c:/5.gif" ; /*这儿填写你转化后的图片存放的文件夹*/ String tar = "c:/5_frame_2.jp

  • java中ImageReader和BufferedImage获取图片尺寸实例

    ImageReader 对象通常由特定格式的服务提供者接口 (SPI) 类实例化.服务提供者类(例如 ImageReaderSpi 的实例)向 IIORegistry 注册,后者使用前者进行格式识别和表示可用格式 reader 和 writer. BufferedImage子类描述具有可访问图像数据缓冲区的Image.BufferedImage由图像数据的ColorModel和Raster组成.Raster的SampleModel中band的数量和类型必须与ColorModel所要求的数量和类型

  • Java Swing实现窗体添加背景图片的2种方法详解

    本文实例讲述了Java Swing实现窗体添加背景图片的2种方法.分享给大家供大家参考,具体如下: 在美化程序时,常常需要在窗体上添加背景图片.通过搜索和测试,发现了2种有效方式.下面分别介绍. 1. 利用JLabel加载图片 利用JLabel自带的setIcon(Icon icon)加载icon,并设置JLabel对象的位置和大小使其完全覆盖窗体.这是一个很取巧的办法,代码非常简单,如下所示. JLabel lbBg = new JLabel(imageIcon); lbBg.setBound

  • java创建以任意图片为背景的窗口

    swing自带的窗体是不能够满足我们的应用需求的,所以需要制作任意图片和形状的JFrame框体,比如下图: 并且可以设置窗体背景图片的透明度 下面说明如何做到上图的效果: (1)首先你得需要一张好看的图片,比如羊皮纸.但是这个下载的图片是方方正正的矩形,羊皮纸的形状在图片的内部,所以我们用美图秀秀或者PS中的抠图功能将羊皮纸抠出来,如下: (2)将图片保存为透明背景即可. (3)接着写一个myJFrame继承JFrame,代码如下: import com.sun.awt.AWTUtilities

  • Java 创建线程的两个方法详解及实例

    Java 创建线程的两个方法 Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法: ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法. 为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好呢?

  • java 创建线程的方法总结

    java 创建线程 Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法: ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法. 为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好呢? 在Java

  • Java 创建并应用PPT幻灯片母版的方法示例

    前言 在PowerPoint文档中,幻灯片母版可供用户设置幻灯片的样式,比如标题文字.背景.属性等.预先设定好的幻灯片母版可用于所有幻灯片,此外,也可创建多个幻灯片母版分别应用到幻灯片中.本文将介绍如何创建并应用单个或多个幻灯片母版. 环境构建 文中演示代码用到的工具是Free Spire.Presentation for Java,可通过官网下载获取.解压后将位于lib文件夹下的Spire.Presentation.jar导入Java程序.此外,还可通过maven仓库安装导入. Java代码示

  • Java创建与结束线程代码示例

    本文讲述了在Java中如何创建和结束线程的最基本方法,只针对于Java初学者.一些高级知识如线程同步.调度.线程池等内容将会在后续章节中逐步深入. 创建线程 创建普通线程有两种方式,继承Thread类或实现Runnable接口.示例如下. 方法1:继承Thread类 创建方法示例: public class MyThread1 extends Thread { @Override public void run() { //TODO Auto-generated method stub supe

  • Java创建数组的几种方式总结

    1.一维数组的声明方式: type[] arrayName; 或 type arrayName[]; 附:推荐使用第一种格式,因为第一种格式具有更好的可读性,表示type[]是一种引用类型(数组)而不是type类型.建议不要使用第二种方式 下面是典型的声明数组的方式: // 声明整型数组 int[] intArray0 ; int intArray1 []; // 声明浮点型数组 float floatArray0 []; float[] floatArray1 ; // 声明布尔型数组 boo

  • java 创建自定义数组

    1.java创建自定义类数组方法: Student []stu = new Student[3]; for(int i = 0; i < 3; i ++) { stu[i] = new Student(); } 2.否则会提示空指针异常 package project; import java.io.*; import java.util.Scanner; class Student { private int id; private String name; private int score

  • Java 创建动态类和查看方法列表信息的实例

     Java 创建动态类和查看方法列表信息的实例 Sample code : import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.lang.reflect.Type; import java.util.ArrayList; import

  • 如何创建一个JavaScript弹出DIV窗口层的效果

    在本教程中,我将用最通俗的语言和最简洁的代码给大家演示如何创建一个JavaScript弹出DIV窗口层的效果. 创建一个弹出DIV窗口可能是现在网站/网页制作中最常碰到的问题之一.传统的JavaScript弹窗已经不适合目前网站的设计理念了,理由有二:首先,不友好--生硬的弹出对话框且伴随着"哐"的一声对用户体验是个很大的挑战:其次,兼容性不够强--有相当多的浏览器屏蔽了这种JS的Alert()方法.于是,一个良好用户体验的网站需要一种更合理的解决方案--使用很少的HTML代码,很少的

  • Java创建内部类对象实例详解

    Java创建内部类对象实例详解 要想使用new生成一个内部类的实例,需要先指向一个外部类的实例,也就是先生成外部类的实例, 因为内部类可以调用外部类的成员,当没有外部类实例的时候也就没有这些成员的内存空间,内部类在实例化的时候,调用外部类的成员就会出错,所以需要使用外部类的实例 + 点 + new 的方式实例化一个新的内部类 class TestInner{ public static void main(String [] args) { Outer outer = new Outer();

随机推荐