javajframe移动无任务栏窗口_Java有关浮动面板(无标题可拖动窗口)

最近和同学组的开发DeskPixie的小组,我负责期中透明浮动面板的开发,真的是一点头绪都没有啊!在网上查了很长时间关于浮动面板的信息,可是查到得都是相关有窗口标题的依赖某个主窗口的可拖动的浮动窗口!

在查询过程中了解到对话框分为了模式和非模式窗口,两者大概的区别有所了解了,但是具体的区别还有待查询;

另外还大概了解到了开发这些窗口可能用到的类是Dialog、JToolbar、JOptionPane;具体这些类的学习及窗口的开发还待学习;

现在切入正题,为和我一样找寻这方面知识,可又无从下手,或者搜索关键词一直把握不对的朋友,分享从网上找到的相关代码,以及运行效果图,还有运行过程中可能遇到的问题;

在此特别感谢z.EnID:zenwong;

他的两篇文章:

1、http://blog.csdn.net/zenwong/archive/2007/11/02/1863817.aspx

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版本!这个具体操作放在另外一篇博客说吧!

再次感谢z.En(zenyong);希望对大家有用!

嘿嘿,项目有点进展,开心!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值