## Hacerlo sin Controlador de Disposición (Posicionamiento Absoluto)

Aunque es posible hacerlo sin un controlador de disposición, se debería utilizar un controlador disposición siempre que sea posible. Los controladores de disposición hacen más sencillo en redimensionado de un contenedor y ajustan a la apariencia de los componentes dependientes de la plataforma y los diferentes tamaños de las fuentes. También pueden ser reutilizados fácilmene por otros contenedores y otros programas. Si un contenedor personalizado no será reutilizado ni redimensionado, y controla normalmente los factores dependientes del sistema como el tamaño de las fuentes y la apariencia de los componentes (implementando sus propios controles si fuera necesario), entonces, el posicionamiento absoluto podría tener sentido.

Aquí tienes un applet que muestra una ventana que utiliza posicionamiento absoluto.

Abajo tienes las declaraciones de las variables de ejemplar, la implementación del constructor, y del método paint() de la clase window. Aquí tienes un enlace al programa completo. El programa se puede ejecutar dentro de un applet con la ayuda de AppletButton, o como una aplicación.

    public class NoneWindow extends Frame {
        . . .
        private boolean laidOut = false;
        private Button b1, b2, b3;

        public NoneWindow() {
            super();
            setLayout(null);
            setFont(new Font("Helvetica", Font.PLAIN, 14));

            b1 = new Button("one");
            add(b1);
            b2 = new Button("two");
            add(b2);
            b3 = new Button("three");
            add(b3);
        }

        public void paint(Graphics g) {
            if (!laidOut) {
                Insets insets = insets();
                /*
                 *Garantizamos que insets() devuelve un Insets válido
                 * si lo llamamos desde paint() -- no sería válido si los llamaramos desde
                 * el constructor.
                 *
                 * Quizás podríamos guardar esto en una variable, pero insets puede
                 * cambiar, y cuando lo haga, el AWT crea un nuevo objeto
                 * Insets completo; el viejo no es válido.
                 */
                b1.reshape(50 + insets.left, 5 + insets.top, 50, 20);
                b2.reshape(70 + insets.left, 35 + insets.top, 50, 20);
                b3.reshape(130 + insets.left, 15 + insets.top, 50, 30);

                laidOut = true;
            }
        }

        . . .
    }

Ozito