Java中的布局管理器 下载本文

请看下面的实际应用界面要求:

(图3.4-1)

(图3.4-2)

(图3.4-3)

在这个具体应用中,底部的JButton组是确定的,但JTabbedPane的每一个选项都不同,如何实现呢?

3.4.2解决方案

首先我们可以采用BorderLayout确定主题对话框的布局方式,实现方法如下: ? JTabbedPane dbTabPane = new JTabbedPane();

? …… //下面需要用到的JButton等组件变量定义(或声明) ? private void initLayout() ? {

? initDBTabPane();//初始化JTabbedPane:DBTabPane组件

? this.getContentPane().add(BorderLayout.CENTER, dbTabPane); ? //将JTabbedPane组件:dbTabPane布局于JDialog对话框的中间 ? initButtonPanel();//初始化JPanel:ButtonPanel组件

? this.getContentPane().add(BorderLayout.SOUTH, buttonPanel); ? //将JPanel组件:buttonPanel布局于JDialog对话框的底部(南面) ? } ?

? private void initDBTabPane()

? {

? JPanel loginPanel = new JPanel(new GridLayout(10, 1)); ? //为保证两个JCheckBox组件位于顶端,设置为共10行,每行一个组件的布局,但只 ? //放置界面要求的两个组件,这样就保持了界面的美观,否则如定义为 ? //Gridlayout(2,1)则会使两个组件居中,而且中间会隔开较长的距离。 ? pwdBox.setMnemonic('P'); ? loginPanel.add(pwdBox); ? dspBox.setMnemonic('D'); ? loginPanel.add(dspBox);

? dbTabPane.add(\, loginPanel); //设置\(图3.4-1)的布局 ? needRadio.setMnemonic('N'); ? allRadio.setMnemonic('A'); ? cacheRadio.setMnemonic('U');

? radioPanel.setBorder(new TitledBorder(\));//加上边界标题 ? radioPanel.add(needRadio); ? radioPanel.add(allRadio); ? radioPanel.add(cacheRadio);

? //以上为加入需要的JRadioButton组件到指定的JPanel: radioPanel ? queryPanel.add(radioPanel);//加入含JRadioButton组的JPanel到queryPanel ? reqBox.setMnemonic('R'); ? boxPanel.add(reqBox); ? saveBox.setMnemonic('S'); ? boxPanel.add(saveBox); ? autoBox.setMnemonic('t'); ? boxPanel.add(autoBox);

? //以上为加入需要的JCheckBox组到指定的JPanel:boxPanel

? queryPanel.add(boxPanel); //加入含JCheckBox组的JPanel到queryPanel

? dbTabPane.add(\, queryPanel);//设置\(图3.4-2)的布局 ? initDrvPanel(); ? } ?

? /**设置\(图3.4-3)的布局*/ ? private void initDrvPanel() ? {

? gridBag.fill = GridBagConstraints.HORIZONTAL; ? gridBag.weightx = 100; ? gridBag.weighty = 0;

? tipLabel.setForeground(Color.black);

? this.add(drvPanel, tipLabel, gridBag, 0, 0, 4, 1); ? urlLabel.setForeground(Color.black);

? this.add(drvPanel, urlLabel, gridBag, 0, 5, 4, 1); ? urlField.setEditable(false);

? this.add(drvPanel, urlField, gridBag, 0, 6, 4, 1); ? gridBag.weightx = 0; ? gridBag.weighty = 0; ? addButton.setMnemonic('A');

? this.add(drvPanel, addButton, gridBag, 3, 1, 1, 1); ? editButton.setMnemonic('E');

? this.add(drvPanel, editButton, gridBag, 3, 2, 1, 1); ? removeButton.setMnemonic('R');

? this.add(drvPanel, removeButton, gridBag, 3, 3, 1, 1); ? gridBag.fill = GridBagConstraints.BOTH; ? gridBag.weightx = 100; ? gridBag.weighty = 100;

? //设置JTable组件:drvTable的从0到7行第0列的值 ? for (int i = 0; i < 8; i++)

? drvTable.setValueAt(drvStrs[i],i,0); ? //设置JTable的列头

? drvTable.getColumn(drvTable.getColumnName(0)).setHeaderValue(\Drivers\); ? drvTable.setShowGrid(false);//设置不显示网格线 ? this.add(drvPanel, drvScroll, gridBag, 0, 1, 3, 4); ? dbTabPane.add(\, drvPanel); ? } ?

? /**初始化底部JButton组的布局*/ ? private void initButtonPanel() ? {

? JPanel buttonPanel FlowLayout(FlowLayout.RIGHT)); ? //从右边开始进行FlowLayout布局 ? okButton.setMnemonic('O'); ? buttonPanel.add(okButton); ? cancelButton.setMnemonic('C'); ? buttonPanel.add(cancelButton); ? helpButton.setMnemonic('H'); ? buttonPanel.add(helpButton); ? } ?

? /**给指定的容器cn在指定的(x,y)位置放置指定大小(宽度=w,高度=h)的组件c*/ ? private void add(Container cn, Component c, GridBagConstraints gbc, int x, int y, int w, int h) ? {

? gbc.gridx = x; ? gbc.gridy = y; ? gbc.gridwidth = w; ? gbc.gridheight = h; ? cn.add(c, gbc); ? }

=

new

JPanel(new