• Swing透明和变换


    以前或许大家对一个UI组件是否透明没有那么关心,但是自从Vista的毛玻璃出现后,UI透明就成了大家非常关注的一个话题,于是Java阵营开始了铺天盖地的讨论如何实现透明的效果,但是很不幸的是无论组件如何透明和变换,但是能够放置于屏幕任何位置的Window一族就是没法透明和变形,原生代码的问题还是交给原生代码来解决吧。
    自己写原生代码是可怕的,特别是对我这种只知道Java的平凡程序员,所以我们得借助一个非常方便的跨平台的调用OS function方便的Lib,JNA便是最佳选择(那个谁,这里不是讨论JRuby&JPython的)。
    so, all robots, transform!
    下面我们要做一个界面是圆角四边形的,中间有一个滑动条来滑动调节透明度。先看看做好的截图。

    注意图中的JFrame边角已经变成了圆弧,滑动滑块,JFrame开始透明,桌面的图标显现出来,下面是代码。

    <!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->/**
    *@(#)TransparentFrame.javav0.1.02007-10-21
    */
    packageruislan.rswing.test;

    importjava.awt.BorderLayout;
    importjava.awt.Color;
    importjava.awt.Container;
    importjava.awt.Dimension;
    importjava.awt.Toolkit;
    importjava.awt.event.ActionEvent;
    importjava.awt.event.ActionListener;
    importjava.awt.geom.RoundRectangle2D;

    importjavax.swing.JButton;
    importjavax.swing.JFrame;
    importjavax.swing.JLabel;
    importjavax.swing.JPanel;
    importjavax.swing.JSlider;
    importjavax.swing.border.LineBorder;
    importjavax.swing.event.ChangeEvent;
    importjavax.swing.event.ChangeListener;

    importcom.sun.jna.examples.WindowUtils;

    /**
    *TransparentJFrameuseJNA
    *
    *
    @authorruislan<ahref="mailto:z17520@126.com"/>
    *
    @version0.1.0
    */
    publicclassTransparentFrame{
    privateJFrameframe;
    privateJPanelcontainer;
    privateJSliderslider;
    privateJPaneltitleBar;
    privateJLabeltitleLabel;
    privateJButtoncloseButton;

    publicstaticvoidmain(String[]args){
    newTransparentFrame().launch();
    }

    privatevoidlaunch(){
    createUI();
    launchUI();
    }

    protectedvoidlaunchUI(){
    frame.setVisible(
    true);
    }

    protectedvoidcreateUI(){
    System.setProperty(
    "sun.java2d.noddraw","true");
    frame
    =newJFrame();
    frame.setSize(
    200,150);
    frame.setAlwaysOnTop(
    true);
    frame.setUndecorated(
    true);

    container
    =newJPanel();
    frame.setContentPane(container);
    container.setLayout(
    newBorderLayout());
    container.add(
    newJLabel("UbuntovsVista,Ilikeboth."),
    BorderLayout.CENTER);
    container.setBorder(
    newLineBorder(Color.BLACK));

    titleBar
    =newJPanel();
    titleBar.setLayout(
    newBorderLayout());
    titleLabel
    =newJLabel("JNAisgreat!");
    titleBar.add(titleLabel,BorderLayout.CENTER);
    titleBar.setBorder(
    newLineBorder(Color.GRAY));
    closeButton
    =newJButton("X");
    closeButton.setFocusPainted(
    false);
    closeButton.addActionListener(
    newActionListener(){
    @Override
    publicvoidactionPerformed(ActionEvente){
    System.exit(
    0);
    }
    });
    titleBar.add(closeButton,BorderLayout.EAST);
    container.add(titleBar,BorderLayout.NORTH);

    slider
    =newJSlider(0,100);
    slider.setValue(
    100);
    slider.addChangeListener(
    newChangeListener(){
    @Override
    publicvoidstateChanged(ChangeEvente){
    floatvalue=slider.getValue();
    WindowUtils.setWindowAlpha(frame,value
    *0.01f);
    }
    });
    container.add(slider,BorderLayout.SOUTH);
    RoundRectangle2D.Floatmask
    =newRoundRectangle2D.Float(0,0,frame
    .getWidth(),frame.getHeight(),
    20,20);
    WindowUtils.setWindowMask(frame,mask);
    centerWindow(frame);
    }

    publicstaticvoidcenterWindow(Containerwindow){
    Dimensiondim
    =Toolkit.getDefaultToolkit().getScreenSize();
    intw=window.getSize().width;
    inth=window.getSize().height;
    intx=(dim.width-w)/2;
    inty=(dim.height-h)/2;
    window.setLocation(x,y);
    }
    }

    利用JNA来制作透明效果非常简单,只需要调用WindowUtils.setWindowAlpha(window, alpha)就可以了。当然这是JNA特别为UI写的工具代码。如果要改变形状,用WindowUtils.setWindowMask(window, shape)或者WindowUtils.setWindowMask(window, icon)就可以了,但是要注意一点必须设置System.setProperty("sun.java2d.noddraw","true"),否则JNA会告诉你这个程序不支持透明。当然要运行起来,还得需要两个Jar,jna.jarexamples.jar ,都不是很大,只有200多K。
    虽然这篇文章只是介绍了一下JNA关于Swing的简单用法,但是有了这个我最先到的便是可以做类似于Yahoo Widget和Google Widget之类的东西了,还可以做好看的fishEye,SideBar,JNA的JAR两个合起来不过400K,却能让这么多复杂的事情简单化,真是精湛的艺术啊,嗯。

  • 相关阅读:
    【Java】Java创建String时,什么情况放进String Pool?
    【Java】代理模式,静态代理和动态代理(基于JDK或CGLib)
    【Java】Float计算不准确
    【Spring】初始化Spring IoC容器(非Web应用),并获取Bean
    【Eclipse】安装subclipse的Eclipse插件
    【多线程】如何通过线程返回值?如何使用多线程并发查询数据
    【多线程】并发执行指定数量的线程
    【ActiveMQ】ActiveMQ在Windows的安装,以及点对点的消息发送案例
    DBCP连接Oracle,数据库重启后现OALL8 is in an inconsistent state异常
    jQuery Validation remote的缓存请求
  • 原文地址:https://www.cnblogs.com/new0801/p/6175985.html
Copyright © 2020-2023  润新知