`
pleasetojava
  • 浏览: 704379 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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

阅读更多

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

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 458.25pt; HEIGHT: 325.5pt" type="#_x0000_t75"><imagedata o:title="swing_after3" src="file:///C:%5CDOCUME~1%5Ckabini%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.png"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/kabini/swing_after3.PNG"></imagedata></shape>

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1031" style="WIDTH: 458.25pt; HEIGHT: 325.5pt" type="#_x0000_t75"><imagedata o:title="swing_after3" src="file:///C:%5CDOCUME~1%5Ckabini%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.png"></imagedata></shape>

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

<shape id="_x0000_i1032" style="WIDTH: 450pt; HEIGHT: 277.5pt" type="#_x0000_t75"><imagedata o:title="swing_after4" src="file:///C:%5CDOCUME~1%5Ckabini%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image003.png"><font size="3"></font></imagedata></shape>

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

<shape id="_x0000_i1025" style="WIDTH: 492.75pt; HEIGHT: 374.25pt" type="#_x0000_t75"><imagedata o:title="swing_after5" src="file:///C:%5CDOCUME~1%5Ckabini%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image005.png"><font size="3"></font></imagedata></shape>

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

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

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

<shape id="_x0000_i1026" style="WIDTH: 468pt; HEIGHT: 335.25pt" type="#_x0000_t75"><imagedata o:title="swing_after1" src="file:///C:%5CDOCUME~1%5Ckabini%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image007.png"><font size="3"></font></imagedata></shape>

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

<shape id="_x0000_i1027" style="WIDTH: 483.75pt; HEIGHT: 426.75pt" type="#_x0000_t75"><imagedata o:title="swing_after6" src="file:///C:%5CDOCUME~1%5Ckabini%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image009.png"><font face="Times New Roman" size="3"></font></imagedata></shape>

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

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

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

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

<shape id="_x0000_i1028" style="WIDTH: 431.25pt; HEIGHT: 182.25pt" type="#_x0000_t75" o:borderrightcolor="this" o:borderbottomcolor="this" o:borderleftcolor="this" o:bordertopcolor="this"><font size="3"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5Ckabini%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image011.png"></imagedata><bordertop type="single" width="4"></bordertop><borderleft type="single" width="4"></borderleft><borderbottom type="single" width="4"></borderbottom><borderright type="single" width="4"></borderright></font></shape>

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

3. JTable弹出右键菜单

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

<shape id="_x0000_i1029" style="WIDTH: 526.5pt; HEIGHT: 176.25pt" type="#_x0000_t75"><imagedata o:title="swing_after2" src="file:///C:%5CDOCUME~1%5Ckabini%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image013.png"><font size="3"></font></imagedata></shape>

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

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics