SSISO Community

시소당

스윙(swing) - Border-Component TitledPane Example 2

import  java.awt.BorderLayout;
import  java.awt.Color;
import  java.awt.Component;
import  java.awt.Dimension;
import  java.awt.Graphics;
import  java.awt.Insets;
import  java.awt.Rectangle;
import  java.awt.event.ActionEvent;
import  java.awt.event.ActionListener;
import  java.awt.event.ItemEvent;
import  java.awt.event.ItemListener;
import  java.awt.event.WindowAdapter;
import  java.awt.event.WindowEvent;

import  javax.swing.JButton;
import  javax.swing.JCheckBox;
import  javax.swing.JComponent;
import  javax.swing.JFrame;
import  javax.swing.JLabel;
import  javax.swing.JPanel;
import  javax.swing.JTextField;
import  javax.swing.UIManager;
import  javax.swing.border.Border;
import  javax.swing.border.TitledBorder;

/**
  *  @version  1.0  08/12/99
  */
public  class  CompTitledPaneExample2  extends  JFrame  {

    public  CompTitledPaneExample2()  {
        super("CompTitledPaneExample2");
        JCheckBox  title  =  new  JCheckBox("Title");
        title.setSelected(true);
        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[])  {
        try  {
                UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        }  catch  (Exception  evt)  {}
    
        CompTitledPaneExample2  frame  =  new  CompTitledPaneExample2();
        frame.addWindowListener(new  WindowAdapter()  {
            public  void  windowClosing(WindowEvent  e)  {
                System.exit(0);
            }
        });
        frame.setSize(280,  110);
        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)  {
        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);

}

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;
    }

}

662 view

4.0 stars