最近和同学组的开发DeskPixie的小组,我负责期中透明浮动面板的开发,真的是一点头绪都没有啊!在网上查了很长时间关于浮动面板的信息,可是查到得都是相关有窗口标题的依赖某个主窗口的可拖动的浮动窗口!
在查询过程中了解到对话框分为了模式和非模式窗口,两者大概的区别有所了解了,但是具体的区别还有待查询;
另外还大概了解到了开发这些窗口可能用到的类是Dialog、JToolbar、JOptionPane;具体这些类的学习及窗口的开发还待学习;
现在切入正题,为和我一样找寻这方面知识,可又无从下手,或者搜索关键词一直把握不对的朋友,分享从网上找到的相关代码,以及运行效果图,还有运行过程中可能遇到的问题;
在此特别感谢z.EnID:zenwong;
他的两篇文章:
1、
Java Swing 无标题窗口 可拖动
代码为:
package javaapplication1;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class TestFrameDemo {
static Point origin = new Point(); //全局的位置变量,用于表示鼠标在窗口上的位置
static JFrame myFrame = new JFrame();
public static void main(String[] args) {
myFrame.setUndecorated(true);
myFrame.setSize(600, 400);
myFrame.setVisible(true);
myFrame.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
//按下(mousePressed
不是点击,而是鼠标被按下没有抬起)origin.x = e.getX(); //当鼠标按下的时候获得窗口当前的位置
origin.y = e.getY();
}
});
myFrame.addMouseMotionListener(new MouseMotionAdapter()
{
public void mouseDragged(MouseEvent e) {
//拖动(mouseDragged 指的不是鼠标在窗口中移动,而是用鼠标拖动)
Point p = myFrame.getLocation();
//当鼠标拖动时获取窗口当前位置
//设置窗口的位置
//窗口当前的位置 +
鼠标当前在窗口的位置 - 鼠标按下的时候在窗口的位置
myFrame.setLocation(p.x + e.getX() - origin.x, p.y + e.getY() -
origin.y);
}
});
}
}
此代码我在Myeclipse中执行,请初学者注意包名和类名;这个执行效果为:
图中灰色的部分为浮动窗口部分,可随意拖动,但是要在任务栏右击才能关闭窗口;
2、
用NetBeans写的Java Swing模仿Vista磨砂玻璃效果透明窗体 第3版
上面是原文作者的标题,我在Myeclipse里面试过了,也能正常运行,无需修改代码,但是可能有些用户需要修改Myeclipse默认的jre,这个最后说,先看一下代码:
package javaapplication1;
import java.awt.Robot;
import java.awt.*;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.UIManager;
import javax.swing.*;
import java.awt.image.*;
import java.awt.color.*;
public class NewJFrame extends javax.swing.JFrame {
boolean
movieTf=false;
Point
mainP=new Point();
public
NewJFrame() {//構造方法
this.setUndecorated(true);//去掉JFrame的标题栏
Image ico=Toolkit.getDefaultToolkit().getImage("g:/h2.jpg");
this.setIconImage(ico);
try {
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");//UI设置
//UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName());//windows樣式
}catch (Exception ex) {
javax.swing.JOptionPane.showMessageDialog(this,"發生UI加載錯誤,您可能無法看到程式預想的UI效果,錯誤信息如下:\n"+ex.toString());
}
initComponents();
this.setLocation(100,100);
}
//
private void
initComponents() {
jlb = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setCursor(new
java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
addWindowFocusListener(new java.awt.event.WindowFocusListener()
{
public void windowGainedFocus(java.awt.event.WindowEvent evt)
{
formWindowGainedFocus(evt);
}
public void windowLostFocus(java.awt.event.WindowEvent evt) {
formWindowLostFocus(evt);
}
});
addComponentListener(new java.awt.event.ComponentAdapter() {
public void componentMoved(java.awt.event.ComponentEvent evt)
{
formComponentMoved(evt);
}
public void componentResized(java.awt.event.ComponentEvent evt)
{
formComponentResized(evt);
}
});
jlb.setBorder(javax.swing.BorderFactory.createLineBorder(new
java.awt.Color(128, 128, 128)));
jlb.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jlbMouseClicked(evt);
}
public void mousePressed(java.awt.event.MouseEvent evt) {
jlbMousePressed(evt);
}
public void mouseReleased(java.awt.event.MouseEvent evt) {
jlbMouseReleased(evt);
}
});
jlb.addMouseMotionListener(new java.awt.event.MouseMotionAdapter()
{
public void mouseDragged(java.awt.event.MouseEvent evt) {
jlbMouseDragged(evt);
}
public void mouseMoved(java.awt.event.MouseEvent evt) {
jlbMouseMoved(evt);
}
});
javax.swing.GroupLayout layout = new
javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jlb, javax.swing.GroupLayout.Alignment.TRAILING,
javax.swing.GroupLayout.DEFAULT_SIZE, 289, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jlb, javax.swing.GroupLayout.Alignment.TRAILING,
javax.swing.GroupLayout.DEFAULT_SIZE, 762, Short.MAX_VALUE)
);
pack();
}//
private void
jlbMousePressed(java.awt.event.MouseEvent evt)
{ // TODO 将在此处添加您的处理代码:
mainP.x = evt.getX();//当鼠标按下的时候获得窗口当前的位置
mainP.y = evt.getY();
}
private void
jlbMouseDragged(java.awt.event.MouseEvent evt)
{ // TODO
将在此处添加您的处理代码: //鼠标拖动 this.jlb.setIcon(null); //拖動時候將圖片去除
Point p = this.getLocation();//当鼠标拖动时获取窗口当前位置
this.setLocation(p.x + evt.getX() - mainP.x, p.y + evt.getY()-
mainP.y);
}
private void
jlbMouseMoved(java.awt.event.MouseEvent evt)
{ // TODO 将在此处添加您的处理代码://鼠標移動
}
private void
jlbMouseReleased(java.awt.event.MouseEvent evt)
{ // TODO 将在此处添加您的处理代码://鼠標放開
this.selectBgimg();
}
private void
jlbMouseClicked(java.awt.event.MouseEvent evt)
{ // TODO 将在此处添加您的处理代码://鼠標點擊
//this.selectBgimg();
}
private void
formWindowLostFocus(java.awt.event.WindowEvent evt)
{ // TODO 将在此处添加您的处理代码://失去焦點
}
private void
formWindowGainedFocus(java.awt.event.WindowEvent evt)
{ // TODO 将在此处添加您的处理代码://得到焦點
this.selectBgimg();
}
private void
formComponentResized(java.awt.event.ComponentEvent evt)
{ // TODO 将在此处添加您的处理代码://儅窗口改變大小
this.selectBgimg();
}
private void
formComponentMoved(java.awt.event.ComponentEvent evt)
{ // TODO 将在此处添加您的处理代码://儅窗口移動
//if(this.tf=false){
// this.selectBgimg();
//}
}
private void
selectBgimg(){//截屏代码
//this.tf=true;
try {
Point p=this.getLocation();//移動方式,用p
this.setLocation(-2000,-2000);//移動方式
//this.setVisible(false);//隱藏方式,用this
Robot rbt = new Robot();
Toolkit tk =
Toolkit.getDefaultToolkit();
Dimension dim =
tk.getScreenSize();
//截圖
BufferedImage background =
rbt.createScreenCapture(new
Rectangle((int)p.getX()+1,(int)p.getY()+1,
this.getWidth()-2,this.getHeight()-2));
background =
rbt.createScreenCapture(new
Rectangle((int)p.getX()+1,(int)p.getY()+1,
this.getWidth()-2,this.getHeight()-2));
background =
rbt.createScreenCapture(new
Rectangle((int)p.getX()+1,(int)p.getY()+1,
this.getWidth()-2,this.getHeight()-2));
background =
rbt.createScreenCapture(new
Rectangle((int)p.getX()+1,(int)p.getY()+1,
this.getWidth()-2,this.getHeight()-2));
//截圖
float[] data={
//0.0625f,0.125f,0.0625f,
//0.125f,0.125f,0.125f,
//0.0625f,0.125f,0.0625f,
0.0625f,0.125f,0.0625f,
0.125f,0.125f,0.125f,
0.0625f,0.125f,0.0625f,
//0.170f,0.06f,0.170f,
//0.06f,0.06f,0.06f,
//0.170f,0.06f,0.170f,
};
Kernel kernel= new Kernel(3,3,data);
ConvolveOp co= new
ConvolveOp(kernel,ConvolveOp.EDGE_NO_OP,null);
BufferedImage
background2=null;
background2=co.filter(background,background2);
ImageIcon bg=new ImageIcon(background2);
jlb.setIcon(bg);
//this.setVisible(true);//隱藏方式
this.setLocation(p);//移動方式
} catch (Exception ex) {
javax.swing.JOptionPane.showMessageDialog(this,"透明效果發生錯誤,程序無法啓動,錯誤信息如下:\n"+ex.toString());
}
//this.tf=false;
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewJFrame().setVisible(true);
}
});
}
// 变量声明 -
不进行修改
private javax.swing.JLabel jlb;
//
变量声明结束
}
在此附上这个的运行效果:
另外这个鼠标点击及这么呆着显示是透明,鼠标拖动的时候就不再透明了!
现在说一下,有些Myeclipse版本比较低的用户在运行第二段代码的时候会提示:Javax.Swing.GroupLayout
cannot be resolved.错误提示;
这个是因为Myeclipse版本比较低,而且Myeclipse使用自己本身带的jre版本,这时候你需要更改Myeclipse默认使用jre版本,改成自己安装的jre版本!这个具体操作放在另外一篇博客说吧!
嘿嘿,项目有点进展,开心!