java编的窗口最上方的标题栏高度是多少?
java窗口的高度是不是连最上方不能放组件的标题栏(就是上头有最小化,最大化等按键和标题的那个,不知道是不是叫标题栏?)的高度也算在内了?觉得需要用坐标设置组件位置的时候...
java窗口的高度是不是连最上方不能放组件的标题栏(就是上头有最小化,最大化等按键和标题的那个,不知道是不是叫标题栏?)的高度也算在内了?
觉得需要用坐标设置组件位置的时候很不方便,不知道标题栏下方的可以放组件的部分高度是多少
有知道的大大帮忙告诉下谢谢了:-)
顺便告诉我是咋知道的~
谢谢你的回答
还想问下,如果窗口大小设定之后,怎么知道contentpane的高度数值?用getHeight()?
让组件在窗口内均匀分布的时候用窗体高度计算组件的具体位置的话,组件会超过窗体范围。我想通过得到contentpane的高度
来解决这个问题会不会比较方便。
或者你知道其它的解决办法?
*********************************************************
非常感谢~~但是你说的第二种解决方法还是不太理解呀-。-!
doLayout()怎么用?
计算组件位置的算式我都是作为参数传递给诸如setBounds()之类的函数的,如何用doLayout()回调?或者你的意思是让我自己建立一个LayoutManager?!是这样的话又如何建立?
本人菜鸟一只,还是希望大大详细说下~~谢谢了~~:-)
///////////////////////////////////////////////////////
我试过套一层JPanel后把layout设为null然后doLayout()是可以的。但是layout没有设为null的话好像不行~
如何“在LayoutManager调整之后再进行附加调整”? 展开
觉得需要用坐标设置组件位置的时候很不方便,不知道标题栏下方的可以放组件的部分高度是多少
有知道的大大帮忙告诉下谢谢了:-)
顺便告诉我是咋知道的~
谢谢你的回答
还想问下,如果窗口大小设定之后,怎么知道contentpane的高度数值?用getHeight()?
让组件在窗口内均匀分布的时候用窗体高度计算组件的具体位置的话,组件会超过窗体范围。我想通过得到contentpane的高度
来解决这个问题会不会比较方便。
或者你知道其它的解决办法?
*********************************************************
非常感谢~~但是你说的第二种解决方法还是不太理解呀-。-!
doLayout()怎么用?
计算组件位置的算式我都是作为参数传递给诸如setBounds()之类的函数的,如何用doLayout()回调?或者你的意思是让我自己建立一个LayoutManager?!是这样的话又如何建立?
本人菜鸟一只,还是希望大大详细说下~~谢谢了~~:-)
///////////////////////////////////////////////////////
我试过套一层JPanel后把layout设为null然后doLayout()是可以的。但是layout没有设为null的话好像不行~
如何“在LayoutManager调整之后再进行附加调整”? 展开
1个回答
展开全部
是的,最外面的window的大小是包括标题栏在内的,而且标题栏是native修饰的,高度不定。(windows下和linux下不同,windows xp和2000下都不同)
计算内粗散置子组件的位置不要用window作为相对坐标的参考系,用contentpane,就是Container.getContentPane()得到的那个,对于最外层window来说,这个就是剥掉外层修饰可以放子组件的最大范围了,就是最高不能高过contentpane的y,最左左不过contentpane的x。
补充:
由于对于一定的native的修饰,比如标题栏的高度之类是固定的,所以最外层window的size定下来后,contentpane理论上也是固定下来的。但是contentpane其实作为window的一个子组件,其size的计算不是在岩缓氏构造时候完成的,也就是下面这段code里得到的contentpane的size还是(0,0)
JFrame aFrame = new JFrame();
aFrame.setSize(100, 100);
Container contentPane = aFrame.getContentPane();
两种解决方法:
1 最常用的方法布局时利用各种现成的LayoutManager,而不推荐自己去从头写代码来计算内部组件的大小。(SUN的一些现成的一些LayoutManager已经基本可以满足要求,还有一些第三方的LayoutManager可以做进一步补充,自己也可以在其基础上重载定制,但实用中几乎没有必要)。这样只要告诉LayoutManager各个内部组件相对的位置和占有的大小比例关系即可。
2 非要自己来计算确切的位置大小也不是不可以,但除非所有组件的大小都由你来确定,此外一般不在构造的时候确定,原因就在于一开始的问题,window大小确定后,默认布局计算算法是lazy的,这是contentPane的大小还是0,直到必须计算的时候才确定。所以要确保自己写的计算位置和大小的代码也要在parent的布局计算完成后才能调用。比如哪腊计算contentPane里面子组件位置代码可以让其被contentPane的doLayout()回调。当然你一般不想重载contentPane,那么就在其里面直接套一层JPanel好了,重载该JPanel的doLayout(). 这种方法不推荐,不如把算法放在LayoutManager更能使得逻辑耦合度降低。
针对补充的再补充:方法一就是用LayoutManager,方法二就是对某个container整个跳过或在LayoutManager调整之后再进行附加调整,通过重载Container.doLayout()在该方法内直接通过计算setBounds。
关于"针对补充的再补充"的再三补充:重载JDK Container里的doLayout(),在该函数内,可以完全用自己的计算代码,也可以调用过super之后再用自己的算法调整,super就是调用默认LayoutManager(设成null就不动作)。所以super之后(不能在之前)的定制调整会是能够覆盖默认布局效果的。在Container里调整的是子componet。
不明白为何不用方法一中逻辑清晰的方法,非要折腾这个呢?
计算内粗散置子组件的位置不要用window作为相对坐标的参考系,用contentpane,就是Container.getContentPane()得到的那个,对于最外层window来说,这个就是剥掉外层修饰可以放子组件的最大范围了,就是最高不能高过contentpane的y,最左左不过contentpane的x。
补充:
由于对于一定的native的修饰,比如标题栏的高度之类是固定的,所以最外层window的size定下来后,contentpane理论上也是固定下来的。但是contentpane其实作为window的一个子组件,其size的计算不是在岩缓氏构造时候完成的,也就是下面这段code里得到的contentpane的size还是(0,0)
JFrame aFrame = new JFrame();
aFrame.setSize(100, 100);
Container contentPane = aFrame.getContentPane();
两种解决方法:
1 最常用的方法布局时利用各种现成的LayoutManager,而不推荐自己去从头写代码来计算内部组件的大小。(SUN的一些现成的一些LayoutManager已经基本可以满足要求,还有一些第三方的LayoutManager可以做进一步补充,自己也可以在其基础上重载定制,但实用中几乎没有必要)。这样只要告诉LayoutManager各个内部组件相对的位置和占有的大小比例关系即可。
2 非要自己来计算确切的位置大小也不是不可以,但除非所有组件的大小都由你来确定,此外一般不在构造的时候确定,原因就在于一开始的问题,window大小确定后,默认布局计算算法是lazy的,这是contentPane的大小还是0,直到必须计算的时候才确定。所以要确保自己写的计算位置和大小的代码也要在parent的布局计算完成后才能调用。比如哪腊计算contentPane里面子组件位置代码可以让其被contentPane的doLayout()回调。当然你一般不想重载contentPane,那么就在其里面直接套一层JPanel好了,重载该JPanel的doLayout(). 这种方法不推荐,不如把算法放在LayoutManager更能使得逻辑耦合度降低。
针对补充的再补充:方法一就是用LayoutManager,方法二就是对某个container整个跳过或在LayoutManager调整之后再进行附加调整,通过重载Container.doLayout()在该方法内直接通过计算setBounds。
关于"针对补充的再补充"的再三补充:重载JDK Container里的doLayout(),在该函数内,可以完全用自己的计算代码,也可以调用过super之后再用自己的算法调整,super就是调用默认LayoutManager(设成null就不动作)。所以super之后(不能在之前)的定制调整会是能够覆盖默认布局效果的。在Container里调整的是子componet。
不明白为何不用方法一中逻辑清晰的方法,非要折腾这个呢?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询