该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-08-28
insiku 写道 rehte 写道 glasspane无法阻止键盘事件,是因为键盘事件是直接发送到当前焦点组件上的。glasspane一般是jpanel或者其他非focusable的容器,因此它们无法获得焦点。但是你可以通过设置glasspane为focusable,然后通过调用requestfocus来获得焦点,然后应该就可以屏蔽键盘事件了。
JComponent glass = ...; glass.setVisible(true); glass.addMouseLis...; glass.addKeyLi...; glass.setFocusable(true); glass.requestFocus(); 需要注意的是上面的代码中glass的setVisible(true)必须在glass.setFocusable和glass.requestFocus之前,否则glass无法获得焦点,也就无法拦截键盘事件。 键盘事件直接发送到当前焦点组件上 如果不在事件派发上做动作 那只能使被阻止的组件获得焦点 glasspane获得焦点以后 要设置InputVerifier 避免使用tab切换焦点 终于明白最疑惑的东西,得学习下键盘焦点管理啦,呵呵,谢谢两位 |
|
返回顶楼 | |
发表时间:2008-08-28
insiku 写道 我收回我昨天说的话
不管是在glasspane上 还是 在JLayeredPane.POPUP_LAYER 上做文章 都可以实现 blocking 键盘事件无法阻止 可能是blocking pane 无法获得焦点导致 另外要注意的是 tab切换焦点 blocking pane 要加上InputVerifier 保持焦点 不过这种方式 会把这个顶层窗体都blocking掉 如果想block单独的组件 那可能需要组件继承JRootPane 不过swing的设计太强大了 应该还有其他办法 比如说blocking pane中添加鼠标和键盘的监听 根据鼠标位置判断是否需要consume事件 不过这种方式会使用户迷糊 鼠标的变化不够明显 用户会迷惑为什么不能输入 to insiku consume方法有什么用处? 假设btn位于组件树的第5层上,我们也在btn上加了MouseListener事件(不是ActionListener)。难道我们还能在事件到达第5层的btn前,就把这个事件得到,然后把这个事件作废? 问题是: 1、除了通过btn,我们无法得到此事件,既然得不到,当然更不能consume啦 2、假设我们得到了此事件,调用consume方法有什么用呢?难道调用了此方法后,事件就不会继续向下层组件传递了吗? 在jdk文档中,这么解释consumed的作用“在源处理了事件之后,控制是否将事件发送回同位体,false 表示将事件发送给同位体;true 则不发送。语义事件始终具有 'true' 值,因为它们由响应低级别事件的同位体生成。 ” 看粗体部分在源处理了事件之后,既然是这样,那还是说明事件有源来处理,即由btn来处理的啊? consume到底是干什么的方法??? |
|
返回顶楼 | |
发表时间:2008-09-04
有没有Java Swing开发桌面宠物的例子或思路之类的??
|
|
返回顶楼 | |
发表时间:2008-09-05
有一段时间没来了!看到这个项目不断的发展,真的很开心!
|
|
返回顶楼 | |
发表时间:2008-09-24
swing还是太麻烦啊,前段时间我碰到个问题,JList的阻止行焦点改变问题,当我点击另一个选项的时候,先判断是否允许,因为可能做一些保存工作,弹出一个对话框如选择取消,则行焦点应该仍然保存住,我没找到一个好办法既保持住焦点也不触发itemChanged事件。有一个阻止焦点改变的事件就好了,PB就有,听说C++也有。有人说用PropertyListener,好像叫这个名字,但没找到相关的例子,
|
|
返回顶楼 | |
发表时间:2008-09-24
fxbird 写道 swing还是太麻烦啊,前段时间我碰到个问题,JList的阻止行焦点改变问题,当我点击另一个选项的时候,先判断是否允许,因为可能做一些保存工作,弹出一个对话框如选择取消,则行焦点应该仍然保存住,我没找到一个好办法既保持住焦点也不触发itemChanged事件。有一个阻止焦点改变的事件就好了,PB就有,听说C++也有。有人说用PropertyListener,好像叫这个名字,但没找到相关的例子,
没有做不到 只有你想不到 swing的灵活性怎么是PB和C++能比的? public class Test9 { public static void main(String[] args) { final JFrame f = new JFrame(); JList list = new JList(new String[]{"1","2","3","4","5","6","7","8","9","10"}){ @Override public int locationToIndex(Point location) { int selectedIndex = getSelectedIndex(); int option = JOptionPane.showConfirmDialog(f, "Are you sure select this?", "Confirm", JOptionPane.YES_NO_OPTION); if(option == JOptionPane.YES_OPTION) return super.locationToIndex(location); else return selectedIndex; } }; f.add(new JScrollPane(list)); f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); f.setSize(300, 500); f.setVisible(true); } } |
|
返回顶楼 | |
发表时间:2008-10-16
实现一个菜单设计器不是太容易,忙了很久才把菜单设计器搞定,打算从此之后不再添加大的功能。下面是新的菜单设计器的设计示意图,欢迎大家去http://code.google.com/p/visualswing4eclipse/下载试用:
|
|
返回顶楼 | |
发表时间:2008-10-29
楼主的博客拜读了很久,收获不小。其实我觉得既然用了 eclpise,那楼主为什么不为 eclipse 设计一个 swt 的界面设计器?eclipse 的软肋就在界面设计上,到现在都没有一个好用的工具。虽然现在 eclipse 在国内还是比较流行,但最近随着 javafx 的出现,以后很难说 swt 还有什么比较好的发展,迟迟也没有看到 eclipse swt 项目对 swt 的一些更新,swt 4 据说会支持 wpf 什么的,但在非 windows 平台上怎么办?而且始终无法实现直接在浏览器上的插件或者 applet 支持,这是 swt 比 swing 差的一个地方。最近在网上也找到了一个叫 vx30 的公司,设计了一款纯 java 实现的流媒体视频解决方案,在客户端上直接通过 applet 的方式实现视频播放,不需要 jmf,不需要其他额外的二进制 native 解码库,当然,视频音频格式好像是他们自己开发的,但完全通过在客户端浏览器上的 applet 内部采用纯 java 代码进行视频和音频 decode 并回放就可以了,大家可以访问 http://www.mauionline.com/cgi-bin/WebObjects/MauiOnline.woa/wa/videoShowcase 这个旅游网站,就是采用这个技术的,很有趣,另外也听说国外有公司已经采用纯 java 以及 swing 开发出了 h.264 解码器了。swt 在图形渲染上已经落后太多了,draw2d 目前始终还是通过操作系统的 gc 方式来渲染,始终都没有类似 java2d 的解决方案?java2d 现在在 windows 上采用 direct3d 9 或者 opengl 的 pipeline 来实现 2d 图形的硬件加速渲染,在 linux 等平台上则是采用 opengl,swt 呢?至于 3d 方面,swing 有 java3d(现在已开源并更新了)、jogl 等等厉害角色支持,swt 好像还是在依靠 swt_awt 桥接方式简单利用一下 jogl 吧?国外网上开始大量出现基于 java applet 的 3d 网络游戏,swt 在这方面有什么打算?
|
|
返回顶楼 | |
发表时间:2008-10-30
楼主,你的这个工具Linux下能不能用啊?
|
|
返回顶楼 | |
发表时间:2008-10-30
qinglangee 写道 楼主,你的这个工具Linux下能不能用啊?
这款工具是纯Java代码的,理论上应该能在Linux上面运行。但是由于采用了SWT_AWT技术,SWT_AWT工作的并不是稳定,尤其设计焦点传送等问题,开发时也只测试了在Windows平台的,因此不能保证在Linux上的运行质量。 刚才在Linux测试了一下,发现有一些小毛病,但总的来看还能使用。以后会修改让它能运行在Linux上的。 下图是在Linux上运行的效果图 |
|
返回顶楼 | |