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

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

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

    Swing


    天行健 君子以自強不息

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

    InternalFrame使用示例一

    Posted on 2008-05-21 14:41 zht 閱讀(1623) 評論(0)  編輯  收藏

     

    首先說一下JFrame組件的構成,JFrame有一個唯一的子容器JRootPane,
    一下是api中關于JRootPane的注解
    JRootpane 由一個 glassPane 和一個可選的 menuBar 以及一個 contentPane 組成。(JLayeredPane 負責管理 menuBarcontentPane。)glassPane 位于所有窗格之上,以便能夠截取鼠標移動。由于 glassPane(與 contentPane 類似)可以是一個任意的組件,也可以設置 glassPane 來進行繪制。這樣 glassPane 上的線條和圖像可涵蓋其下的窗體,不受其邊界的限制。

    盡管 menuBar 組件為可選,但 layeredPanecontentPaneglassPane 總是存在的。試圖將它們設置為 null 將生成異常。

    要將組件添加到 JRootPane(可選的菜單欄除外),您可以將對象添加到 JRootPanecontentPane,如下所示:

           rootPane.getContentPane().add(child);
    

    可用同樣的方法設置布局管理器、移除組件以及列出子級等。所有這些方法都是在 contentPane 上而不是 JRootPane 上調用的。

    注:contentPane 的默認布局管理器是 BorderLayout 管理器。但是,JRootPane 使用一個自定義的 LayoutManager。所以,如果您希望更改已添加到 JRootPane 中的組件的布局管理器,一定要確保使用如下代碼:
        rootPane.getContentPane().setLayout(new BoxLayout());
    

    如果已在 JRootPane 上設置了 JMenuBar 組件,它將沿窗體的上邊緣放置。contentPane 的位置和大小將進行調整以填充剩余的區域。(JMenuBarcontentPane 被添加到位于 JLayeredPane.FRAME_CONTENT_LAYER 層的 layeredPane 組件中。)

    layeredPaneJRootPane 中所有子級的父級,既是菜單的直接父級,又是添加到 contentPane 中的所有組件的祖父級。它是 JLayeredPane 的實例,提供在若干層上添加組件的能力。在處理彈出菜單、對話框以及拖動時,即要求將組件置于窗格中所有其它組件之上的情況下,此功能非常有用。

    glassPane 位于 JRootPane 中所有其它組件之上。這為在所有其它組件上繪圖和截取鼠標事件提供了方便,這對拖動和繪圖都非常有用。開發人員可在 glassPane 上使用 setVisible 控制 glassPane 在所有其它子級上面顯示的時間。默認情況下,glassPane 為不可見。

    JRootPane 所使用的自定義 LayoutManager 可確保:

    1. glassPane 填充了 JRootPane 的整個可查看區域(邊界 - insets)。
    2. layeredPane 填充了 JRootPane 的整個可查看區域。(邊界 - insets)
    3. menuBar 位于 layeredPane 的上邊緣。
    4. contentPane 填充了整個可查看區域,減去 menuBar(如果有)。

    JRootPane 視圖層次結構中的任何其它視圖均忽略。

    如果您替換 JRootPaneLayoutManager,您將負責管理所有這些視圖。所以通常情況下,應該確保更改的是 contentPane 的布局管理器,而不是 JRootPane 自身的布局管理器。

    Swing 的繪制架構要求在所有其它組件之上的包含層次結構中有一個不透明的 JComponent。這通常通過使用內容窗格來實現。如果要替換內容窗格,建議使用 setOpaque(true) 將內容窗格設置為不透明。另外,如果內容窗格重寫 paintComponent,還需要在 paintComponent 中用不透明顏色將背景完全填充。




    JLayeredPane 為 JFC/Swing 容器添加了深度,允許組件在需要時互相重疊。Integer 對象指定容器中每個組件的深度,其中編號較高的組件位于其他組件之上。有關面向任務的文檔和使用分層窗格的示例,請參閱《The Java Tutorial》中的 How to Use a Layered Pane 一節。

    以下文本是對此圖像的描述。

    為方便起見,JLayeredPane 將該深度范圍分成幾個不同的層。將組件放入相應的層,這樣更容易確保組件正確地重疊,而不必擔心為具體的深度指定編號:

    DEFAULT_LAYER
    大多數組件位于的標準層。這是最底層。
    PALETTE_LAYER
    調色板層位于默認層之上。它們對于浮動工具欄和調色板很有用,因此可以位于其他組件之上。
    MODAL_LAYER
    該層用于模式對話框。它們將出現在容器中所有工具欄、調色板或標準組件的上面。
    POPUP_LAYER
    彈出層顯示在對話框的上面。這樣,與組合框、工具提示和其他幫助文本關聯的彈出式窗口將出現在組件、調色板或生成它們的對話框之上。
    DRAG_LAYER
    拖動一個組件時,將該組件重分配到拖動層可確保將其定位在容器中的其他所有組件之上。完成拖動后,可將該組件重分配到其正常層。

    可以使用 JLayeredPane 的方法 moveToFront(Component)moveToBack(Component)setPosition 在組件所在層中對其進行重定位。還可以使用 setLayer 方法更改該組件的當前層。

    詳細信息

    JLayeredPane 以類似 Container 的方式管理其子級列表,但允許在其內部定義多個層。對同一層中子級的管理就像普通的 Container 對象一樣,但添加的功能是,當子組件重疊時,高層中的子組件顯示在低層中的子組件之上。

    每一層都是一個不同的整數。可以在調用 add 的過程中通過傳遞 Integer 對象,從而在 Component 上設置 layer 屬性。
    例如:

         layeredPane.add(child, JLayeredPane.DEFAULT_LAYER);
    或者
    layeredPane.add(child, new Integer(10));
    

    還可以通過在 JLayeredPane 上進行如下調用在 Component 上設置 layer 屬性:

         layeredPaneParent.setLayer(child, 10)

    JLayeredPane 是該 Component 的父組件。應該將子組件添加到父組件之前 設置 layer 屬性。

    編號較高的層顯示在編號較低的層之上。因此,對于每個組件,使用其層編號和字母即可,有代表性的列表順序如下所示:

           5a, 5b, 5c, 2a, 2b, 2c, 1a 

    其中最左邊的組件最接近顯示區的頂部。

    可以通過調用 moveToFrontmoveToBack 將組件移入到其所在層的頂部或底部位置。

    還可以直接指定某層中組件的位置。有效的位置范圍是從 0 到該層中組件數減一所得的值。值 -1 指示最底層位置。值 0 指示最頂層位置。與層的編號不同,較高的位置值顯示在較低 處。

    注: 此序列(通過 java.awt.Container 定義)與層的編號序列相反。可是通常使用的是 moveToFrontmoveToBacksetLayer 方法。

    以下是使用方法 add(Component, layer, position) 的一些示例:調用 add(5x, 5, -1) 得到:

           5a, 5b, 5c, 5x, 2a, 2b, 2c, 1a 

    調用 add(5z, 5, 2) 得到:

           5a, 5b, 5z, 5c, 5x, 2a, 2b, 2c, 1a 

    調用 add(3a, 3, 7) 得到:

           5a, 5b, 5z, 5c, 5x, 3a, 2a, 2b, 2c, 1a 

    使用正常的 paint/event 機制會使 1a 出現在底部,5a 出現在所有其他組件之上。

    注: 這些層只是一個邏輯構造,LayoutManager 將影響此容器的所有子組件,而不管其層設置如何。






    下面是一個使用layeredpane的示例

    /**
     * 
     * 
    @author: zhangtao 
     *        msn: zht_dream@hotmail.com
     *       mail: zht_dream@hotmail.com
     
    */

    public class InternalFrameTest extends JFrame {

        
    public static void
     main(String[] args) {
            InternalFrameTest test 
    = new
     InternalFrameTest();
            test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            test.setSize(
    500400
    );
            test.setLocationRelativeTo(
    null
    );
            test.setVisible(
    true
    );
        }

        
    public
     InternalFrameTest() {
            JPanel panel 
    = new
     JPanel();
            
    for (int i = 0; i < 10; i++
    ) {
                JButton button 
    = new JButton(i + ""
    );
                panel.add(button);
            }
            
    this
    .setContentPane(panel);

            JPanel controlPanel 
    = createControlPanel(this
    .getContentPane());
            JInternalFrame frame 
    = new
     JInternalFrame();
            frame.getContentPane().add(controlPanel);
            frame.putClientProperty(
    "JInternalFrame.isPalette", Boolean.valueOf(true
    ));
            frame.setTitle(
    "control"
    );
            frame.pack();
            frame.setLocation(
    3030
    );
            frame.setVisible(
    true
    );
            
    this.getLayeredPane().add(frame, 0
    );
        }

        
    public JPanel createControlPanel(final
     Container parent) {
            JPanel panel 
    = new JPanel(new GridLayout(3122
    ));
            
    final Color color =
     parent.getBackground();
            JPanel panel1 
    = new JPanel(new
     FlowLayout());
            panel1.add(
    new JLabel("r"
    ));
            
    final JSlider sliderRed = new JSlider(0255
    );
            sliderRed.addChangeListener(
    new
     ChangeListener() {
                
    public void
     stateChanged(ChangeEvent e) {
                    parent.setBackground(
    new
     Color(sliderRed.getValue(), color.getGreen(), color.getBlue()));
                }
            });
            sliderRed.setValue(color.getRed());
            panel1.add(sliderRed);

            JPanel panel2 
    = new JPanel(new
     FlowLayout());
            panel2.add(
    new JLabel("g"
    ));
            
    final JSlider sliderGreen = new JSlider(0255
    );
            sliderGreen.addChangeListener(
    new
     ChangeListener() {
                
    public void
     stateChanged(ChangeEvent e) {
                    parent.setBackground(
    new
     Color(color.getRed(), sliderGreen.getValue(), color.getBlue()));
                }
            });
            sliderGreen.setValue(color.getGreen());
            panel2.add(sliderGreen);

            JPanel panel3 
    = new JPanel(new
     FlowLayout());
            panel3.add(
    new JLabel("b"
    ));
            
    final JSlider sliderBlue = new JSlider(0255
    );
            sliderBlue.addChangeListener(
    new
     ChangeListener() {
                
    public void
     stateChanged(ChangeEvent e) {
                    parent.setBackground(
    new
     Color(color.getRed(), color.getGreen(), sliderBlue.getValue()));
                }
            });
            sliderBlue.setValue(color.getBlue());
            panel3.add(sliderBlue);
            panel.add(panel1);
            panel.add(panel2);
            panel.add(panel3);
            
    return
     panel;
        }

    }
    主站蜘蛛池模板: 久热中文字幕在线精品免费| 香蕉高清免费永久在线视频| 亚洲香蕉免费有线视频| 免费高清小黄站在线观看| 亚洲性69影院在线观看| 一级免费黄色毛片| 18禁成年无码免费网站无遮挡| 国产偷国产偷亚洲清高动态图| 亚洲乱码中文论理电影| 精精国产www视频在线观看免费| 人妻视频一区二区三区免费| 亚洲一卡二卡三卡| 国产午夜无码精品免费看 | 久久www免费人成精品香蕉| 中文字幕亚洲电影| 日本一区二区三区免费高清在线| 99久久免费国产香蕉麻豆| 亚洲午夜久久久久久噜噜噜| 国产亚洲综合视频| 青苹果乐园免费高清在线| 国产 亚洲 中文在线 字幕| 国产91免费在线观看| 色天使亚洲综合在线观看| 国产大片免费观看中文字幕| 国产精品亚洲片夜色在线| 999久久久免费精品播放 | 久久精品国产亚洲| 伊人免费在线观看高清版| 亚洲日本一区二区一本一道| 国产成人高清亚洲一区91| 青青草原亚洲视频| 在线永久看片免费的视频| 亚洲国产精品久久久久秋霞小| 无码人妻精品一二三区免费| 亚洲av无码片区一区二区三区| 国产精品麻豆免费版| 特级做A爰片毛片免费看无码| 亚洲色偷偷偷网站色偷一区| 91青青青国产在观免费影视| 久久久久久久亚洲Av无码| 日韩免费人妻AV无码专区蜜桃 |