接手项目时对方所提的需求,其实用javaweb来实现的话基本没有难度,但是要用Swing去实现这个功能,还是一件蛮棘手的事情,中间也遇到了好多衍生出来的问题,利用这篇博客做一个记录。
先上一张最后的效果图:
可以根据输入框中文字的改变生成不同的提示,并且可以用键盘进行选择。
实现这个功能所用到的基本组件是JTextFiled和JLIst。下面介绍一下遇到的问题与解决方案
问题一:如何让JLIst浮在整个JFrame的最上层
实际的开发过程得出结论:JLIst必须是整个Frame中最上层的组件,这样当它出现时才可以覆盖掉其他的组件而不是其他组件产生位移为其腾置空间。所用的方法是JLayeredPane。
JLayeredPane 为 JFC/Swing 容器添加了深度,允许组件在需要时互相重叠。Integer 对象指定容器中每个组件的深度,其中编号较高的组件位于其他组件之上。
DEFAULT_LAYER:Z_order的Layer数值为0,以整数对象Integer(0)来表示,一般我们加入的组件若没有标记是第几层,默认值就 把组件放在此Default Layer中。
PALETTE_LAYER:Z_order的Layer数值为100,以整数对象Integer(100)来表示,位于Default Layer之上,一般用于放置可移动的 工具栏(Floatable Toolbar).
MODAL_LAYER:Z_order的Layer数值为200,以整数对象Integer(200)来表示,位于PALETTE_LAYER之上,一般用于放置对话框 (Dialog Box).
POPUP_LAYER:Z_order的Layer数值为300,以整数对象Integer(300)来表示,位于MODAL_LAYER之上,一般用于快捷菜单(Poup Menu)与工具栏提示(Tool Tips)中.
DRAG_LAYER:Z_order的Layer数值为400,以整数对象Integer(400)来表示,位于POPUP_LAYER之上,一般用于拖曳组件使其在不同区域上.
问题二:如何准确地定位到所选择的JTextFiled
这个问题的产生源于po主的布局中采用流式布局,因此JTextFiled的坐标并不是相对固定的。但是在放置JList的时候setBounds函数是相对于父容器的坐标。第一张效果图中选中的JTextFiled放在多个嵌套的JPanel中,需要获取到此JTextFiled准确坐标点的方法如下:
private Point caculateTipBoxPoint() {
int x = 0;
int y = 0;
Container parent = textField;
while (parent != textField.getRootPane())