JAVA 如何计算JFrame窗口的厚度

在JAVA GUI编程中,当在JFrame中添加JPanel并处理鼠标事件时,会遇到坐标不一致的问题,因为JPanel和JFrame的坐标系统不同。解决方法是计算并扣除JFrame的边框厚度,包括标题栏的高度和窗口四周的厚度。通过示例代码,展示了如何获取这些尺寸,以确保准确处理鼠标点击事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在创建JFrame对象的过程中,如果我们往Container容器里添加一个JPanel容器会发现,使用EventQueue异步事件指派机制来保存事件然后再用AWTEvent来获取事件时,由于AWTEvent是所有 AWT 事件的根事件类,那么在保存MouseEvent的时候将AWTEvent强制转换成MouseEvent就会发生问题,由于AWTEvent获取鼠标事件时时以JFrame为标准,在转换后会造成坐标的不一致,实验证明是因为JPanel的坐标和JFrame坐标的不一致产生的,所以我们必须知道JFrame窗口的厚度大小方便我们进行处理。

举个栗子:

某年JAVA计算机二级考试题:
创建一个窗口,窗口的按钮按下后在窗口里通过点击鼠标左键分别定义两点画出一条直线。
代码如下:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Demo01 {
	public static void main(String[] args) {
		@SuppressWarnings("unused")
		JFrame frame = new myFrame();
	}
}
@SuppressWarnings("serial")
class myJPanel extends JPanel implements ActionListener{
	myJPanel(){
		JButton button = new JButton("Draw lint");
		add(button);
		button.addActionListener(this);		
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		Graphics g = getGraphics();
		Point p = this.getClick();
		g.drawOval(p.x-2, p.y-2, 4, 4);
		Point q = getClick();
		g.drawOval(q.x-2, q.y-2, 4, 4);
		g.drawLine(p.x, p.y, q.x, q.y);
		g.dispose();
	}
	
	public Point getClick() {  
		EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue();
		
		while(true) {
			try {
				AWTEvent evt = eq.getNextEvent();   
				if(evt.getID()==MouseEvent.MOUSE_PRESSED) {  
					MouseEvent mevt = (MouseEvent) evt;  
					Point p = mevt.getPoint();           
					//Point top = this.getRootPane().getLocation();  			
					//p.x -= top.x; 
					//p.y -= top.y;  
					return p;
				}
			}catch(InterruptedException e) {}
		}
	}
}
@SuppressWarnings("serial")
class myFrame extends JFrame{
		 myFrame(){
			setTitle("java");
			setSize(300,200);
			addWindowListener(new WindowAdapter(){
				@SuppressWarnings("unused")
				public void windwoClosing(WindowEvent e) {
					System.exit(0);
				}
			});
			Container containerPane = getContentPane();	
			containerPane.add(new myJPanel());
			this.setVisible(true);
		}
	}

我们不难发现,如果我们注释掉getClick的三条语句,那么获取的坐标就会发生异常,所以我们只能在x轴和y轴上减去窗口框的厚度,就能解决问题。下面的代码可以算出左右下边框和标题栏的厚度。

public class Demo {
	public static void main(String[] args) {
		// 初始化参数
	    int width = 500;
	    int height = 200;
	 
	    // 实例化窗体
	    JFrame window = new JFrame();
	 
	    // 设置窗体大小
	    window.setSize(width, height);
	    // 点击关闭窗口强制关闭
	    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    // 显示窗体
	    window.setVisible(true);
	    
	    // 获取标题栏高度
	    System.out.println("标题栏高度:"+window.getInsets().top);
	    // 获取窗口框左右厚度
	    System.out.println("窗口框左右厚度为:"+(window.getWidth()-window.getContentPane().getWidth())/2);
	    // 获取窗口框底部厚度
	    System.out.println("窗口框底部厚度为:"+(window.getHeight()-window.getContentPane().getHeight()-window.getInsets().top));
	}
}

输出结果
标题栏高度:31
窗口框左右厚度为:8
窗口框底部厚度为:8

结果和Demo01所注释掉的top的xy一致。

内容概要:本文档主要展示了C语言中关于字符串处理、指针操作以及动态内存分配的相关代码示例。首先介绍了如何实现键值对(“key=value”)字符串的解析,包括去除多余空格和根据键获取对应值的功能,并提供了相应的测试用例。接着演示了从给定字符串中分离出奇偶位置字符的方法,并将结果分别存储到两个不同的缓冲区中。此外,还探讨了常量(const)修饰符在变量和指针中的应用规则,解释了不同类型指针的区别及其使用场景。最后,详细讲解了如何动态分配二维字符数组,并实现了对这类数组的排序与释放操作。 适合人群:具有C语言基础的程序员或计算机科学相关专业的学生,尤其是那些希望深入理解字符串处理、指针操作以及动态内存管理机制的学习者。 使用场景及目标:①掌握如何高效地解析键值对字符串并去除其中的空白字符;②学会编写能够正确处理奇偶索引字符的函数;③理解const修饰符的作用范围及其对程序逻辑的影响;④熟悉动态分配二维字符数组的技术,并能对其进行有效的排序和清理。 阅读建议:由于本资源涉及较多底层概念和技术细节,建议读者先复习C语言基础知识,特别是指针和内存管理部分。在学习过程中,可以尝试动手编写类似的代码片段,以便更好地理解和掌握文中所介绍的各种技巧。同时,注意观察代码注释,它们对于理解复杂逻辑非常有帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值