问2个有关JFrame的问题

lEFTmOON 2005-07-20 04:58:22
1、使用JFrame的程序,我怎么知道客户区的真正大小?
不要说是用getWidth()/getHeight()来取得,因为这样取得的是JFrame的大小,但是客户区的高应该除去标题栏的高和底部边框的“厚度”,宽也一样要除去两个“厚度”(由于在不同的L&F下标题栏和边框的大小会有区别,有函数取得他们的尺寸吗?)

2、实现标题栏的功能
如果我使用JFrame.setUndecorated(true)来显示无边的窗口,但我又希望给出一个区域,使得用户在该区域按下鼠标拖动时,可以拖动窗口(实现和标题栏一样的功能)
...全文
220 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wintercampus 2005-07-24
  • 打赏
  • 举报
回复
public class MyClass extends JFrame{
public MyClass(){
super("窗口");
setSize(800,600);
setVisible(true);

Container pane = getContentPane();//取出客户区
。。。。。。。。。
int width=pane.getWidth()//pane就是客户区,这个就取得了客户区的宽度。
lEFTmOON 2005-07-23
  • 打赏
  • 举报
回复
to gtlang78
感谢你的代码,另外问一个问题,可以在拖动时只显示外框而不是显示窗口的内容吗?
congliu 2005-07-22
  • 打赏
  • 举报
回复
第二个问题:

把鼠标的事件映射到边框上,所以触发了在边框上拖动的效果

Point p = e.getPoint();
int dx = p.x - point.x;
int dy = p.y - point.y;

int x = getX();
int y = getY();
setLocation(x + dx, y + dy);
gtlang78 2005-07-21
  • 打赏
  • 举报
回复
import java.awt.*;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.event.MouseInputAdapter;

public class UndecoratedFrame extends JFrame
{
private static final int TITLE_HEIGHT = 20;

public UndecoratedFrame() throws HeadlessException
{
super();
setUndecorated(true);

MouseHandler ml = new MouseHandler();
addMouseListener(ml);
addMouseMotionListener(ml);
}

public UndecoratedFrame(String title) throws HeadlessException
{
super(title);
setUndecorated(true);

MouseHandler ml = new MouseHandler();
addMouseListener(ml);
addMouseMotionListener(ml);
}

public Insets getInsets()
{
return new Insets(TITLE_HEIGHT, 1, 1, 1);
}

public void paint(Graphics g)
{
super.paint(g);
g.setColor(new Color(0, 0, 128));
g.drawRect(0, 0, getWidth()-1, getHeight()-1);
g.fillRect(0, 0, getWidth(), TITLE_HEIGHT);

FontMetrics fm = g.getFontMetrics();
g.setColor(Color.white);
g.drawString(getTitle(), 2, (TITLE_HEIGHT - fm.getHeight()) / 2 + fm.getAscent());
}

private class MouseHandler extends MouseInputAdapter
{
private Point point;

public void mousePressed(MouseEvent e)
{
if (e.getY() <= TITLE_HEIGHT) {
this.point = e.getPoint();
}
}

public void mouseDragged(MouseEvent e)
{
if (point != null) {
setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));

Point p = e.getPoint();
int dx = p.x - point.x;
int dy = p.y - point.y;

int x = getX();
int y = getY();
setLocation(x + dx, y + dy);
}
}

public void mouseReleased(MouseEvent e)
{
point = null;
setCursor(Cursor.getDefaultCursor());
}
}

public static void main(String[] args)
{
JFrame f = new UndecoratedFrame("Undecorated Frame");
f.getContentPane().add(new JLabel("Hello World!", JLabel.CENTER), BorderLayout.CENTER);
f.setSize(400, 400);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}

}
lEFTmOON 2005-07-21
  • 打赏
  • 举报
回复
第二个问题盼答啊盼答...
hifan 2005-07-21
  • 打赏
  • 举报
回复
getBounds()
???
lEFTmOON 2005-07-20
  • 打赏
  • 举报
回复
楼上的朋友,谢谢
第一个问题我已经查到了,frame必须在show()后才可以得到正确的数据(仍然万分感谢)

第二个问题盼答啊盼答...
gtlang78 2005-07-20
  • 打赏
  • 举报
回复
frame.getInsets();
lEFTmOON 2005-07-20
  • 打赏
  • 举报
回复
问题1
你没有弄懂我的意思,我不是想实现居中功能,我所指的客户区是指一个用户窗口,除去标题栏和边框的尺寸后的真正大小,比如说一个JFrame,如果你在paint(Graphics g)的时候是用(0,0)开始,你会发现你绘制的部分内容在标题栏的后面,也就是说,paint所实现的坐标是以窗口的坐标开始的,而我是想实现(0,0)正好在标题栏以下用户可以绘图的地方。
harbor1981 2005-07-20
  • 打赏
  • 举报
回复
1、客户区的真正大小?不懂。
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = frame.getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
frame.setVisible(true);

不是可以让frame居中吗?
2、还是不会,帮顶

62,614

社区成员

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

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