Botones, Iconos y Objetos de Formulario

Botones

Una vez visto el funcionamiento y cualidades de los botones vamos a ver distintos tipos de ellos y distintos comportamientos.

// Botones.java
import javax.swing.*;
import javax.swing.plaf.basic.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;
import net.juantxu.swing.*;

public class Botones extends JApplet{
	JButton jb = new JButton("Boton");
	BasicArrowButton arriba = new BasicArrowButton(BasicArrowButton.NORTH),
			 abajo = new BasicArrowButton(BasicArrowButton.SOUTH),
			 este = new BasicArrowButton(BasicArrowButton.EAST),		
			 oeste = new BasicArrowButton(BasicArrowButton.WEST);
	public void init(){
		Container cp = getContentPane();
		cp.setLayout(new FlowLayout() );
		cp.add(jb);
		cp.add(new JToggleButton("JToggleButton") );
		cp.add(new JCheckBox("JCheckBox") );
		cp.add(new JRadioButton("JRadioButton"));
		JPanel jp = new JPanel();
		jp.setBorder(new TitledBorder("direciones"));
		jp.add(arriba);
		jp.add(abajo);
		jp.add(este);
		jp.add(oeste);
		cp.add(jp);
	}
	public static void main(String[] args){
		Console.run(new Botones(), 400, 200);
	}
}

y esto queda así.

Grupos de Botones

Cualquier boton se puede incluir en un ButtonGroup para que funciones como si fueran un grupo de botones exclusivos ( OR ) Para no escribir demasiado código vamos a utilizar la reflectividad del código para generar diferentes grupos.

// GrupoDeBotones.java
// Usaremos la reflectividad del código par generar diferentes grupos


import java.lang.reflect.*;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;
import net.juantxu.swing.*;

public class GrupoDeBotones extends JApplet{
	static String[] ids = {	"Pepito", "Juanito", "Antoñito", "Susi", "Mari", "Pepa" };

	static JPanel hacerPanel(Class clase, String[] ids){
		ButtonGroup bg = new ButtonGroup();
		JPanel jp = new JPanel();
		String titulo = clase.getName();
		titulo = titulo.substring(titulo.lastIndexOf('.')+1);
		jp.setBorder( new TitledBorder(titulo) );
		for(int i=0; i< ids.length; i++){
			AbstractButton ab = new JButton("Fallo");
			try{
				// lograr el método constructor dinámico que toma un argumento string
				Constructor ctor = clase.getConstructor( new Class[]{String.class} );
				// crar un objeto nuevo
				ab = (AbstractButton)ctor.newInstance( new Object[]{ ids[i]} );
			} catch(Exception ex){
				System.err.println("No se puede crear " + clase);		
			}
			bg.add(ab);
			jp.add(ab);
		}
		return jp;	
	}
	public void init(){
		Container cp = getContentPane();
		cp.setLayout(new FlowLayout() );
		cp.add(hacerPanel(JButton.class, ids) );
		cp.add(hacerPanel(JToggleButton.class, ids) );
		cp.add(hacerPanel(JCheckBox.class, ids) );
		cp.add(hacerPanel(JRadioButton.class, ids) );
	}
	public static void main(String[] args){
		Console.run(new GrupoDeBotones(), 500, 300);	
	}
}

Aqui puedes ver el resultado

Voy a explicar un poco como ha ido esto. He creado un método hacerPanel que recibe una clase, como nombre de clase, y un array de ids. Entonces crea un grupo de botones, un panel para poner los botones y un titulo para el panel. entonces extrae el nombre de la clase que le he pasado para ponerla en el borde. A partir de ahi inicializa un boton abstracto al cual llamará fallo, para en caso de algún error nos avise. Por fin, intenta… coger el constructor de la clase que le hemos pasado y crea un array de clases ( Class[] ) y por fin crear una nueva instancia de esa clase convirtiendola a abstractButton para que así quepan todos (polimorfismo). Y esto lo hace para cada id, mira el bucle for.

Iconos

Como puedes ver se puede asignar un icono a cualquier botón. Yo he usado png. pero tambien pueden ser gif. (los demás no los he probado).

// Iconos.java
// Usaremos la reflectividad del código par generar diferentes grupos
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import net.juantxu.swing.*;

public class Iconos extends JApplet{
// Para ejecutar el applet se deve especificar la ruta
static String ruta = "/home/juantxu/java/applets/iconos/iconos/";
static Icon[] iconos = {
	new ImageIcon(ruta + "a.png"),
	new ImageIcon(ruta + "b.png"),
	new ImageIcon(ruta + "c.png"),
	new ImageIcon(ruta + "d.png"),
	new ImageIcon(ruta + "e.png"),
	new ImageIcon(ruta + "f.png"),
	new ImageIcon(ruta + "g.png"),
};
JButton jb = new JButton("JButton", iconos[0]),
	jb2 = new JButton("Deshabilitar");
boolean activo = false;
	public void init(){
		Container cp = getContentPane();
		cp.setLayout(new FlowLayout() );
	jb.addActionListener( new ActionListener(){
							public void actionPerformed(ActionEvent e){
									if(activo){
										jb.setIcon(iconos[2]);
										activo = false;
									}else{
										jb.setIcon(iconos[1]);
										activo = true;
									}	
									jb.setVerticalAlignment(JButton.TOP);
									jb.setHorizontalAlignment(JButton.LEFT);
								}
						} );
	jb.setRolloverEnabled(true);
	jb.setRolloverIcon(iconos[3]);
	jb.setPressedIcon(iconos[4]);
	jb.setDisabledIcon(iconos[5]);
	jb.setToolTipText(" ¡ OLÉ ! " );
	cp.add(jb);
	jb2.addActionListener(new ActionListener() {
							public void actionPerformed(ActionEvent e){
									if(jb.isEnabled() ){
										jb.setEnabled(false);
										jb2.setText("Habilitar");
									}else{
										jb.setEnabled(true);
										jb2.setText("Deshabilitar");
									}
							}
						} );
	cp.add(jb2);	
	}
	public static void main(String[] args){
		Console.run(new Iconos(), 500, 300);	
	}
}

Campos de Texto

//CamposTexto.java
// clase para mostrar el uso del parser xml
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import java.awt.*;
import java.awt.event.*;
import net.juantxu.swing.*;  // utilidades para ver applets por consola
public class CamposTexto extends JApplet{
	JButton
		b1 = new JButton("Leer Texto"),
		b2 = new JButton("Poner Texto");
	JTextField
		t1 = new JTextField(30),
		t2 = new JTextField(30),
		t3 = new JTextField(30);
	String s = new String();
	DocumentoMayusculas ucd = new DocumentoMayusculas();
	public void init(){
		t1.setDocument(ucd);
		ucd.addDocumentListener(new T1() );
		b1.addActionListener(new B1() );
		b2.addActionListener(new B2() );
		DocumentListener d1 = new T1();
		t1.addActionListener(new T1A() );
		Container cp = getContentPane();
		cp.setLayout(new FlowLayout() );
		cp.add(b1);
		cp.add(b2);
		cp.add(t1);
		cp.add(t2);
		cp.add(t3);
	}


	class T1 implements DocumentListener{
		public void changedUpdate(DocumentEvent e){}
		public void insertUpdate(DocumentEvent e){
			t2.setText(t1.getText() );
			t3.setText("Texto : "+t1.getText() );
		}
		public void removeUpdate(DocumentEvent e){
			t2.setText(t1.getText() );
		}
	}
	class T1A implements ActionListener{
		private int contador = 0;
		public void actionPerformed(ActionEvent e){
			t3.setText("t1 Action Event " + contador++);	
		}
	}	
	class B1 implements ActionListener{
		public void actionPerformed(ActionEvent e){
			if(t1.getSelectedText() == null){
				s = t1.getText();
			}else{
				s = t1.getSelectedText();
			}
			t1.setEditable(true);
		}
	}
	class B2 implements ActionListener{
		public void actionPerformed(ActionEvent e){
			ucd.setUpperCase(false);
			t1.setText("Insertado por el boton 2 : " + s);
			ucd.setUpperCase(true);
			t1.setEditable(false);
		}
	}
	public static void main(String[] args){
		Console.run(new CamposTexto(), 400, 200);
	}
}
class DocumentoMayusculas extends PlainDocument{
	boolean mayusculas = true;
	public void setUpperCase(boolean flag){
		mayusculas = flag;
	}
	public void insertString(int offset, String string, AttributeSet attributeset) throws BadLocationException{
		if(mayusculas)
			string = string.toUpperCase();
		super.insertString(offset, string, attributeset);
	}
}

Y te quedará algo tal que así :asi … mmm… Bueno. He hecho una pequeña trampa. he quitado el include de net.juantxu.swing y el método main que es lo que me permite ejecutarlo desde consola.

 
java/29.txt · Última modificación: 2008/05/13 10:00 (editor externo)
 
Excepto donde se indique lo contrario, el contenido de esta wiki se autoriza bajo la siguiente licencia:CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki