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í.
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);
}
}
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.
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);
}
}
//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.