熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java Swing也驚艷之二:環環相套

2013-11-23 18:49:54  來源: Java核心技術 

  序言

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

  立體套管效果

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

  

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

   import javaawt*; 
import javaawtgeom*; 
import javaxswing*; 

import twaver*; 

public class PipleComponent extends JComponent { 

    public void paint(Graphics g) { 
        GraphicsD gd = (GraphicsD) g; 
        gdsetRenderingHint(RenderingHintsKEY_ANTIALIASING RenderingHintsVALUE_ANTIALIAS_ON); 
        Shape parentHollowShape=createPiple(gdTWaverUtilgetRandomColor()null); 
        createPiple(gdTWaverUtilgetRandomColor()parentHollowShape); 
        createPiple(gdTWaverUtilgetRandomColor()parentHollowShape); 
        createPiple(gdTWaverUtilgetRandomColor()parentHollowShape); 
        createPiple(gdTWaverUtilgetRandomColor()parentHollowShape); 
    } 

    private Shape createPiple(GraphicsD gdint x int y int width int heightColor colorShape parentHollowShape) { 
        if(parentHollowShape!=null){ 
            Rectangle bounds=parentHollowShapegetBounds(); 
            Rectangle rightClip=new Rectangle(boundsx+boundswidth/boundsyboundsheight); 
            Area clip=new Area(parentHollowShape); 
            clipadd(new Area(rightClip)); 
            gdsetClip(clip); 
        } 
        int circleWidth = height/
        GradientPaint paint = new GradientPaint(x 
                                                y 
                                                colorbrighter() 
                                                x 
                                                y + (int) (height * ) 
                                                colordarker() 
                                                true); 
        gdsetPaint(paint); 
        EllipseDDouble leftCircle = new EllipseDDouble(x  circleWidth /  y circleWidth height); 
        EllipseDDouble rightCircle = new EllipseDDouble(x + width  circleWidth /  y circleWidth height); 
        
        int thickness=
        EllipseDDouble rightHollowCircle = new EllipseDDouble(rightCirclegetX()+thickness 
            rightCirclegetY()+thickness 
            rightCirclegetWidth()thickness* 
            rightCirclegetHeight()thickness*); 
        
        Rectangle rect = new Rectangle(x y width height); 
        Area area = new Area(leftCircle); 
        areaadd(new Area(rect)); 
        areasubtract(new Area(rightCircle)); 
        gdfill(area); 
        gdsetColor(colordarker()); 
        gdfill(rightCircle); 
        
        paint = new GradientPaint(x 
                                  y 
                                  ColordarkGray 
                                  x 
                                  y + (int) (height * ) 
                                  ColorlightGray 
                                  true); 

        gdsetPaint(paint); 
        gdfill(rightHollowCircle); 
        
        gdsetClip(null); 
        
        return rightHollowCircle; 
    } 

    public static void main(String[] args) { 
        JFrame frame = new JFrame(); 
        framesetDefaultCloseOperation(JFrameEXIT_ON_CLOSE); 
        framesetSize( ); 
        frameadd(new PipleComponent()); 
        framesetVisible(true); 
    } 
}

  

  總結

  本文知識要點

  漸變填充創建GradientPaint並設置的填充模式

  使用Clip類似蒙版/剪切的JavaD技術看看Graphics的setClip函數即可

  Area的使用主要是Area的相交合並等幾個常見圖形處理手法詳細請看javaawtgeomArea類

  使用隨機色這個就太簡單了如果有twaverjar可以直接使用TWaverUtilgetRandomColor()如果沒有就直接new Color就行了注意使用第四個int參數增加Alpha透明度的變化

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

  

  參考資料

  l

  

  ~hall/java/l


From:http://tw.wingwit.com/Article/program/Java/hx/201311/25811.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.