JFrame在去掉标题栏的情况下怎么实现拉大收缩边框的功能?

yaochunpin 2010-08-23 03:34:35
JFrame在去掉标题栏的情况下怎么实现拉大收缩边框的功能?谢谢!
...全文
525 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wen517913840 2012-11-13
  • 打赏
  • 举报
回复
我也遇到这个问题了 顶起 学习了
mahaigss 2011-10-13
  • 打赏
  • 举报
回复
最近刚看这些 刚好用到证发愁呢哈哈 谢谢Tassdars 谢谢楼主
问题解决
Tassdars 2010-08-24
  • 打赏
  • 举报
回复
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class ResizeFrame extends JFrame {
private boolean isTopLeft;// 是否处于左上角调整窗口状态
private boolean isTop;// 是否处于上边界调整窗口状态
private boolean isTopRight;// 是否处于右上角调整窗口状态
private boolean isRight;// 是否处于右边界调整窗口状态
private boolean isBottomRight;// 是否处于右下角调整窗口状态
private boolean isBottom;// 是否处于下边界调整窗口状态
private boolean isBottomLeft;// 是否处于左下角调整窗口状态
private boolean isLeft;// 是否处于左边界调整窗口状态
private final static int RESIZE_WIDTH = 5;// 判定是否为调整窗口状态的范围与边界距离
private final static int MIN_WIDTH = 20;// 窗口最小宽度
private final static int MIN_HEIGHT = 20;// 窗口最小高度

public ResizeFrame() {
addMouseMotionListener(new ResizeAdapter(this));
}

private class ResizeAdapter extends MouseAdapter {
private Component c;

public ResizeAdapter(Component c) {
this.c = c;
}

@Override
public void mouseMoved(MouseEvent event) {
int x = event.getX();
int y = event.getY();
int width = c.getWidth();
int height = c.getHeight();
int cursorType = Cursor.DEFAULT_CURSOR;// 鼠标光标初始为默认类型,若未进入调整窗口状态,保持默认类型
// 先将所有调整窗口状态重置
isTopLeft = isTop = isTopRight = isRight = isBottomRight = isBottom = isBottomLeft = isLeft = false;
if (y <= RESIZE_WIDTH) {
if (x <= RESIZE_WIDTH) {// 左上角调整窗口状态
isTopLeft = true;
cursorType = Cursor.NW_RESIZE_CURSOR;
} else if (x >= width - RESIZE_WIDTH) {// 右上角调整窗口状态
isTopRight = true;
cursorType = Cursor.NE_RESIZE_CURSOR;
} else {// 上边界调整窗口状态
isTop = true;
cursorType = Cursor.N_RESIZE_CURSOR;
}
} else if (y >= height - RESIZE_WIDTH) {
if (x <= RESIZE_WIDTH) {// 左下角调整窗口状态
isBottomLeft = true;
cursorType = Cursor.SW_RESIZE_CURSOR;
} else if (x >= width - RESIZE_WIDTH) {// 右下角调整窗口状态
isBottomRight = true;
cursorType = Cursor.SE_RESIZE_CURSOR;
} else {// 下边界调整窗口状态
isBottom = true;
cursorType = Cursor.S_RESIZE_CURSOR;
}
} else if (x <= RESIZE_WIDTH) {// 左边界调整窗口状态
isLeft = true;
cursorType = Cursor.W_RESIZE_CURSOR;
} else if (x >= width - RESIZE_WIDTH) {// 右边界调整窗口状态
isRight = true;
cursorType = Cursor.E_RESIZE_CURSOR;
}
// 最后改变鼠标光标
c.setCursor(new Cursor(cursorType));
}

@Override
public void mouseDragged(MouseEvent event) {
int x = event.getX();
int y = event.getY();
int width = c.getWidth();
int height = c.getHeight();
// 保存窗口改变后的x、y坐标和宽度、高度,用于预判是否会小于最小宽度、最小高度
int nextX = c.getX();
int nextY = c.getY();
int nextWidth = width;
int nextHeight = height;
if (isTopLeft || isLeft || isBottomLeft) {// 所有左边调整窗口状态
nextX += x;
nextWidth -= x;
}
if (isTopLeft || isTop || isTopRight) {// 所有上边调整窗口状态
nextY += y;
nextHeight -= y;
}
if (isTopRight || isRight || isBottomRight) {// 所有右边调整窗口状态
nextWidth = x;
}
if (isBottomLeft || isBottom || isBottomRight) {// 所有下边调整窗口状态
nextHeight = y;
}
if (nextWidth <= MIN_WIDTH) {// 如果窗口改变后的宽度小于最小宽度,则宽度调整到最小宽度
nextWidth = MIN_WIDTH;
if (isTopLeft || isLeft || isBottomLeft) {// 如果是从左边缩小的窗口,x坐标也要调整
nextX = c.getX() + width - nextWidth;
}
}
if (nextHeight <= MIN_HEIGHT) {// 如果窗口改变后的高度小于最小高度,则高度调整到最小高度
nextHeight = MIN_HEIGHT;
if (isTopLeft || isTop || isTopRight) {// 如果是从上边缩小的窗口,y坐标也要调整
nextY = c.getY() + height - nextHeight;
}
}
// 最后统一改变窗口的x、y坐标和宽度、高度,可以防止刷新频繁出现的屏闪情况
setBounds(nextX, nextY, nextWidth, nextHeight);
}
}

public static void main(String[] args) {
// 一个简单的演示小例子
JFrame frame = new ResizeFrame();
frame.setSize(400, 300);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
frame.setLocation((screenSize.width - frame.getWidth()) / 2, (screenSize.height - frame.getHeight()) / 2);
frame.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent event) {
if (event.getClickCount() > 1) {
System.exit(0);
}
}
});
frame.setUndecorated(true);
frame.setVisible(true);
}
}


这个是完整版,更新如下:
1、优化了一下代码结构
2、解决了限制最小宽度和最小高度的问题
3、解决了左边和上边调整大小时的屏闪问题
4、加入了注释
5、解决了无法在窗体上直接结束程序的问题(双击窗体结束程序)

一个斜杠和CSDN帖子不能修改引发的杯具……
Tassdars 2010-08-24
  • 打赏
  • 举报
回复
[code=Java]import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class ResizeFrame extends JFrame {
private boolean isTopLeft;// 是否处于左上角调整窗口状态
private boolean isTop;// 是否处于上边界调整窗口状态
private boolean isTopRight;// 是否处于右上角调整窗口状态
private boolean isRight;// 是否处于右边界调整窗口状态
private boolean isBottomRight;// 是否处于右下角调整窗口状态
private boolean isBottom;// 是否处于下边界调整窗口状态
private boolean isBottomLeft;// 是否处于左下角调整窗口状态
private boolean isLeft;// 是否处于左边界调整窗口状态
private final static int RESIZE_WIDTH = 5;// 判定是否为调整窗口状态的范围与边界距离
private final static int MIN_WIDTH = 20;// 窗口最小宽度
private final static int MIN_HEIGHT = 20;// 窗口最小高度

public ResizeFrame() {
addMouseMotionListener(new ResizeAdapter(this));
}

private class ResizeAdapter extends MouseAdapter {
private Component c;

public ResizeAdapter(Component c) {
this.c = c;
}

@Override
public void mouseMoved(MouseEvent event) {
int x = event.getX();
int y = event.getY();
int width = c.getWidth();
int height = c.getHeight();
int cursorType = Cursor.DEFAULT_CURSOR;// 鼠标光标初始为默认类型,若未进入调整窗口状态,保持默认类型
// 先将所有调整窗口状态重置
isTopLeft = isTop = isTopRight = isRight = isBottomRight = isBottom = isBottomLeft = isLeft = false;
if (y <= RESIZE_WIDTH) {
if (x <= RESIZE_WIDTH) {// 左上角调整窗口状态
isTopLeft = true;
cursorType = Cursor.NW_RESIZE_CURSOR;
} else if (x >= width - RESIZE_WIDTH) {// 右上角调整窗口状态
isTopRight = true;
cursorType = Cursor.NE_RESIZE_CURSOR;
} else {// 上边界调整窗口状态
isTop = true;
cursorType = Cursor.N_RESIZE_CURSOR;
}
} else if (y >= height - RESIZE_WIDTH) {
if (x <= RESIZE_WIDTH) {// 左下角调整窗口状态
isBottomLeft = true;
cursorType = Cursor.SW_RESIZE_CURSOR;
} else if (x >= width - RESIZE_WIDTH) {// 右下角调整窗口状态
isBottomRight = true;
cursorType = Cursor.SE_RESIZE_CURSOR;
} else {// 下边界调整窗口状态
isBottom = true;
cursorType = Cursor.S_RESIZE_CURSOR;
}
} else if (x <= RESIZE_WIDTH) {// 左边界调整窗口状态
isLeft = true;
cursorType = Cursor.W_RESIZE_CURSOR;
} else if (x >= width - RESIZE_WIDTH) {// 右边界调整窗口状态
isRight = true;
cursorType = Cursor.E_RESIZE_CURSOR;
}
// 最后改变鼠标光标
c.setCursor(new Cursor(cursorType));
}

@Override
public void mouseDragged(MouseEvent event) {
int x = event.getX();
int y = event.getY();
int width = c.getWidth();
int height = c.getHeight();
// 保存窗口改变后的x、y坐标和宽度、高度,用于预判是否会小于最小宽度、最小高度
int nextX = c.getX();
int nextY = c.getY();
int nextWidth = width;
int nextHeight = height;
if (isTopLeft || isLeft || isBottomLeft) {// 所有左边调整窗口状态
nextX += x;
nextWidth -= x;
}
if (isTopLeft || isTop || isTopRight) {// 所有上边调整窗口状态
nextY += y;
nextHeight -= y;
}
if (isTopRight || isRight || isBottomRight) {// 所有右边调整窗口状态
nextWidth = x;
}
if (isBottomLeft || isBottom || isBottomRight) {// 所有下边调整窗口状态
nextHeight = y;
}
if (nextWidth <= MIN_WIDTH) {// 如果窗口改变后的宽度小于最小宽度,则宽度调整到最小宽度
nextWidth = MIN_WIDTH;
if (isTopLeft || isLeft || isBottomLeft) {// 如果是从左边缩小的窗口,x坐标也要调整
nextX = c.getX() + width - nextWidth;
}
}
if (nextHeight <= MIN_HEIGHT) {// 如果窗口改变后的高度小于最小高度,则高度调整到最小高度
nextHeight = MIN_HEIGHT;
if (isTopLeft || isTop || isTopRight) {// 如果是从上边缩小的窗口,y坐标也要调整
nextY = c.getY() + height - nextHeight;
}
}
// 最后统一改变窗口的x、y坐标和宽度、高度,可以防止刷新频繁出现的屏闪情况
setBounds(nextX, nextY, nextWidth, nextHeight);
}
}

public static void main(String[] args) {
// 一个简单的演示小例子
JFrame frame = new ResizeFrame();
frame.setSize(400, 300);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
frame.setLocation((screenSize.width - frame.getWidth()) / 2, (screenSize.height - frame.getHeight()) / 2);
frame.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent event) {
if (event.getClickCount() > 1) {
System.exit(0);
}
}
});
frame.setUndecorated(true);
frame.setVisible(true);
}
}[code]

这个是完整版,更新如下:
1、优化了一下代码结构
2、解决了限制最小宽度和最小高度的问题
3、解决了左边和上边调整大小时的屏闪问题
4、加入了注释
5、解决了无法在窗体上直接结束程序的问题(双击窗体结束程序)
yaochunpin 2010-08-24
  • 打赏
  • 举报
回复
谢谢了!
yaochunpin 2010-08-24
  • 打赏
  • 举报
回复
真的实在感谢,像先生这么负责人的人真让人感动!
qysword 2010-08-23
  • 打赏
  • 举报
回复
学习一下,顶……
Tassdars 2010-08-23
  • 打赏
  • 举报
回复
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class ResizeFrame extends JFrame {
private boolean isTopLeft;
private boolean isTop;
private boolean isTopRight;
private boolean isRight;
private boolean isBottomRight;
private boolean isBottom;
private boolean isBottomLeft;
private boolean isLeft;
private final static int RESIZE_WIDTH = 5;
private final static int MIN_WIDTH = 20;
private final static int MIN_HEIGHT = 20;

public ResizeFrame() {
addMouseMotionListener(new ResizeAdapter(this));
}

private class ResizeAdapter extends MouseAdapter {
private Component c;

public ResizeAdapter(Component c) {
this.c = c;
}

@Override
public void mouseMoved(MouseEvent event) {
int x = event.getX();
int y = event.getY();
int width = c.getWidth();
int height = c.getHeight();
int cursorType = Cursor.DEFAULT_CURSOR;
isTopLeft = isTop = isTopRight = isRight = isBottomRight = isBottom = isBottomLeft = isLeft = false;
if (y <= RESIZE_WIDTH) {
if (x <= RESIZE_WIDTH) {
isTopLeft = true;
cursorType = Cursor.NW_RESIZE_CURSOR;
} else if (x >= width - RESIZE_WIDTH) {
isTopRight = true;
cursorType = Cursor.NE_RESIZE_CURSOR;
} else {
isTop = true;
cursorType = Cursor.N_RESIZE_CURSOR;
}
} else if (y >= height - RESIZE_WIDTH) {
if (x <= RESIZE_WIDTH) {
isBottomLeft = true;
cursorType = Cursor.SW_RESIZE_CURSOR;
} else if (x >= width - RESIZE_WIDTH) {
isBottomRight = true;
cursorType = Cursor.SE_RESIZE_CURSOR;
} else {
isBottom = true;
cursorType = Cursor.S_RESIZE_CURSOR;
}
} else if (x <= RESIZE_WIDTH) {
isLeft = true;
cursorType = Cursor.W_RESIZE_CURSOR;
} else if (x >= width - RESIZE_WIDTH) {
isRight = true;
cursorType = Cursor.E_RESIZE_CURSOR;
}
c.setCursor(new Cursor(cursorType));
}

@Override
public void mouseDragged(MouseEvent event) {
int x = event.getX();
int y = event.getY();
int width = c.getWidth();
int height = c.getHeight();
if (isTopLeft) {
c.setLocation(c.getX() + x, c.getY() + y);
c.setSize(width - x, height - y);
}
if (isTop) {
c.setLocation(c.getX(), c.getY() + y);
c.setSize(width, height - y);
}
if (isTopRight) {
c.setLocation(c.getX(), c.getY() + y);
c.setSize(x, height - y);
}
if (isRight) {
c.setSize(x, height);
}
if (isBottomRight) {
c.setSize(x, y);
}
if (isBottom) {
c.setSize(width, y);
}
if (isBottomLeft) {
c.setLocation(c.getX() + x, c.getY());
c.setSize(width - x, y);
}
if (isLeft) {
c.setLocation(c.getX() + x, c.getY());
c.setSize(width - x, height);
}
}
}

public static void main(String[] args) {
JFrame frame = new ResizeFrame();
frame.setLocation(200, 200);
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setUndecorated(true);
frame.setVisible(true);
}
}


先这么多,还有BUG,最小宽度和最小高度的处理还没弄,下班了,晚上回家再说。
Tassdars 2010-08-23
  • 打赏
  • 举报
回复
只能自己实现了,思路是把JFrame分成九个区域,八个boolean状态变量,当然,是虚拟的划分,注册mouse move事件,当鼠标进入不同区域的时候设置八个boolean状态变量的值,同时改变鼠标指针状态,然后注册mouse down事件,根据八个boolean状态变量的值确定应该如何Resize,还是比较复杂的。
yaochunpin 2010-08-23
  • 打赏
  • 举报
回复
呀,没人回答啊,自己顶一下!

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧