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
*/
package ruislan.rswing.test;

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

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

import com.sun.jna.examples.WindowUtils;

/**
*TransparentJFrameuseJNA
*
*
@author ruislan<ahref="mailto:z17520@126.com"/>
*
@version 0.1.0
*/
public class TransparentFrame{
private JFrameframe;
private JPanelcontainer;
private JSliderslider;
private JPaneltitleBar;
private JLabeltitleLabel;
private JButtoncloseButton;

public static void main(String[]args){
new TransparentFrame().launch();
}

private void launch(){
createUI();
launchUI();
}

protected void launchUI(){
frame.setVisible(
true );
}

protected void createUI(){
System.setProperty(
" sun.java2d.noddraw " , " true " );
frame
= new JFrame();
frame.setSize(
200 , 150 );
frame.setAlwaysOnTop(
true );
frame.setUndecorated(
true );

container
= new JPanel();
frame.setContentPane(container);
container.setLayout(
new BorderLayout());
container.add(
new JLabel( " UbuntovsVista,Ilikeboth. " ),
BorderLayout.CENTER);
container.setBorder(
new LineBorder(Color.BLACK));

titleBar
= new JPanel();
titleBar.setLayout(
new BorderLayout());
titleLabel
= new JLabel( " JNAisgreat! " );
titleBar.add(titleLabel,BorderLayout.CENTER);
titleBar.setBorder(
new LineBorder(Color.GRAY));
closeButton
= new JButton( " X " );
closeButton.setFocusPainted(
false );
closeButton.addActionListener(
new ActionListener(){
@Override
public void actionPerformed(ActionEvente){
System.exit(
0 );
}
});
titleBar.add(closeButton,BorderLayout.EAST);
container.add(titleBar,BorderLayout.NORTH);

slider
= new JSlider( 0 , 100 );
slider.setValue(
100 );
slider.addChangeListener(
new ChangeListener(){
@Override
public void stateChanged(ChangeEvente){
float value = slider.getValue();
WindowUtils.setWindowAlpha(frame,value
* 0.01f );
}
});
container.add(slider,BorderLayout.SOUTH);
RoundRectangle2D.Floatmask
= new RoundRectangle2D.Float( 0 , 0 ,frame
.getWidth(),frame.getHeight(),
20 , 20 );
WindowUtils.setWindowMask(frame,mask);
centerWindow(frame);
}

public static void centerWindow(Containerwindow){
Dimensiondim
= Toolkit.getDefaultToolkit().getScreenSize();
int w = window.getSize().width;
int h = window.getSize().height;
int x = (dim.width - w) / 2 ;
int y = (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,卻能讓這麼多複雜的事情簡單化,真是精湛的藝術啊,嗯。
相關文章
相關標籤/搜索