gentoo linux, java, software libre y otras hierbas
dic, 13 2007 - 2:55 pm

[código] GUIs en Java – áreas de texto, paneles y scrolls

(anterior) En esta sección se presentan varios de los componentes de Java para la creación de interfaces gráficas de usuario. Los componentes de Swing pueden personalizarse para asemejarse a la apariencia de la plataforma computacional en la que se ejecute el programa, o pueden usar la apariencia visual de Java para brindar una interfaz idéntica en cualquier Sistema Operativo. Esta sección se centra en el uso de lsa Areas de Texto, los paneles, y los scroll.

Como copiar texto seleccionado de un área de texto (JTextArea) a otra

// Cómo copiar texto seleccionado de un área de texto a otra.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DemoAreaTexto extends JFrame
{
   private JTextArea areaTexto1, areaTexto2;
   private JButton botonCopiar;

   // configurar GUI
   public DemoAreaTexto()
   {
      super( "Demostración de JTextArea" );

      Box cuadro = Box.createHorizontalBox();

      String cadena = "Ésta es una cadena de\ndemostración para\n" +
         "ilustrar cómo copiar texto\nde un área de texto a \n" +
         "otra, utilizando un\nevento externo";

      // establecer areaTexto1
      areaTexto1 = new JTextArea( cadena, 10, 15 );
      cuadro.add( new JScrollPane( areaTexto1 ) );

      // establecer botonCopiar
      botonCopiar = new JButton( "Copiar >>>" );
      cuadro.add( botonCopiar );
      botonCopiar.addActionListener(

         new ActionListener() {  // clase interna anónima 

            // establecer en areaTexto2 el texto seleccionado de areaTexto1
            public void actionPerformed( ActionEvent evento )
            {
               areaTexto2.append( areaTexto1.getSelectedText() );
            }

         } // fin de la clase interna anónima

      ); // fin de la llamada a addActionListener

      // establecer areaTexto2
      areaTexto2 = new JTextArea( 10, 15 );
      areaTexto2.setEditable( false );
      cuadro.add( new JScrollPane( areaTexto2 ) );

      // agregar cuadro al panel de contenido
      Container contenedor = getContentPane();
      contenedor.add( cuadro );   // colocar en in BorderLayout.CENTER

      setSize( 425, 200 );
      setVisible( true );

   } // fin del constructor de DemoAreaTexto

   public static void main( String args[] )
   {
      JFrame.setDefaultLookAndFeelDecorated(true);
      DemoAreaTexto aplicacion = new DemoAreaTexto();
      aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
   }

} // fin de la clase DemoAreaTexto

Descargar código fuente

Una clase JPanel personalizada

(contiene dos clases)

// Uso de un objeto JPanel personalizado.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class PruebaPanelPersonalizado extends JFrame
{
	private JPanel panelBotones;
	private PanelPersonalizado miPanel;
	private JButton botonCirculo, botonCuadrado;

	// configurar GUI
	public PruebaPanelPersonalizado()
	{
		super( "Prueba de PanelPersonalizado" );
		// crear área personalizada de dibujo
		miPanel = new PanelPersonalizado();
		miPanel.setBackground( Color.GREEN );

		// establecer botonCuadrado
		botonCuadrado = new JButton( "Cuadrado" );
		botonCuadrado.addActionListener(
			new ActionListener()
			{
				 // clase interna anónima
				 // dibujar un cuadrado
				 public void actionPerformed( ActionEvent evento )
				 {
				 	miPanel.dibujar( PanelPersonalizado.CUADRADO );
				 }
			} // fin de la clase interna anónima
		); // fin de la llamada a addActionListener

		botonCirculo = new JButton( "Círculo" );
		botonCirculo.addActionListener(
			new ActionListener()
			{
				// clase interna anónima
				// dibujar un círculo
				public void actionPerformed( ActionEvent evento )
				{
					miPanel.dibujar( PanelPersonalizado.CIRCULO );
				}
			} // fin de la clase interna anónima
		); // fin de la llamada a addActionListener
		// establecer panel con botones
		panelBotones = new JPanel();
		panelBotones.setLayout( new GridLayout( 1, 2 ) );
		panelBotones.add( botonCirculo );
		panelBotones.add( botonCuadrado );

		// adjuntar panel de botones y área personalizada de dibujo al panel de contenido
		Container contenedor = getContentPane();
		contenedor.add( miPanel, BorderLayout.CENTER );
		contenedor.add( panelBotones, BorderLayout.SOUTH );
		setSize(300,150);
		setVisible(true);
	} // fin del constructor PruebaPanelPersonalizado
	public static void main( String args[] )
	{
		JFrame.setDefaultLookAndFeelDecorated(true);
		PruebaPanelPersonalizado aplicacion = new PruebaPanelPersonalizado();
		aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
	}
} // fin de la clase PruebaPanelPersonalizado
// Una clase JPanel personalizada.
import java.awt.*;
import javax.swing.*;

public class PanelPersonalizado extends JPanel {
   public final static int CIRCULO = 1, CUADRADO = 2;
   private int figura;

   // usar figura para dibujar un óvalo o rectángulo
   public void paintComponent( Graphics g )
   {
      super.paintComponent( g );

      if ( figura == CIRCULO )
         g.fillOval( 50, 10, 60, 60 );
      else if ( figura == CUADRADO )
         g.fillRect( 50, 10, 60, 60 );
   }

   // establecer valor de figura y repintar PanelPersonalizado
   public void dibujar( int figuraADibujar )
   {
      figura = figuraADibujar;
      repaint();
   }

} // fin de la clase PanelPersonalizado

Descargar código fuente

Una clase JPanel auto contenida que maneja sus propios eventos de ratón

(contiene dos clases)

// Creación de una subclase autocontenida de JPanel que procesa
// sus propios eventos de ratón.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class PruebaPanelAutoContenido extends JFrame
{
   private PanelAutoContenido miPanel;

   // configurar GUI y manejadores de eventos de movimiento del ratón p/la ventana de la aplicación
   public PruebaPanelAutoContenido()
   {
      // establecer un PanelAutoContenido
      miPanel = new PanelAutoContenido();
      miPanel.setBackground( Color.YELLOW );

      Container contenedor = getContentPane();
      contenedor.setLayout( new FlowLayout() );
      contenedor.add( miPanel );

      // establecer manejo de eventos de movimiento del ratón
      addMouseMotionListener(

         new MouseMotionListener() {  // clase interna anónima

            // manejar evento de arrastrar el ratón
            public void mouseDragged( MouseEvent evento )
            {
               setTitle( "Arrastrando: x=" + evento.getX() +
                  "; y=" + evento.getY() );
            }

            // manejar evento de mover el ratón
            public void mouseMoved( MouseEvent evento )
            {
               setTitle( "Moviendo: x=" + evento.getX() +
                  "; y=" + evento.getY() );
            }

         } // fin de la clase interna anónima

      ); // fin de la llamada a addMouseMotionListener

      setSize( 300, 200 );
      setVisible( true );

   } // fin del constructor de PruebaPanelAutoContenido

   public static void main( String args[] )
   {
      JFrame.setDefaultLookAndFeelDecorated(true);
      PruebaPanelAutoContenido aplicacion = new PruebaPanelAutoContenido();
      aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
   }

} // fin de la clase PruebaPanelAutoContenido
// Una clase JPanel autocontenida que maneja sus propios eventos de ratón.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class PanelAutoContenido extends JPanel
{
   private int x1, y1, x2, y2;

   // establecer manejo de eventos de ratón para PanelAutoContenido
   public PanelAutoContenido()
   {
      // establecer componente de escucha de eventos de ratón
      addMouseListener(

         new MouseAdapter() {  // clase interna anónima 

            // manejar evento de oprimir botón del ratón
            public void mousePressed( MouseEvent evento )
            {
               x1 = evento.getX();
               y1 = evento.getY();
            }

            // manejar evento de soltar botón del ratón
            public void mouseReleased( MouseEvent evento )
            {
               x2 = evento.getX();
               y2 = evento.getY();
               repaint();
            }

         } // fin de la clase interna anónima

      ); // fin de la llamada a addMouseListener

      // establecer componente de escucha de movimientos del ratón
      addMouseMotionListener(

         new MouseMotionAdapter() {  // clase interna anónima

            // manejar evento de arrastrar el ratón
            public void mouseDragged( MouseEvent evento )
            {
               x2 = evento.getX();
               y2 = evento.getY();
               repaint();
            }

         } // fin de la clase interna anónima

      ); // fin de la llamada a addMouseMotionListener

   } // fin del constructor de PanelAutoContenido

   // devolver anchura y altura preferidas de PanelAutoContenido
   public Dimension getPreferredSize()
   {
      return new Dimension( 150, 100 );
   }

   // pintar un óvalo en las coordenadas especificadas
   public void paintComponent( Graphics g )
   {
      super.paintComponent( g );

      g.drawOval( Math.min( x1, x2 ), Math.min( y1, y2 ),
         Math.abs( x1 - x2 ), Math.abs( y1 - y2 ) );
   }

} // fin de la clase PanelAutoContenido

Descargar código fuente

Uso de un objeto JSlider

(contiene dos clases)

// Uso de objetos JSlider para ajustar el tamaño de un óvalo.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class DemoSlider extends JFrame {
   private JSlider sliderDiametro;
   private PanelOvalo miPanel;

   // configurar GUI
   public DemoSlider()
   {
      super( "Demostración de JSlider" );

      // establecer PanelOvalo
      miPanel = new PanelOvalo();
      miPanel.setBackground( Color.YELLOW );

      // establecer objeto JSlider para controlar el valor del diámetro
      sliderDiametro =
         new JSlider( SwingConstants.HORIZONTAL, 0, 200, 10 );
      sliderDiametro.setMajorTickSpacing( 10 );
      sliderDiametro.setPaintTicks( true );

      // registrar componente de escucha de eventos de JSlider
      sliderDiametro.addChangeListener(

         new ChangeListener() {  // clase interna anónima

            // manejar cambio en el valor del control deslizable
            public void stateChanged( ChangeEvent e )
            {
               miPanel.establecerDiametro( sliderDiametro.getValue() );
            }

         } // fin de la clase interna anónima

      ); // fin de la llamada a addChangeListener

      // adjuntar componentes al panel de contenido
      Container contenedor = getContentPane();
      contenedor.add( sliderDiametro, BorderLayout.SOUTH );
      contenedor.add( miPanel, BorderLayout.CENTER );

      setSize( 220, 270 );
      setVisible( true );

   } // fin del constructor de DemoSlider

   public static void main( String args[] )
   {
      JFrame.setDefaultLookAndFeelDecorated(true);
      DemoSlider aplicacion = new DemoSlider();
      aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
   }

} // fin de la clase DemoSlider
// Una clase JPanel personalizada.
import java.awt.*;
import javax.swing.*;

public class PanelOvalo extends JPanel {
   private int diametro = 10;

   // dibujar un óvalo del diámetro especificado
   public void paintComponent( Graphics g )
   {
      super.paintComponent( g );

      g.fillOval( 10, 10, diametro, diametro );
   }

   // validar y establecer el diámetro, después repintar
   public void establecerDiametro( int nuevoDiametro )
   {
      // si el diámetro es inválido, usar valor predeterminado de 10
      diametro = ( nuevoDiametro >= 0 ? nuevoDiametro : 10 );
      repaint();
   }

   // utilizado por el administrador de esquemas para determinar el tamaño preferido
   public Dimension getPreferredSize()
   {
      return new Dimension( 200, 200 );
   }

   // utilizado por el administrador de esquemas para determinar el tamaño mínimo
   public Dimension getMinimumSize()
   {
      return getPreferredSize();
   }

} // fin de la clase PanelOvalo

Descargar código fuente

Los ejercicios utilizados en este post están basados en ejemplos del libro Cómo programar en Java de Deitel, y por lo tanto están bajo la licencia que esta editorial disponga.

18 Comentarios | deja el tuyo

Un enlace entrante

17 Comentarios en “[código] GUIs en Java – áreas de texto, paneles y scrolls”

  1. xavier alias vieja dice:

    q buena esta la pagina cuando tenga alguna duda de hacer algo a donde te puedo escribir

  2. enoc dice:

    Tu pagina es interesante , Estoy aprediendo a utilizar los beneficios de java swing pero tengo dudas a la hora de crear los paneles es decir , quiero deplegar una ventana el la cual el usuario escriba el nombre del archivo de texto y despliegue ese archivo en la pantalla, lo de leer archivos lo tengo , pero presento dificultad al momento de crear mi panel para la captura .. espero que no molestar y q sea de provecho su ayuda…

  3. Cristian dice:

    @enoc, no entiendo muy bien la duda que tienes. Sin embrago, si ya llevas algo de código puedes plantear tu problema en el subforo de Java del Foro de elhacker.net.

    Un saludo!

  4. Enmanuel dice:

    Oye eres genial crees q puedes acerme un Espiral mira q no me sale d ninguna forma porfavor t lo pido saludes.
    ta chida tu pagina

  5. ChXt0 dice:

    Que tal, una pregunta ¿para qué es exactamente super.paintComponent(g) ?
    Porque me doy cuenta de que en el método paintComponent siempre es la primera instrucción.

    Saludos.

    • Cristian dice:

      Hola ChXt0,

      El super.paintComponent(g) se usa para pasar el objeto tipo Graphics que permitirá que las cosas se muestren en la super clase, es decir, que se muestren en el panel. El método paintComponent es el equivalente al viejo método paint() que se manejaba en AWT.

      Un saludo!

  6. Ma. Eugenia dice:

    disculpa xfas me ayudar en hacer o indicarme cómo hacer uan barra de progreso para indicar el tiempo que un jugador tiene para jugar en est caso lo deseo formar una palabra en Scrabble…gracias!!

  7. Talavang dice:

    bastante util tu info

    si tienes mas clases para crear interfases graficas… subelas porfavor

    agregando a favoritos

  8. arturo anto dice:

    Gracias al contenido de tu pagina pude hacer un paint que tenia de tarea

    Muchas Gracias

  9. fernando dice:

    disculpa podrias enviarme un ejemplo de uso de jmenu no c si este bien pero quiero usar un jpanel para que cuando el usuario elija una accion del menu muestre los componentes de dicha accion y cuando elija ottra accion borre lo mostrado y me muestre el otro jpanel con los componentes indicados no c Jlabel y jtextfields te agradecere,

  10. baiarri dice:

    para info de metodos i clases:
    http://java.sun.com/javaee/6/docs/api/
    y no molesten al chaval.
    Grácias.

  11. fires dice:

    Muy buena tu pagina. Estoy realizando un paint en java, y ya dibuja óvalos, rectángulos, etc. Pero no logro hacerlo con un circulo.No se como hallar el diámetro. Hago con eventos, osea los puntos que realiza el usuario, y con eso quiero hacer un circulo. Si me puedes decir como hacerlo.
    Desde ya muchas gracias saludos

  12. Sandra dice:

    Hola, tengo una gran duda:

    Estoy haciendo una aplicación web mediante el Netbeans a través del Jframe, y tras haber añadido al Jframe una barra menú con las opciones Editar (Copiar, Cortar, Pegar…), ahora debo programarlo para que me funcionen. Entonces tengo que dar a Copiar(botón derecho)->Eventos->ActionPerfomed y de ahí me lleva al código del botón Copiar, y asi para todos los botones

    private void JMenuItem10ActionPerfomed(java.awt.event.ActionEve nt evt)
    {
    ……..
    }

    Que tengo que poner en los puntos suspensivos para que me funcionen los botones Copiar, Cortar, Pegar, Seleccionar Todo, Borrar Seleccionado.

    Gracias

  13. erick dice:

    hola soy algo nuevo con lo de las interfaces en java y mecuesta trabajo acerlo pero queisiera saber como se podria acer el metodo de ordenamiento por inserccion directa con interface sencuçilla
    muy buena pagina por cierto gracias por su atyencion

  14. alex dice:

    hola perdon las molestias pero necesito hacer un trabajo para la u y ya lo intento de una y otra manera y como soy novata en esta trato de modificar unos q tengo pero no me resulta alguien me podria ayudar… lo quiero hacer cn interfaz grafica.. pero no mismo puedo

¡Déjanos tu comentario!