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();
}
}
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();
}
}
相关文章推荐
- Qt无边框窗口实现拖动和改变大小(修改)
- 无边框窗体的拖动以及大小改变的实现方式
- MFC 无边框窗体实现用鼠标拖动窗体边缘实现窗体大小变化
- Pyqt实现无边框窗口拖动及改变窗口大小
- 实现用鼠标拖动没有标题栏的窗口(窗体的任何部分都可实现拖动效果)
- Pyqt实现无边框窗口拖动以及窗口大小改变
- MFC无边框的窗体实现用鼠标拖动窗体边缘实现窗体大小变化
- c++builder如何通过鼠标拖动改变无边框窗体的大小(bsnone)
- node-webkit无边框窗口用纯JS实现拖动改变大小
- node-webkit学习之【无边框窗口用JS实现拖动改变大小等】
- node-webkit无边框窗口用纯JS实现拖动改变大小
- MFC无边框的窗体实现用鼠标拖动窗体边缘实现窗体大小变化
- WPF 无标题栏窗口鼠标拖动改变大小
- MFC无边框的窗体实现用鼠标拖动窗体边缘实现窗体大小变化
- c# 实现用鼠标拖动没有标题栏的窗口(窗体的任何部分都可实现拖动效果)
- MFC无边框的窗体实现用鼠标拖动窗体边缘实现窗体大小变化
- MFC无边框的窗体实现用鼠标拖动窗体边缘实现窗体大小变化
- MFC在鼠标自定义的一定的范围内实现拖动窗口移动、错误:不支持尝试执行的操作、实现进度条颜色的渐变或者背景和前景色的改变
- 实现无边框窗体的拖动及窗体大小变化
- Winform无边框窗口拖动及改变窗口大小