<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    TWaver - 專注UI技術(shù)

    http://twaver.servasoft.com/
    posts - 171, comments - 191, trackbacks - 0, articles - 2
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    做ERP或財(cái)務(wù)軟件的朋友知道,中國(guó)式的憑證錄入界面需要一些特殊的顯示效果:錄入金額的單元格要顯示一些數(shù)字分割線。估計(jì)這個(gè)風(fēng)格來(lái)自老式的手工記賬本,因?yàn)槲疫€隱約的記得當(dāng)年從生產(chǎn)隊(duì)倉(cāng)庫(kù)里面偷來(lái)的賬本就是這個(gè)樣子滴。為了繼續(xù)與“Swing很丑”的偏見(jiàn)做斗爭(zhēng),持續(xù)弘揚(yáng)Java的創(chuàng)新精神以及“除了老婆一切都可共享”的Share宗旨,這里特意用Swing寫了一個(gè)小例子,實(shí)現(xiàn)“中國(guó)式”的憑證錄入界面。

    這里面主要用到了Swing Table的Renderer和Editor這兩個(gè)機(jī)制,也是Swing比較有代表性的技術(shù),大家都不陌生。對(duì)于熟悉這個(gè)機(jī)制的童鞋來(lái)說(shuō),本文實(shí)在沒(méi)什么新意。這里也就不啰嗦廢話了,直奔主題,點(diǎn)到為止,然后上代碼。

    用下面代碼設(shè)置table一個(gè)列的renderer和editor:

    1table.getColumnModel().getColumn(2).setCellRenderer(new MoneyRenderer());
    2table.getColumnModel().getColumn(2).setCellEditor(new MoneyEditor());
    在renderer中,首先paint縱向的豎線,然后在paint正常的單元格內(nèi)容。
    1@Override
    2public void paintChildren(Graphics g) {
    3    Graphics2D g2d = (Graphics2D) g;
    4    painter.paint(this, g2d, null);
    5    super.paintComponent(g);
    6}
    其中,painter是一個(gè)封裝好的用來(lái)畫(huà)豎線的類。里面說(shuō)道:

     1public class LinePainter {
     2
     3    private Stroke normalStroke = new BasicStroke(1);
     4    private Stroke thickStroke = new BasicStroke(1);
     5    private Color normalColor = Color.lightGray;
     6    private Color tickColor = Color.cyan.darker();
     7    private Color decimalColor = Color.red;
     8
     9    public void paint(JComponent component, Graphics2D g, Color lineColor) {
    10        g.setColor(Color.gray);
    11        g.setFont(component.getFont());
    12        Rectangle2D bounds = g.getFontMetrics().getStringBounds("0", g);
    13        int unitWidth = (int) bounds.getWidth();
    14
    15        int x = component.getWidth();
    16        int rightGap = 0;
    17        if (component.getInsets() != null{
    18            rightGap = component.getInsets().right;
    19        }

    20        if (component.getBorder() != null{
    21            rightGap = rightGap + component.getBorder().getBorderInsets(component).right;
    22        }

    23        if (component instanceof JTextComponent) {
    24            JTextComponent textComponent = (JTextComponent) component;
    25            Insets insets = textComponent.getMargin();
    26            rightGap = rightGap + insets.right;
    27            rightGap = rightGap + 2;
    28        }

    29
    30        x = x - rightGap;
    31
    32        int index = 0;
    33        while (x > unitWidth * 2{
    34            x = x - unitWidth;
    35            if (index == 1{
    36                g.setStroke(thickStroke);
    37                g.setColor(decimalColor);
    38            }
     else {
    39                if ((index - 1% 3 == 0{
    40                    g.setColor(tickColor);
    41                }
     else {
    42                    g.setColor(normalColor);
    43                }

    44                g.setStroke(normalStroke);
    45            }

    46            g.drawLine(x, 0, x, component.getHeight());
    47            index++;
    48        }

    49        if (lineColor != null{
    50            g.setColor(lineColor);
    51            g.setStroke(this.normalStroke);
    52            g.drawLine(0, component.getHeight() - 1, component.getWidth(), component.getHeight() - 1);
    53        }

    54    }

    55}

    很簡(jiǎn)單,就一個(gè)paint函數(shù),畫(huà)縱向的彩條線而已。注意間距、字體等的考慮。

    為了在編輯期間也能顯示縱向線條,所以要定制editor,且重寫TextField的paint,先畫(huà)線條,再super正常的內(nèi)容paint:

    1@Override
    2public void paint(Graphics g) {
    3    Graphics2D g2d = (Graphics2D) g;
    4    painter.paint(this, g2d, Color.red);
    5    super.paint(g);
    6}

    這樣,整個(gè)程序就結(jié)束了。稍作修改,加上輸入格式檢查、匯率轉(zhuǎn)換等東西,相信可以很容易的用在你家的ERP或者財(cái)務(wù)軟件上。

    給幾個(gè)家庭作業(yè):
    1、這張憑證記錄了什么業(yè)務(wù)活動(dòng)的發(fā)生?
    2、為什么“庫(kù)存商品”一欄的金額在“借方”,而“銀行現(xiàn)金”一欄的金額在“貸方”?
    3、為什么“進(jìn)項(xiàng)稅額”的金額是17元?
    如果能隨口回答這幾個(gè)問(wèn)題,說(shuō)明你不僅僅是個(gè)優(yōu)秀的程序員,還是個(gè)優(yōu)秀的財(cái)務(wù);至少做個(gè)出納沒(méi)問(wèn)題!等咱寫不動(dòng)程序了,去工廠應(yīng)聘一下出納吧,沒(méi)準(zhǔn)能成!


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲av永久无码精品古装片| 亚洲熟伦熟女新五十路熟妇| 18gay台湾男同亚洲男同| yellow视频免费在线观看| 免费一级成人毛片| 一级特级女人18毛片免费视频| 啊灬啊灬别停啊灬用力啊免费看| 无码一区二区三区亚洲人妻| 在线观看国产情趣免费视频| 羞羞漫画页面免费入口欢迎你| 亚洲Av无码乱码在线观看性色| 一个人看的www免费在线视频| 伊人亚洲综合青草青草久热| 四虎永久免费影院| 添bbb免费观看高清视频| 亚洲精品成人a在线观看| 成人黄网站片免费视频 | 亚洲精品午夜无码专区| 成人无码WWW免费视频| 亚洲黄色网址在线观看| 免费a级毛片高清视频不卡| 亚洲av无码专区首页| 国产美女亚洲精品久久久综合| 国产成人精品无码免费看| 亚洲av无码片区一区二区三区| 日韩一级视频免费观看| 精品免费久久久久国产一区| 亚洲无删减国产精品一区| 成人精品综合免费视频| 好爽…又高潮了免费毛片| 黄色网页免费观看| 久久久久久亚洲AV无码专区| 毛片免费vip会员在线看| 又长又大又粗又硬3p免费视频| 亚洲精品天天影视综合网| 免费高清在线影片一区| 男人进去女人爽免费视频国产 | 国产亚洲视频在线播放大全| 亚洲欧洲美洲无码精品VA| 在线观看视频免费完整版| 久久久久免费视频|