请看下面的实际应用界面要求:
(图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