Java实用经验总结--Swing篇 (续)

来源:互联网 发布:网络本科考研歧视 编辑:程序博客网 时间:2024/06/15 05:23

Java经验总结-Swing()

 

前言:本文是上一篇同名文章的续篇,写作动机是那个让我做欠款管理系统的客户这几天又让我改程序,于是又出现一些让人死不少脑细胞的小问题,为了纪念我光荣牺牲的脑细胞,作此文以记之J。需要说明的是,本文将是“Java经验总结—Swing”的最终篇,以后如果我碰到新的有趣又实用的技巧,我会及时添加到本页中,而不再另开一篇,以免我的Blog里都是“Java经验总结—Swing(续续续续….J。最后要说的是,由于本人写作纯属业余爱好,写作动力来完全源于兴趣和写作热情。但有些不厚道的哥们把我的文章直接贴到自己的Blog里面,连个转载标志和出处都不加,这种事虽然在Web上已经司空见惯,但也极大影响了我的写作热情。曾经就发生过有人将我花一周多时间翻译的超过2万字的《JasperReport 1.0 用户手册》原封不动贴到自己Blog上的情况而未加任何说明,我十分气愤甚至一度终止了写作的念头。所以,做人要厚道一点才好啊。

 

1.   JEditorPane显示细线表格

1.1. 无效的边框设置法

JEditorPaneSwing为我们提供的一个简单的显示格式化页面的组件。它支持HTML语法,能够获取URL连接事件,支持简单的CSS….,我们甚至可以用它来制作一个简单的Web浏览器。但是一如我在上一篇文章中介绍的那样,JEditorPane对于表格边框的处理还是存在一定的问题,即使在html代码里面写入设置边框为1border=1 cellspace=0)所得到的边框十分粗,甚是难看L

但如果将这个页面导出成HTML文件,再用IE打开,效果就会好很多。

但是别高兴太早,这只是表面现象。我们察看IE的打印预览地时候,就会发现表格的边框依然很粗。

这种程度的表格拿出去会让人笑话的,要不是这个表格过于复杂且人家催的紧,我用JasperReport能弄出比这个漂亮10倍的表格。但是工期不等人,只能另想办法了。于是google了一下,发现了一个比较好的方法。

1.2. 有局限性的背景设置法

这个方法的原理很简单,就是让将表格的背景色设为黑色,然后再令cellspace=1,如此一来表格单元之间的边距就可以当成表格框来用,效果很不错的。

于是满心欢喜,以为这下子可算完事了,但是鬼使神差的我又把这个页面导出成HTML,然后用IE打开,在打印预览下却发现……

边框都消失不见了!!!难道IE打印的时候不显示背景色吗?答案看来是肯定的,连我在表格标题栏上设置的CSS也同样无效,只留下一个蓝色的框,真是无奈啊。于是只能不提供导出成HTML的功能。如果哪位仁兄有更好的解决方案,能让JEditorPane表格显示细线,且在IE打印预览下也能正常显示,请给我留言,感激不尽。

2.   横向打印JEditorPane的显示内容

要想打印JEditorPane的内容很简单,只需要调用JEditorPane.print()就可以了。如果想要调整页眉页脚,边距,打印方向这些细节问题,就需要麻烦一点的步骤。老实说,用JavaAPI来进行打印工作实在是一件很繁琐的工作,而且一个控制不好就会连累整个输出效果。真怀念使用JasperReport的日子啊。

 

不过幸好客户只需要我将程序的打印方向变成“横向打印”,这似乎不太难。我的解决方法如下:

其中的detailInfoTxt就是一个JEditorPane,具体方法是将PrinterJob中的缺省PageFormat的打印方向属性替换成我们想要的打印方向,然后再利用PrinterJob.setPrintable()进行设置就好了。值得注意的是JEditorPane本身并未实现Printable接口,所以我们必须通过JEditorPane.getPrintable()方法来获得一个与某个JEditorPane相对应的该接口的实例。

3.   JTable弹出右键菜单

在我的程序中,用户要求在付款表格的不同月份可以看到详细的付款信息。我曾经想过用JToolTip,但后来觉得它的起始显示时间和显示持续时间不好设定,如果设定不好的话可能会影响用户的使用体验。于是决定让JTable弹出右键菜单的方式来显示所需的内容。

图中可以很清楚地看到我当前选择的行就是当前行,而列是6月份所在的列。然而在JTable上显示弹出菜单的关键问题在于定位。我们需要确定用户右键单击JTable的时候鼠标所在的行列值各是多少。由于JTable并未给我们提供这样的功能,所以我们只能自己根据鼠标当前位置来计算鼠标所在的行列值。在没有任何辅助信息的情况下,还要正确显示鼠标所指向的单元格,可以说这是一件不可能完成的任务。因为每一行的高度和每一列的宽度都可能是不一样的,所以只有假设每一行都有相同高度的情况下我们才能确定是哪一行,同理,只有假设列都有相同宽度,我们才能根据鼠标目前所在的位置来算出鼠标具体正在指向哪一列。在我的程序中,由于列的不是固定的,而行的高度是固定的,所以我只能采用前一种假设来确定用户正在点的是哪一行。很明显,这不能解决列的问题,所以如果谁有好方法可以留言。

我采用了一个不是方法的方法,就是让用户先左键点击所要查看内容的单元格,然后再点右键弹出菜单。通过左键的点击我就可以完整的确定鼠标所指向的单元格,也就可以轻松取得所选单元格力的数据了。这办法虽然不是好办法,但谁让他催得紧呢,所以他也只能忍了J




原创粉丝点击