您的位置:首页 > 编程语言 > Java开发

java中 实现无标题无边框的窗体能够用鼠标拖动改变窗口大小

2012-12-04 17:08 1151 查看
出现的问题:

1、setUndecorated(true)设置窗体无边框,但是setResizable(true)设置

可以通过鼠标调整大小,不起作用,这是怎么回事?

2、有没有事件,可以监听到,鼠标移动到边缘?如果java设置窗体无边框后,无

法鼠标拖动调整大小,我想自己做监听事件。

需要的效果:



 

目标:

 下面是我做,很简单,但是费了老大劲了!

 1、我所提的问题,出现的这种情况;

 2、无标题栏,自定义边框,可以根据需要修改,做的简单;

 3、像QQ面板一样,需要时,可以根据需要向上加组件;

 4、可以拖动修改大小,拖动移动位置;

 5、有点小问题,就是左、上拉伸时,右、下有点小小的抖动;

着重:

frame.setUndecorated(true);

Border b = new CompoundBorder(new EtchedBorder(),new LineBorder(Color.RED));


源码:[b]http://download.csdn.net/detail/littlealamo/4845515[/b]

上传源码 2种效果对比

package test;

import java.awt.Color;

import java.awt.Cursor;

import java.awt.Dimension;

import java.awt.Point;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.border.Border;

import javax.swing.border.CompoundBorder;

import javax.swing.border.EtchedBorder;

import javax.swing.border.LineBorder;

public class WindowDragSize {

/**

 * @param args

 */

public static void main(String[] args) {

// TODO Auto-generated method stub

final JFrame frame = new JFrame();

frame.setUndecorated(true);

  Border b = new CompoundBorder(new EtchedBorder(),new LineBorder(Color.RED));

  final JPanel panel = new JPanel();

  panel.setSize(200,100);

  panel.setBorder(b);

  

  

  panel.addMouseMotionListener(new MouseAdapter() {

    private boolean top = false;

    private boolean down = false;

    private boolean left = false;

    private boolean right = false;

    private boolean drag = false;

    private Point lastPoint = null;

    private Point draggingAnchor = null;

            @Override

            public void mouseMoved(MouseEvent e) {

             if(  e.getPoint().getY() == 0 ){

             frame.setCursor(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR));

             top = true;

             }else if(Math.abs(e.getPoint().getY()- frame.getSize().getHeight()) <= 1 ){

             frame.setCursor(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR));

             down = true;

             }else if(e.getPoint().getX() == 0 ){

             frame.setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));

             left = true;

             }else if(Math.abs(e.getPoint().getX()- frame.getSize().getWidth()) <=1 ){

             frame.setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));

             right = true;

             }else{

             frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));

             draggingAnchor = new Point(e.getX() + panel.getX(), e.getY() + panel.getY());

             top = false;

             down = false;

             left = false;

             right = false;

             drag = true;

             }

  

            }

            

            @Override

            public void mouseDragged(MouseEvent e) {

             Dimension dimension = frame.getSize();

             if(top){

            

             dimension.setSize(dimension.getWidth() ,dimension.getHeight()-e.getY());

             frame.setSize(dimension);

             frame.setLocation(frame.getLocationOnScreen().x, frame.getLocationOnScreen().y + e.getY());

             }else if(down){

              

             dimension.setSize(dimension.getWidth() , e.getY());

             frame.setSize(dimension);

      

             }else if(left){

              

             dimension.setSize(dimension.getWidth() - e.getX() ,dimension.getHeight() );

             frame.setSize(dimension);

            

     

             frame.setLocation(frame.getLocationOnScreen().x + e.getX(),frame.getLocationOnScreen().y );

                

             }else if(right){

              

             dimension.setSize(e.getX(),dimension.getHeight());

             frame.setSize(dimension);

             }else {

                    frame.setLocation(e.getLocationOnScreen().x - draggingAnchor.x, e.getLocationOnScreen().y - draggingAnchor.y);

             }

            }

        });

  frame.setLocation(200,100);

  frame.getContentPane().add(panel);

  frame.setSize(200,100);

  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  frame.show();

  

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: