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

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

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

    細心!用心!耐心!

    吾非文人,乃市井一俗人也,讀百卷書,跨江河千里,故申城一游; 一兩滴辛酸,三四年學業(yè),五六點粗墨,七八筆買賣,九十道人情。

    BlogJava 聯(lián)系 聚合 管理
      1 Posts :: 196 Stories :: 10 Comments :: 0 Trackbacks
    在Java Swing中的JTextArea元件預設並沒有捲軸,因為設計人員認為捲軸的功能並不是一定需要的,而決定讓程式人員可以動態(tài)選擇是否增加捲軸功能,捲軸的功能是由JScrollPane元件提供,如果您要加入一個具有捲軸功能的JTextArea,您可以如下進行設計:
    JTextArea textArea = new JTextArea();
    JScrollPane scrollPane = new JScrollPane(textArea);
     
    JScrollPane對JTextArea即是個容器,而它對JFrame來說又是個元件,可以如下這般將之加入JFrame中:
    getContentPane().add(scrollPane);
     
    像這樣動態(tài)的為JTextArea加入功能的方法,我們可以使用Decorator模式來組織結(jié)構(gòu),您可以動態(tài)的為一個物件加入一些功能(像是為 JTextArea加上捲軸),而又不用修改JTextArea的功能。對JTextArea來說,JScrollPane就好像是一個捲軸外框,直接套在JTextArea上作裝飾,就好比您在照片上加上一個相框的意思。

    先以上面這個例子來說明Decorator模式的一個實例:
    Decorator

    如上圖所示的,無論是TextView或是Decorator類別,它們都是VisualComponent的一個子類,也就是說它們都是一個可視元件,而Decorator類又聚合了VisualComponent,所以又可以當作TextView容器,ScrollDecorator類別實作了 Decorator類,它可能是這樣設計的:
    public abstract class Decorator extends VisualComponent {
        protected VisualComponent component;

        public Decorator(VisualComponent component) {
            this.component = component;
        }

        public void draw() {
            component.draw();
        }
    }

    public class ScrollDecorator extends Decorator {
        public ScrollDecorator(VisualComponent component) {
            super(component);
        }

        public void draw() {
            super.draw();
            scrollTo();
        }

        public void scrollTo() {
            // ....
        }
    }
     
    要將新功能套用至TextView上,可以這樣設計:
    ScrollDecorator scrollDecorator =
                        new ScrollDecorator(new TextView());
     
    super.draw()會先呼叫component也就是TextView物件的draw()方法先繪製TextView,然後再進行 ScrollPanel的scrollTo(),也就是捲動的方法。在圖中也表示了一個BorderDecorator,它可能是這樣設計的:
    public class BorderDecorator extends Decorator {
        public BorderDecorator(VisualComponent component) {
            super(component);
        }

        public void draw() {
            super.draw();
            drawBorder();
        }

        public void drawBorder() {
            // ....
        }
    }
     
    要將ScrollDecorator與BorderDecorator加至TextView上,我們可以這樣設計:
    BorderDecorator borderDecorator =
             new BorderDecorator(
                   new ScrollDecorator(new TextView()));

    所以當BorderDecorator調(diào)用draw()方法時,它會先調(diào)用ScrollDecorator的draw()方法,而 ScrollDecorator的draw()方法又會先調(diào)用TextView的draw()方法,所以繪製的順序變成:
    TextDraw.draw();
    ScrollDecorator.scrollTo();
    BorderDecorator.drawBorder();

    下圖為物件之間的調(diào)用關係:
    Decorator

    Decorator模式的 UML 結(jié)構(gòu)圖如下所示:
    Decorator

    在Gof的書中指出另一個範例,它設計一個Stream抽象類,而有一個StreamDecorator類,Stream的子類有處理記憶體串流的 MemoryStream與FileStream,有各種方法可以處理串流,也許只是單純的處理字元,也許會進行壓縮,也許會進行字元轉(zhuǎn)換,最基本的處理可能是處理字元,而字元壓縮被視為額外的功能,這個時候我們可以使用裝飾模式,在需要的時候為Stream物件加上必要的功能,事實上在java.io中的許多輸入輸出物件,就是採取這樣的設計。
    posted on 2007-04-17 10:44 張金鵬 閱讀(342) 評論(0)  編輯  收藏 所屬分類: Structural 模式
    主站蜘蛛池模板: 一级黄色免费大片| 亚洲日韩久久综合中文字幕| 亚洲精品无码专区久久同性男| 日本免费人成黄页在线观看视频 | 中文字幕在线视频免费| 免费人成在线观看播放a| 久久大香香蕉国产免费网站 | 老司机午夜精品视频在线观看免费| 中文字幕视频免费在线观看 | 国产四虎免费精品视频| 全免费A级毛片免费看网站| 国产伦精品一区二区三区免费迷| 中文字幕亚洲不卡在线亚瑟| 久久精品国产亚洲AV无码偷窥| 亚洲精品无码中文久久字幕| 永久免费毛片手机版在线看| 添bbb免费观看高清视频| 亚洲日韩国产精品乱| 天天爽亚洲中文字幕| 一个人免费观看日本www视频| 亚洲综合网站色欲色欲| 亚洲综合一区二区三区四区五区| 国产黄色片免费看| 一个人免费高清在线观看| AV在线亚洲男人的天堂| 国产精品免费观看调教网| 中文字幕亚洲男人的天堂网络 | 亚洲另类少妇17p| 日韩视频在线观看免费| 久久精品国产亚洲av麻豆蜜芽 | 亚洲AV中文无码乱人伦下载 | 久久久高清日本道免费观看| 亚洲色欲色欲www| 亚洲精品一级无码鲁丝片| 久久免费视频观看| 亚洲一级特黄大片无码毛片| 无码av免费网站| 亚洲AV永久纯肉无码精品动漫| 91麻豆最新在线人成免费观看 | 嘿嘿嘿视频免费网站在线观看| 亚洲爆乳精品无码一区二区|