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

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

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

    java something

    不要以為......很遙遠(yuǎn)
    隨筆 - 23, 文章 - 1, 評(píng)論 - 2, 引用 - 0
    數(shù)據(jù)加載中……

    GridBagLayout

    下面的是這個(gè)界面的一個(gè)原始草圖:

     

    正如你所看到的,最終的結(jié)果看上去和計(jì)劃的想法完全一樣。

         你應(yīng)該能看到在草圖里有一些線,這些線是用來(lái)把總界面分成若干行和列的,這樣你就很清楚每一個(gè)組件放置的格子位置。這就是GridBagLayout里"格"的那一部分,而圖上的數(shù)字就是格的號(hào)碼。

    在某種意義上說(shuō), 我們可以把GridBagLayout想象成為早些年的HTML3和4,它們都是基于表的布局,Grid的概念就類(lèi)似rowspan和colspan的意思,只不過(guò)換了個(gè)名字罷了。

    隨著我們的界面和表格的設(shè)置完成,是時(shí)候該進(jìn)行界面布局并開(kāi)始寫(xiě)代碼了。

    工作過(guò)程

    這一節(jié)我假定你已經(jīng)了解了基本的窗口和組件創(chuàng)建知識(shí)。

    通過(guò)這篇文章我們最終能在一個(gè)frame中布局組件,我們將在以后的文章對(duì)界面進(jìn)行改進(jìn)使它更適用。因此,為了了解這整個(gè)工作的過(guò)程,我們列出了所有的目標(biāo)代碼。

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    public class GridBagWindow extends JFrame {
    private JButton searchBtn;
    private JComboBox modeCombo;
    private JLabel tagLbl;
    private JLabel tagModeLbl;
    private JLabel previewLbl;
    private JTable resTable;
    private JTextField tagTxt;
    public GridBagWindow() {
    Container contentPane = getContentPane();
    GridBagLayout gridbag = new GridBagLayout();
    contentPane.setLayout(gridbag);
    GridBagConstraints c = new GridBagConstraints();
    //setting a default constraint value
    c.fill =GridBagConstraints.HORIZONTAL;
    tagLbl = new JLabel("Tags");
    c.gridx = 0; //x grid position
    c.gridy = 0; //y grid position
    gridbag.setConstraints(tagLbl, c); //associate the label with a constraint object
    contentPane.add(tagLbl); //add it to content pane
    tagModeLbl = new JLabel("Tag Mode");
    c.gridx = 0;
    c.gridy = 1;
    gridbag.setConstraints(tagModeLbl, c);
    contentPane.add(tagModeLbl);
    tagTxt = new JTextField("plinth");
    c.gridx = 1;
    c.gridy = 0;
    c.gridwidth = 2;
    gridbag.setConstraints(tagTxt, c);
    contentPane.add(tagTxt);
    String[] options = {"all", "any"};
    modeCombo = new JComboBox(options);
    c.gridx = 1;
    c.gridy = 1;
    c.gridwidth = 1;
    gridbag.setConstraints(modeCombo, c);
    contentPane.add(modeCombo);
    searchBtn = new JButton("Search");
    c.gridx = 1;
    c.gridy = 2;
    gridbag.setConstraints(searchBtn, c);
    contentPane.add(searchBtn);
    resTable = new JTable(5,3);
    c.gridx = 0;
    c.gridy = 3;
    c.gridwidth = 3;
    gridbag.setConstraints(resTable, c);
    contentPane.add(resTable);
    previewLbl = new JLabel("Preview goes here");
    c.gridx = 0;
    c.gridy = 4;
    gridbag.setConstraints(previewLbl, c);
    contentPane.add(previewLbl);
    addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    }
    });
    }
    public static void main(String args[]) {
    GridBagWindow window = new GridBagWindow();
    window.setTitle("GridBagWindow");
    window.pack();
    window.setVisible(true);
    }
    }

     

    構(gòu)造方法前的代碼都不是很特殊,都是一些相當(dāng)標(biāo)準(zhǔn)的import和變量定義。但是進(jìn)入構(gòu)造方法后,事情就變得有趣了。

    Container contentPane = getContentPane();

    GridBagLayout gridbag = new GridBagLayout();

    contentPane.setLayout(gridbag);

         我們以GridBagWindow的內(nèi)容面板作為開(kāi)始來(lái)創(chuàng)建一個(gè)GridBagLayout對(duì)象,準(zhǔn)確地說(shuō),這個(gè)方法與過(guò)去我們所創(chuàng)建 GridLayout對(duì)象和BorderLayout對(duì)象的方法是一樣的。那么,現(xiàn)在我們就開(kāi)始來(lái)設(shè)置GridBagLayout對(duì)象使它作為內(nèi)容面板的 布局。

    GridBagConstraints c = new GridBagConstraints();

         然后我要提到這整個(gè)進(jìn)程中的一個(gè)獨(dú)特的對(duì)象,那就是GridBagConstraints。這個(gè)對(duì)象在GridBagLayout中控制所 有被安置在其中組件的約束。為了把一個(gè)組件增加到你的GridBagLayout中去,你首先必須將它與一個(gè)GridBagConstraints對(duì)象建 立連接。

    GridBagConstraints可以從11個(gè)方面來(lái)進(jìn)行控制和操縱,也可以給你提供一些幫助。這些內(nèi)容是:

    • Gridx——組件的橫向坐標(biāo)
    • Girdy——組件的縱向坐標(biāo)
    • Gridwidth——組件的橫向?qū)挾龋簿褪侵附M件占用的列數(shù),這與HTML的colspan類(lèi)似
    • Gridheight——組件的縱向長(zhǎng)度,也就是指組件占用的行數(shù),這與HTML的rowspan類(lèi)似
    • Weightx——指行的權(quán)重,告訴布局管理器如何分配額外的水平空間
    • Weighty——指列的權(quán)重,告訴布局管理器如何分配額外的垂直空間
    • Anchor——告訴布局管理器組件在表格空間中的位置
    • Fill——如果顯示區(qū)域比組件的區(qū)域大的時(shí)候,可以用來(lái)控制組件的行為。控制組件是垂直填充,還是水平填充,或者兩個(gè)方向一起填充
    • Insets——指組件與表格空間四周邊緣的空白區(qū)域的大小
    • Ipadx—— 組件間的橫向間距,組件的寬度就是這個(gè)組件的最小寬度加上ipadx值
    • ipady—— 組件間的縱向間距,組件的高度就是這個(gè)組件的最小高度加上ipady值

         可能對(duì)于一個(gè)組件的每一個(gè)實(shí)例你都需要為它建立一個(gè)單獨(dú)的GridBagConstraints;然而,這種方法我們并不推薦使用。最好的方法是,當(dāng)你調(diào)用它的時(shí)候把對(duì)象設(shè)置為默認(rèn)值,然后針對(duì)于每一個(gè)組件改變其相應(yīng)的域。

         這個(gè)方法具有通用性,因?yàn)樵谝恍┯蛑校热鏸nsets、padx、pady和fill這些域,對(duì)于每一個(gè)組件來(lái)說(shuō)一般都是相同的,因此這樣對(duì)一個(gè)域進(jìn)行設(shè)置就會(huì)更輕松了,也能更輕松的在另外的組件中改變某些域的值。

         如果在改變了某些域值之后,你想回到原始的域值的話(huà),你應(yīng)該在增加下一個(gè)組件之前進(jìn)行改變。這種方法使你更容易明白你正在修改的內(nèi)容,也能使你更容易明白在一連串對(duì)象中的這11個(gè)參數(shù)的作用。

         也許你現(xiàn)在對(duì)這些內(nèi)容還是一知半解,不過(guò)事實(shí)上一旦你理解了GridBagConstraints,值得安慰的是你以后做再困難的工作都會(huì)游刃有余了。

    所以,如果我們已經(jīng)明白了GridBagConstraints的詳細(xì)用法了,那么現(xiàn)在就讓我們來(lái)看看在實(shí)際應(yīng)用中應(yīng)該如何來(lái)實(shí)現(xiàn)它:

    tagLbl = new JLabel("Tags");
    c.gridx = 0; //x grid position
    c.gridy = 0; //y grid position
    gridbag.setConstraints(tagLbl, c); //設(shè)置標(biāo)簽的限制

    contentPane.add(tagLbl); //增加到內(nèi)容面板

    我們所做的是示例我們的標(biāo)簽、分配給它一個(gè)格位置,將它與一個(gè)約束對(duì)象聯(lián)系起來(lái)并把它增加到我們的內(nèi)容面板中。

    tagModeLbl = new JLabel("Tag Mode");
    c.gridx = 0;
    c.gridy = 1;
    gridbag.setConstraints(tagModeLbl, c);

    contentPane.add(tagModeLbl);

       請(qǐng)注意,雖然我們已經(jīng)在我們的約束對(duì)象中把gridx的值設(shè)置為0,但是在這里我們?nèi)匀灰獙?duì)它進(jìn)行重新設(shè)置——這樣做沒(méi)有其它原因,只是為了增加可讀性。

         下面,我們?cè)黾右粋€(gè)文本域以便能存儲(chǔ)我們希望能搜索到的關(guān)鍵字,再增加一個(gè)組合框以便用來(lái)搜索多個(gè)關(guān)鍵字。除了我們希望的文本域有兩列之外,這個(gè)概念其他的方面都與上面所說(shuō)的是相同的,所以,我們需要在增加組合框之前重新設(shè)置文本域的值。

    tagTxt = new JTextField("plinth");
    c.gridx = 1;
    c.gridy = 0;
    c.gridwidth = 2;
    gridbag.setConstraints(tagTxt, c);
    contentPane.add(tagTxt);

    String[] options = {"all", "any"};
    modeCombo = new JComboBox(options);
    c.gridx = 1;
    c.gridy = 1;
    c.gridwidth = 1;
    gridbag.setConstraints(modeCombo, c);
    contentPane.add(modeCombo);

           做了這些之后,我們?cè)僭趦?nèi)容面板中增加一些其余的簡(jiǎn)單組件,這時(shí)候我們就能夠?yàn)g覽它了;其余的代碼應(yīng)該不會(huì)出現(xiàn)任何問(wèn)題了。

    到這個(gè)階段,我們應(yīng)該已經(jīng)得到了一個(gè)類(lèi)似于我們先前所設(shè)計(jì)的界面了。

    posted on 2011-02-24 10:32 Jamie 閱讀(484) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): swing


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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 色偷偷亚洲第一综合| 亚洲国产综合精品一区在线播放| 久久久久久免费一区二区三区| 香蕉成人免费看片视频app下载| 黄色永久免费网站| 亚洲精品A在线观看| 亚洲av最新在线观看网址| 国产偷伦视频免费观看| 亚洲愉拍99热成人精品热久久| 亚洲av无码国产综合专区| 久青草视频在线观看免费 | 美女被爆羞羞网站在免费观看| 日本免费一区二区久久人人澡| 日本牲交大片免费观看| 亚洲熟妇丰满多毛XXXX| 黄色毛片免费观看| 无码国产亚洲日韩国精品视频一区二区三区 | 99re在线精品视频免费| 亚洲国产天堂久久综合| igao激情在线视频免费| 国产自产拍精品视频免费看| 色婷婷亚洲十月十月色天| 成人免费观看男女羞羞视频| 久久久久免费看黄A片APP | 亚洲午夜在线电影| 国产99视频精品免费视频76| 亚洲乱码无码永久不卡在线| 福利片免费一区二区三区| 最近免费中文字幕4| 亚洲视频在线观看视频| 日韩电影免费在线观看中文字幕 | 亚洲精品精华液一区二区 | www成人免费视频| 免费播放特黄特色毛片| 亚洲欧美熟妇综合久久久久| 免费观看黄色的网站| 亚洲国产精品综合久久网各| 91av免费观看| 亚洲无人区视频大全| 四虎国产精品免费视| 国产亚洲精品美女2020久久|