java Swing模仿百度搜索功能的实现

本文记录使用Java Swing实现类似百度搜索功能的过程,包括如何让JList浮在最上层、定位JTextFiled、监听文字变化及键盘选择。通过JLayeredPane处理组件重叠,使用DocumentListener监听文本变化,KeyListener实现键盘选择。自定义TipBox类并引入CondicateStrategy接口以提高代码复用性。
摘要由CSDN通过智能技术生成

接手项目时对方所提的需求,其实用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()) 
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值