没有. 用JPanel加上Border就行了.

解决方案 »

  1.   

    1)简单些
    public class Compement_Titleborder_study2 extends JFrame {  public Compement_Titleborder_study2() {
        super("Compement_Titleborder_study2");
        JCheckBox title = new JCheckBox("Title");
        title.setSelected(true);
        /*p1.setEnabled(false);//可用这句来完成:初始为disable
        */
        final CompTitledPane p1 = new CompTitledPane(title);
        title.addItemListener(new ItemListener() {
          public void itemStateChanged(ItemEvent e) {
            p1.setEnabled(e.getStateChange() == ItemEvent.SELECTED);
          }
        });
        APanel p2 = new APanel();
        p1.setTransmittingAllowed(true);//???
        p1.setTransmitter(p2);
        p1.getContentPane().add(p2);
        getContentPane().add(p1, BorderLayout.CENTER);
      }  class APanel extends JPanel implements StateTransmitter {
        JButton    button;
        JTextField textField;    APanel() {
          button = new JButton("abc");
          button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
              System.out.println("Ouch!");
            }
          });
          textField = new JTextField(10);
          textField.setText("text");
          add(button   , BorderLayout.NORTH);
          add(textField, BorderLayout.SOUTH);
        }    public void setChildrenEnabled(boolean enable) {
          button.setEnabled(enable);
          textField.setEnabled(enable);
        }
      }
      public static void main (String args[]) {
        Compement_Titleborder_study2 frame = new Compement_Titleborder_study2();
        frame.addWindowListener(new WindowAdapter() {
          public void windowClosing(WindowEvent e) {
    System.exit(0);
          }
        });
        frame.setSize(280, 110);
        frame.setVisible(true);
      }
    }
      

  2.   

    2)复杂些
    package swing_super_example_border;/**
     * <p>Title: Swing_Super_Example</p>
     * <p>Description: Swing_Example是网上下载的例子。</p>
     * <p>Copyright: Copyright (c) 2002</p>
     * <p>Company: </p>
     * @author unascribed
     * @version 1.0
     */
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.border.*;//一般自己更改的地方仅是frame中的SwitchPanel
    //----------------------------自己定义的frame-------------------------------
    public class Compement_Titleborder_study extends JFrame {  String title = "<html>Title ("+ "<font color=\"#ffffff\"><i>JLabel</i></font>"+ ")";  public Compement_Titleborder_study() {
        super("Compement_Titleborder_study");
        JLabel titleLabel = new JLabel(title);
        CompTitledPane p1 = new CompTitledPane(titleLabel);//
        JPanel p = p1.getContentPane();
        p.setLayout(new BorderLayout());
        p.add(new SwitchPanel(p1), BorderLayout.CENTER);//
        getContentPane().add(p1, BorderLayout.CENTER);
      }  class SwitchPanel extends JPanel implements ActionListener {
        String[] posStr = {"", "ABOVE_TOP"   , "TOP"   , "BELOW_TOP"
                             , "ABOVE_BOTTOM", "BOTTOM", "BELOW_BOTTOM"};
        String[] jusStr = {"", "LEFT"        , "CENTER", "RIGHT"};
        TitledBorder border;//TitledBorder是个类
        CompTitledPane panel;    SwitchPanel(CompTitledPane panel) {
          this.panel = panel;
          this.border = (TitledBorder)panel.getBorder();
          add(createPanel("Position"     ,posStr, 2));
          add(createPanel("Justification",jusStr, 1));
        }    JPanel createPanel(String str, String[] strs, int selectPos) {//selectPos是默认选中项
          JPanel p = new JPanel();
          p.setLayout(new GridLayout(strs.length, 1));
          p.add(new JLabel(str));
          ButtonGroup g = new ButtonGroup();
          for (int i=1;i<strs.length;i++) {
            JRadioButton b = new JRadioButton(strs[i]);
            if (i == selectPos) {
              b.setSelected(true);
            }
            p.add( b );
            g.add( b );
            b.addActionListener(this);
          }
          return p;
        }    public void actionPerformed(ActionEvent e) {
          JRadioButton b = (JRadioButton)e.getSource();
          String label = b.getText();
          for (int i=1; i<posStr.length; i++) {
            if (label.equals(posStr[i])) {//判断标题是否相同
              border.setTitlePosition(i);//数组的顺序是固定的,不可颠倒。
              panel.revalidate();//重绘
              panel.repaint();
              return;
            }
          }
          for (int i=1; i<jusStr.length; i++) {
            if (label.equals(jusStr[i])) {
              border.setTitleJustification(i);
              panel.revalidate();
              panel.repaint();
              return;
            }
          }
        }
      }
      public static void main (String args[]) {
        Compement_Titleborder_study frame = new Compement_Titleborder_study();
        frame.addWindowListener(new WindowAdapter() {
          public void windowClosing(WindowEvent e) {
    System.exit(0);
          }
        });
        frame.setSize(280, 230);
        frame.setVisible(true);
      }
    }//关键是下面三个类
    //---------------------------处理标题---------------------------class CompTitledPane extends JPanel {
      protected CompTitledBorder border;
      protected JComponent component;
      protected JPanel panel;
      protected boolean transmittingAllowed;
      protected StateTransmitter transmitter;  public CompTitledPane() {
        this(new JLabel("Title"));
        // debug
        // JLabel label = (JLabel)getTitleComponent();
        // label.setOpaque(true);
        // label.setBackground(Color.yellow);
      }  public CompTitledPane(JComponent component) {//将标题控件传入
        this.component = component;
        border = new CompTitledBorder(component);
        setBorder(border);
        panel = new JPanel();
        setLayout(null);
        add(component);
        add(panel);
        transmittingAllowed = false;
        transmitter = null;
      }  public JComponent getTitleComponent() {//标题控件
        return component;
      }  public void setTitleComponent(JComponent newComponent) {//设置新的标题控件
        remove(component);
        add(newComponent);
        border.setTitleComponent(newComponent);
        component = newComponent;
      }  public JPanel getContentPane() {
        return panel;
      }  public void doLayout() {
        Insets insets = getInsets();//容器边的代表
        Rectangle rect = getBounds();//矩形区域
        rect.x = 0;
        rect.y = 0;    Rectangle compR = border.getComponentRect(rect,insets);
        component.setBounds(compR);
        rect.x += insets.left;
        rect.y += insets.top;
        rect.width  -= insets.left + insets.right;
        rect.height -= insets.top  + insets.bottom;
        panel.setBounds(rect);
      }  public void setTransmittingAllowed(boolean enable) {//允许部件被disable
        transmittingAllowed = enable;
      }
      
      public boolean getTransmittingAllowed() {
        return transmittingAllowed;
      }  public void setTransmitter(StateTransmitter transmitter) {
        this.transmitter = transmitter;
      }  public StateTransmitter getTransmitter() {
        return transmitter;
      }  public void setEnabled(boolean enable) {
        super.setEnabled(enable);
        if (transmittingAllowed && transmitter != null) {
          transmitter.setChildrenEnabled(enable);
        }
      }
    }
    //-----------------------------接口定义------------------------- interface StateTransmitter {  public void setChildrenEnabled(boolean enable);}// sample
    //
    //  public void setChildrenEnabled(boolean enable) {
    //
    //    Component[] children = panel.getComponents();
    //    for(int i=0; i<children.length; i++) {
    //      System.out.println(" " + i +
    //                         " " + children[i].getClass().getName() +
    //                         " " + enable);
    //      children[i].setEnabled(enable);
    //    }
    //  }
    //
      

  3.   

    //-------------------------------边框设置----------------------- class CompTitledBorder extends TitledBorder {
      protected JComponent component;  public CompTitledBorder(JComponent component) {
        this(null, component, LEFT, TOP);
      }  public CompTitledBorder(Border border) {
        this(border, null, LEFT, TOP);
      }  public CompTitledBorder(Border border, JComponent component) {
        this(border, component, LEFT, TOP);
      }  public CompTitledBorder(Border     border,
                              JComponent component,
                              int        titleJustification,
                              int        titlePosition)      {
        super(border, null, titleJustification,
                            titlePosition, null, null);
        this.component = component;
        if (border == null) {
          this.border = super.getBorder();
        }
      }
      public void paintBorder(Component c, Graphics g,
                              int x, int y, int width, int height) {
        Rectangle borderR = new Rectangle(x      +  EDGE_SPACING,
                                          y      +  EDGE_SPACING,
                                          width  - (EDGE_SPACING * 2),
                                          height - (EDGE_SPACING * 2));
        Insets borderInsets;
        if (border != null) {
          borderInsets = border.getBorderInsets(c);
        } else {
          borderInsets = new Insets(0, 0, 0, 0);
        }    Rectangle rect = new Rectangle(x,y,width,height);
        Insets insets = getBorderInsets(c);
        Rectangle compR = getComponentRect(rect, insets);
        int diff;
        switch (titlePosition) {
          case ABOVE_TOP:
            diff = compR.height + TEXT_SPACING;
            borderR.y += diff;
            borderR.height -= diff;
            break;
          case TOP:
          case DEFAULT_POSITION:
            diff = insets.top/2 - borderInsets.top - EDGE_SPACING;
            borderR.y += diff;
            borderR.height -= diff;
            break;
          case BELOW_TOP:
          case ABOVE_BOTTOM:
            break;
          case BOTTOM:
            diff = insets.bottom/2 - borderInsets.bottom - EDGE_SPACING;
            borderR.height -= diff;
            break;
          case BELOW_BOTTOM:
            diff = compR.height + TEXT_SPACING;
            borderR.height -= diff;
            break;
        }
        border.paintBorder(c, g, borderR.x,     borderR.y,
                                 borderR.width, borderR.height);
        Color col = g.getColor();
        g.setColor(c.getBackground());
        g.fillRect(compR.x, compR.y, compR.width, compR.height);
        g.setColor(col);
        component.repaint();
      }  public Insets getBorderInsets(Component c, Insets insets) {
        Insets borderInsets;
        if (border != null) {
          borderInsets  = border.getBorderInsets(c);
        } else {
          borderInsets  = new Insets(0,0,0,0);
        }
        insets.top    = EDGE_SPACING + TEXT_SPACING + borderInsets.top;
        insets.right  = EDGE_SPACING + TEXT_SPACING + borderInsets.right;
        insets.bottom = EDGE_SPACING + TEXT_SPACING + borderInsets.bottom;
        insets.left   = EDGE_SPACING + TEXT_SPACING + borderInsets.left;    if (c == null || component == null) {
          return insets;
        }    int compHeight = 0;
        if (component != null) {
          compHeight = component.getPreferredSize().height;
        }    switch (titlePosition) {
          case ABOVE_TOP:
            insets.top    += compHeight + TEXT_SPACING;
            break;
          case TOP:
          case DEFAULT_POSITION:
            insets.top    += Math.max(compHeight,borderInsets.top) - borderInsets.top;
            break;
          case BELOW_TOP:
            insets.top    += compHeight + TEXT_SPACING;
            break;
          case ABOVE_BOTTOM:
            insets.bottom += compHeight + TEXT_SPACING;
            break;
          case BOTTOM:
            insets.bottom += Math.max(compHeight,borderInsets.bottom) - borderInsets.bottom;
            break;
          case BELOW_BOTTOM:
            insets.bottom += compHeight + TEXT_SPACING;
            break;
        }
        return insets;
      }  public JComponent getTitleComponent() {
        return component;
      }  public void setTitleComponent(JComponent component) {
        this.component = component;
      }//得到边框的矩形区域
      public Rectangle getComponentRect(Rectangle rect,Insets borderInsets) {//矩形区域和边线传入
        Dimension compD = component.getPreferredSize();//获取标题的大小
        Rectangle compR = new Rectangle(0,0,compD.width,compD.height);//创建矩形区域
        switch (titlePosition) {//垂直判断
          case ABOVE_TOP:
            compR.y = EDGE_SPACING;
            break;
          case TOP:
          case DEFAULT_POSITION:
            compR.y = EDGE_SPACING +
                     (borderInsets.top -EDGE_SPACING -TEXT_SPACING -compD.height)/2;
            break;
          case BELOW_TOP:
            compR.y = borderInsets.top - compD.height - TEXT_SPACING;
            break;
          case ABOVE_BOTTOM:
            compR.y = rect.height - borderInsets.bottom + TEXT_SPACING;
            break;
          case BOTTOM:
            compR.y = rect.height - borderInsets.bottom + TEXT_SPACING +
                     (borderInsets.bottom -EDGE_SPACING -TEXT_SPACING -compD.height)/2;
            break;
          case BELOW_BOTTOM:
            compR.y = rect.height - compD.height - EDGE_SPACING;
            break;
        }
        switch (titleJustification) {//水平判断
          case LEFT:
          case DEFAULT_JUSTIFICATION:
            compR.x = TEXT_INSET_H + borderInsets.left;
            break;
          case RIGHT:
            compR.x = rect.width - borderInsets.right -TEXT_INSET_H -compR.width;
            break;
          case CENTER:
            compR.x = (rect.width - compR.width) / 2;
            break;
        }
        return compR;
      }}
    //------------------------------------------------------