Swing


          天行健 君子以自強不息

          posts - 69, comments - 215, trackbacks - 0, articles - 16
             :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          JavaSwing也驚艷之二:環環相套

          Posted on 2009-03-03 22:22 zht 閱讀(3021) 評論(10)  編輯  收藏 所屬分類: Swing

          一、序言

          關于“Java做不好桌面”的爭論已經由來已久。雖然Swing和Java2D已經有超過十年的歷史,也有JIDE、JGoodies、TWaver等不少開源Swing組件,但是用Java做桌面程序仍然不是一件輕松的事。本《Java也驚艷》系列文章,就是想通過一些簡單生動的例子,和大家一起認識Java、探索Swing。其實你只需要多一點創意、多一點耐心,你的Java程序也可以“驚艷”!本文就帶您一起進入Java的驚艷之旅。

          二、立體套管效果

          在網絡通訊中,經常要表達協議之間的“承載”關系。例如,IP協議作為高層協議可以承載在SDH上,也可以承載在ATM協議上。同樣,IP作為協議還可以承載更多的高層協議,例如Voice over IP,甚至電信中Everything over IP的概念。在表現上,用相互嵌套的立體套管來表現協議的“承載”是再合適不過了(如下圖)。



          具體實現很簡單,主要代碼如下:

          import java.awt.*
          import java.awt.geom.*

          import javax.swing.*


          import twaver.*


          public class PipleComponent extends
           JComponent { 

              
          public void
           paint(Graphics g) { 
                  Graphics2D g2d 
          =
           (Graphics2D) g; 
                  g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
                  Shape parentHollowShape
          =createPiple(g2d,100,100,200,200,TWaverUtil.getRandomColor(),null
          ); 
                  createPiple(g2d,
          120,120,280,40
          ,TWaverUtil.getRandomColor(),parentHollowShape); 
                  createPiple(g2d,
          130,170,310,40
          ,TWaverUtil.getRandomColor(),parentHollowShape); 
                  createPiple(g2d,
          140,220,290,50
          ,TWaverUtil.getRandomColor(),parentHollowShape); 
                  createPiple(g2d,
          130,190,300,30
          ,TWaverUtil.getRandomColor(),parentHollowShape); 
              } 

              
          private Shape createPiple(Graphics2D g2d,int x, int y, int width, int
           height,Color color,Shape parentHollowShape) { 
                  
          if(parentHollowShape!=null
          ){ 
                      Rectangle bounds
          =
          parentHollowShape.getBounds(); 
                      Rectangle rightClip
          =new Rectangle(bounds.x+bounds.width/2,bounds.y,3000
          ,bounds.height); 
                      Area clip
          =new
           Area(parentHollowShape); 
                      clip.add(
          new
           Area(rightClip)); 
                      g2d.setClip(clip); 
                  } 
                  
          int circleWidth = height/3

                  GradientPaint paint 
          = new
           GradientPaint(x, 
                                                          y, 
                                                          color.brighter(), 
                                                          x, 
                                                          y 
          + (int) (height * 0.65
          ), 
                                                          color.darker(), 
                                                          
          true
          ); 
                  g2d.setPaint(paint); 
                  Ellipse2D.Double leftCircle 
          = new Ellipse2D.Double(x - circleWidth / 2
          , y, circleWidth, height); 
                  Ellipse2D.Double rightCircle 
          = new Ellipse2D.Double(x + width - circleWidth / 2
          , y, circleWidth, height); 
                  
                  
          int thickness=4

                  Ellipse2D.Double rightHollowCircle 
          = new Ellipse2D.Double(rightCircle.getX()+
          thickness, 
                      rightCircle.getY()
          +
          thickness, 
                      rightCircle.getWidth()
          -thickness*2

                      rightCircle.getHeight()
          -thickness*2
          ); 
                  
                  Rectangle rect 
          = new
           Rectangle(x, y, width, height); 
                  Area area 
          = new
           Area(leftCircle); 
                  area.add(
          new
           Area(rect)); 
                  area.subtract(
          new
           Area(rightCircle)); 
                  g2d.fill(area); 
                  g2d.setColor(color.darker()); 
                  g2d.fill(rightCircle); 
                  
                  paint 
          = new
           GradientPaint(x, 
                                            y, 
                                            Color.darkGray, 
                                            x, 
                                            y 
          + (int) (height * 0.4
          ), 
                                            Color.lightGray, 
                                            
          true
          ); 

                  g2d.setPaint(paint); 
                  g2d.fill(rightHollowCircle); 
                  
                  g2d.setClip(
          null
          ); 
                  
                  
          return
           rightHollowCircle; 
              } 

              
          public static void
           main(String[] args) { 
                  JFrame frame 
          = new
           JFrame(); 
                  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
                  frame.setSize(
          800600
          ); 
                  frame.add(
          new
           PipleComponent()); 
                  frame.setVisible(
          true
          ); 
              } 
          }

          三、總結

          本文知識要點:
          ? 漸變填充:創建GradientPaint并設置“亮-暗-亮”的填充模式;
          ? 使用Clip:類似蒙版/剪切的Java2D技術。看看Graphics的setClip函數即可;
          ? Area的使用:主要是Area的相交、合并等幾個常見圖形處理手法。詳細請看java.awt.geom.Area類;
          ? 使用隨機色:這個就太簡單了,如果有twaver.jar,可以直接使用TWaverUtil.getRandomColor();如果沒有,就直接new Color就行了,注意使用第四個int參數增加Alpha透明度的變化;

          如果大家感興趣,可以嘗試用上述Java2D技巧實現下圖效果:


           

          六、參考資料

          http://java.sun.com/j2se/1.4.2/docs/guide/2d/spec/j2d-bookTOC.html

          http://java.sun.com/j2se/1.4.2/docs/guide/2d/spec.html

          http://www.apl.jhu.edu/~hall/java/Java2D-Tutorial.html

          主站蜘蛛池模板: 上犹县| 涞源县| 绥宁县| 察隅县| 永安市| 泽普县| 吉安县| 合作市| 浮山县| 五原县| 施秉县| 正安县| 卓尼县| 庄河市| 周口市| 祁门县| 五华县| 汝阳县| 蒙城县| 平利县| 临高县| 晋宁县| 兴化市| 饶河县| 巴南区| 建宁县| 田东县| 陈巴尔虎旗| 海淀区| 菏泽市| 和硕县| 慈溪市| 珠海市| 马边| 平定县| 云林县| 平凉市| 南皮县| 彰化县| 晋宁县| 黄山市|