Diseñador Online Boton

Diseñador Online Boton

Aunque es un ejemplo sencillo, conozco personas en las que saber como quedara un componente se vuelve bastante frustrante al tener que escribir el codigo y tener que ejecutarlo para saber como se vera, estoy obvio al no usar el editor de Netbeans o algun plugin para los demas editores, es un ejemplo sencillo de como podemos crear nuestros propios editores o diseñadores de componentes.

Codigo

Clase Principal

package clases;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;

@SuppressWarnings("serial")
public class Principal extends JApplet{
 
 JSplitPane split;
 JPanel canvas, propiedades;
 JZJButton boton;
 
 public void init(){
 
  setLayout(new BorderLayout());
 
  split=new JSplitPane();
 
  canvas=new JPanel();
  canvas.setLayout(null);
 
  boton=new JZJButton("Boton");
  boton.setBounds(100, 100, 80, 30);
 
  canvas.add(boton);
 
  propiedades=new JPanel();

   JScrollPane scroll=new JScrollPane(boton.obtenerTabla());
  scroll.setPreferredSize(new Dimension(220,220));
 
  propiedades.add(scroll);
 
  split.setLeftComponent(canvas);
  split.setRightComponent(propiedades);
 
  split.setResizeWeight(0.6);
 
  JPanel codigo=new JPanel();
  JButton btn=new JButton("Generar Codigo");
  btn.addActionListener(new ActionListener() {
   
   @Override
   public void actionPerformed(ActionEvent arg0) {
    boton.generarCodigo();
    new FormaCodigo(boton.prop);
   }
  });
  codigo.add(btn);
 
  add(split,BorderLayout.CENTER);
  add(codigo,BorderLayout.SOUTH);
 
  setBounds(0, 0, 500, 300);
  setVisible(true);
 }

}

Clase JZJButton

package clases;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.awt.event.*;
import java.util.ArrayList;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.table.DefaultTableModel;

import clases.ComboColores;
import clases.EditorTabla;
import clases.RenderTabla;

@SuppressWarnings("serial")
public class JZJButton extends JButton{
 
 private RenderTabla ert;
 private EditorTabla et;
 
 public JComboBox<Integer> tamañofuente;
 public JComboBox<String> combofuentes;
 public JComboBox<String> estiloFuente;
 public ComboColores coloresforeground;
 public ComboColores coloresbackground;
 public JCheckBox visible;
 public JCheckBox habilitado;
 public JCheckBox opaque;
 public JCheckBox border;
 public JCheckBox filled;
 public JCheckBox rollover;
 public String imgseleccionada="";
 JTextField txt;
 JTable tabla;
 
 String[] prop=new String[14];
 
 public JZJButton(String texto){
  super(texto);
  txt=new JTextField();
  coloresforeground=new ComboColores();
  String fuentes[]=GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
  combofuentes=new JComboBox<String>(fuentes);
  Integer tamaños[]={6,7,8,9,10,11,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40};
  tamañofuente=new JComboBox<Integer>(tamaños);
  String estilo[]={" ","Negrita","Cursiva","Plana"};
  estiloFuente=new JComboBox<String>(estilo);
  coloresbackground=new ComboColores();
  visible=new JCheckBox();
  habilitado=new JCheckBox();
  opaque=new JCheckBox();
  border=new JCheckBox();
  filled=new JCheckBox();
  rollover=new JCheckBox();
 
  restablecerValores();
 }
 
 public void generarCodigo(){
  prop[0]="JButton btn=new JButton();";
  prop[1]="btn.setText(\""+getText()+"\");";
  prop[2]="btn.setBounds("+tabla.getValueAt(1, 1).toString()+","+tabla.getValueAt(2, 1).toString()+","+tabla.getValueAt(3, 1).toString()+","+tabla.getValueAt(4, 1).toString()+");";
  if(!coloresbackground.getSelectedItem().toString().equalsIgnoreCase("")){
   prop[3]="btn.setBackground(Color."+coloresbackground.getSelectedItem().toString()+");";
  }
  if(estiloFuente.getSelectedIndex()==1){
   prop[4]="btn.setFont(new Font(\""+combofuentes.getSelectedItem().toString()+"\",Font.BOLD,"+tamañofuente.getSelectedItem().toString()+"));";
  }else{
   if(estiloFuente.getSelectedIndex()==2){
    prop[4]="btn.setFont(new Font(\""+combofuentes.getSelectedItem().toString()+"\",Font.ITALIC,"+tamañofuente.getSelectedItem().toString()+"));";
   }else{
    prop[4]="btn.setFont(new Font(\""+combofuentes.getSelectedItem().toString()+"\",Font.PLAIN,"+tamañofuente.getSelectedItem().toString()+"));";
   }
  }
  if(!coloresforeground.getSelectedItem().toString().equalsIgnoreCase("")){
   prop[5]="btn.setForeground(Color."+coloresforeground.getSelectedItem().toString()+");";
  }
  if(getToolTipText()!=null){
   prop[6]="btn.setToolTipText(\""+getToolTipText()+"\");";
  }
  if(visible.isSelected()){
   prop[7]="btn.setVisible(true);";
  }else{
   prop[7]="btn.setvisible(false);";
  }
  if(habilitado.isSelected()){
   prop[8]="btn.setEnabled(true);";
  }else{
   prop[8]="btn.setEnabled(false);";
  }
  if(opaque.isSelected()){
   prop[9]="btn.setOpaque(true);";
  }else{
   prop[9]="btn.setOpaque(false);";
  }
  if(border.isSelected()){
   prop[10]="btn.setBorderPainted(true);";
  }else{
   prop[10]="btn.setBorderPainted(false);";
  }
  if(filled.isSelected()){
   prop[11]="btn.setContentAreaFilled(true);";
  }else{
   prop[11]="btn.setContentAreaFilled(false);";
  }
  if(rollover.isSelected()){
   prop[12]="btn.setRolloverEnabled(true);";
  }else{
   prop[12]="btn.setRolloverEnabled(false);";
  }
 }
 
 public void restablecerValores(){
  coloresforeground.setSelectedItem(ComboColores.buscarColor(getForeground()));
  combofuentes.setSelectedItem(getFont().getFamily());
  tamañofuente.setSelectedItem(getFont().getSize());
  if(getFont().getStyle()==Font.BOLD){
   estiloFuente.setSelectedIndex(1);
  }else{
   if(getFont().getStyle()==Font.ITALIC){
    estiloFuente.setSelectedIndex(2);
   }else{
    if(getFont().getStyle()==Font.PLAIN){
     estiloFuente.setSelectedIndex(3);
    }
   }
  }
  coloresbackground.setSelectedItem(ComboColores.buscarColor(getBackground()));
  visible.setSelected(isVisible());
  habilitado.setSelected(isEnabled());
  opaque.setSelected(isOpaque());
  border.setSelected(isBorderPainted());
  filled.setSelected(isContentAreaFilled());
  rollover.setSelected(isRolloverEnabled());
 }

 public JTable obtenerTabla(){
  DefaultTableModel modelo=new DefaultTableModel();
  String datos[][]=new String[17][2];
  String columnas[]={"Propiedades","Valor"};
 
  datos[0][0]="Texto";
  datos[0][1]=getText();
  datos[1][0]="X";
  datos[1][1]=""+getLocation().x;
  datos[2][0]="Y";
  datos[2][1]=""+getLocation().y;
  datos[3][0]="Ancho";
  datos[3][1]=""+getWidth();
  datos[4][0]="Alto";
  datos[4][1]=""+getHeight();
  datos[5][0]="Color Fondo";
  datos[5][1]=""+getBackground();
  datos[6][0]="Familia Fuente";
  datos[6][1]=""+getFont().getName();
  datos[7][0]="Estilo fuente";
  datos[7][1]=""+getFont().getName();
  datos[8][0]="Tamaño Fuente";
  datos[8][1]=""+getFont().getSize();
  datos[9][0]="Color Texto";
  datos[9][1]=""+getForeground();
  datos[10][0]="ToolTip Text";
  datos[10][1]=""+getToolTipText();
  datos[11][0]="Visible";
  datos[11][1]=""+isVisible();
  datos[12][0]="Habilitado";
  datos[12][1]=""+isEnabled();
  datos[13][0]="Opaque";
  datos[13][1]=""+isOpaque();
  datos[14][0]="Border Painted";
  datos[14][1]=""+isBorderPainted();
  datos[15][0]="Content Area Filled";
  datos[15][1]=""+isContentAreaFilled();
  datos[16][0]="Rollover Enabled";
  datos[16][1]=""+isRolloverEnabled();
 
  modelo=new DefaultTableModel(datos, columnas);
  tabla=new JTable(modelo){
   @Override
   public boolean isCellEditable(int row, int column) {
    // TODO Auto-generated method stub
    if(column==0){
     return false;
    }else{
     return true;
    }
   }
  };
  tabla.setRowHeight(25);
  txt.addActionListener(new ActionListener() {
   
   @Override
   public void actionPerformed(ActionEvent arg0) {
    if(tabla.getSelectedRow()==0){
     JZJButton.this.setText(txt.getText());
    }
    if(tabla.getSelectedRow()==1){
     JZJButton.this.setLocation(Integer.parseInt(txt.getText()), Integer.parseInt(tabla.getValueAt(2, 1).toString()));
    }
    if(tabla.getSelectedRow()==2){
     JZJButton.this.setLocation(Integer.parseInt(tabla.getValueAt(3, 1).toString()),Integer.parseInt(txt.getText()));
    }
    if(tabla.getSelectedRow()==3){
     JZJButton.this.setBounds(Integer.parseInt(tabla.getValueAt(1, 1).toString()), Integer.parseInt(tabla.getValueAt(2, 1).toString()), Integer.parseInt(txt.getText()), Integer.parseInt(tabla.getValueAt(4, 1).toString()));
    }
    if(tabla.getSelectedRow()==4){
     JZJButton.this.setBounds(Integer.parseInt(tabla.getValueAt(1, 1).toString()), Integer.parseInt(tabla.getValueAt(2, 1).toString()), Integer.parseInt(tabla.getValueAt(3, 1).toString()),Integer.parseInt(txt.getText()));
    }
    if(tabla.getSelectedRow()==10){
     if(!txt.getText().equalsIgnoreCase("null")){
      JZJButton.this.setToolTipText(txt.getText());
     }else{
      JZJButton.this.setToolTipText(null);
     }
    }
    tabla.setValueAt(txt.getText(), tabla.getSelectedRow(), tabla.getSelectedColumn());
   }
  });
  ert=new RenderTabla();
  et=new EditorTabla(txt);
 
  coloresforeground.addItemListener(new ItemListener() {
   
   @Override
   public void itemStateChanged(ItemEvent arg0) {
    JZJButton.this.setForeground(coloresforeground.getColorSeleccionado(coloresforeground.getSelectedIndex()));
   }
  });
 
  combofuentes.addItemListener(new ItemListener() {
   
   @Override
   public void itemStateChanged(ItemEvent arg0) {
    JZJButton.this.setFont(new Font(combofuentes.getSelectedItem().toString(),JZJButton.this.getFont().getStyle(),JZJButton.this.getFont().getSize()));
   }
  });
 
  tamañofuente.addItemListener(new ItemListener() {
   
   @Override
   public void itemStateChanged(ItemEvent arg0) {
    JZJButton.this.setFont(new Font(JZJButton.this.getFont().getFamily(),JZJButton.this.getFont().getStyle(),Integer.parseInt(tamañofuente.getSelectedItem().toString())));
   }
  });
 
  estiloFuente.addItemListener(new ItemListener() {
   
   @Override
   public void itemStateChanged(ItemEvent arg0) {
    if(estiloFuente.getSelectedItem().toString().equalsIgnoreCase("Negrita")){
     JZJButton.this.setFont(new Font(JZJButton.this.getFont().getFamily(),Font.BOLD,JZJButton.this.getFont().getSize()));
    }else{
     if(estiloFuente.getSelectedItem().toString().equalsIgnoreCase("Cursiva")){
      JZJButton.this.setFont(new Font(JZJButton.this.getFont().getFamily(),Font.ITALIC,JZJButton.this.getFont().getSize()));
     }else{
      if(estiloFuente.getSelectedItem().toString().equalsIgnoreCase("Plana")){
       JZJButton.this.setFont(new Font(JZJButton.this.getFont().getFamily(),Font.PLAIN,JZJButton.this.getFont().getSize()));
      }
     }
    }
   }
  });
 
  coloresbackground.addItemListener(new ItemListener() {
   
   @Override
   public void itemStateChanged(ItemEvent arg0) {
    JZJButton.this.setBackground(coloresbackground.getColorSeleccionado(coloresbackground.getSelectedIndex()));
   }
  });
 
  visible.addChangeListener(new ChangeListener() {
   
   @Override
   public void stateChanged(ChangeEvent arg0) {
    if(visible.isSelected()){
     JZJButton.this.setVisible(true);
    }else{
     JZJButton.this.setVisible(false);
    }
   }
  });
 
  habilitado.addChangeListener(new ChangeListener() {
   
   @Override
   public void stateChanged(ChangeEvent arg0) {
    if(habilitado.isSelected()){
     JZJButton.this.setEnabled(true);
    }else{
     JZJButton.this.setEnabled(false);
    }
   }
  });
 
  opaque.addChangeListener(new ChangeListener() {
   
   @Override
   public void stateChanged(ChangeEvent arg0) {
    if(opaque.isSelected()){
     JZJButton.this.setOpaque(true);
    }else{
     JZJButton.this.setOpaque(false);
    }
   }
  });
 
  border.addChangeListener(new ChangeListener() {
   
   @Override
   public void stateChanged(ChangeEvent arg0) {
    if(border.isSelected()){
     JZJButton.this.setBorderPainted(true);
    }else{
     JZJButton.this.setBorderPainted(false);
    }
   }
  });
 
  filled.addChangeListener(new ChangeListener() {
   
   @Override
   public void stateChanged(ChangeEvent arg0) {
    if(filled.isSelected()){
     JZJButton.this.setContentAreaFilled(true);
    }else{
     JZJButton.this.setContentAreaFilled(false);
    }
   }
  });
 
  rollover.addChangeListener(new ChangeListener() {
   
   @Override
   public void stateChanged(ChangeEvent arg0) {
    if(rollover.isSelected()){
     JZJButton.this.setRolloverEnabled(true);
    }else{
     JZJButton.this.setRolloverEnabled(false);
    }
   }
  });

  agregarComponenteRenderEditor(coloresbackground, 5);
  agregarComponenteRenderEditor(combofuentes, 6);
  agregarComponenteRenderEditor(estiloFuente, 7);
  agregarComponenteRenderEditor(tamañofuente, 8);
  agregarComponenteRenderEditor(coloresforeground, 9);
  agregarComponenteRenderEditor(visible, 11);
  agregarComponenteRenderEditor(habilitado, 12);
  agregarComponenteRenderEditor(opaque, 13);
  agregarComponenteRenderEditor(border, 14);
  agregarComponenteRenderEditor(filled, 15);
  agregarComponenteRenderEditor(rollover, 16);
  tabla.getColumn("Valor").setCellEditor(et);
  tabla.getColumn("Valor").setCellRenderer(ert);
  tabla.getTableHeader().setReorderingAllowed(false);
  return tabla;
 }
 
 public void agregarComponenteRenderEditor(Component c, int r){
  et.setComponente(c, r);
  ert.setComponente(c, r);
 }
}

Clase EditorTabla

package clases;

import java.awt.Component;
import java.util.EventObject;
import java.util.Vector;

import javax.swing.DefaultCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.event.CellEditorListener;

public class EditorTabla extends DefaultCellEditor{

 Vector<Component> componentes;
 Vector<Integer> filas;
 JTextField txt;
 
 public EditorTabla(JTextField t) {
  super(t);
  txt=t;
  componentes=new Vector<Component>();
  filas=new Vector<Integer>();
 }
 
 public void setComponente(Component c, int r){
  componentes.add(c);
  filas.add(r);
 }
 
 @Override
 public void addCellEditorListener(CellEditorListener arg0) {
 }

 @Override
 public void cancelCellEditing() {
 }

 @Override
 public Object getCellEditorValue() {
  // TODO Auto-generated method stub
  for(int i=0;i<componentes.size();i++){
   if(componentes.get(i).getClass().getName().equalsIgnoreCase("clases.ComboColores")){
    return ((ComboColores)componentes.get(i)).getSelectedItem();
   }
   if(componentes.get(i) instanceof JCheckBox){
    return ((JCheckBox)componentes.get(i)).isSelected();
   }
  }
  return txt.getText();
 }

 @Override
 public boolean isCellEditable(EventObject arg0) {
  return true;
 }

 @Override
 public void removeCellEditorListener(CellEditorListener arg0) {
  // TODO Auto-generated method stub
 }

 @Override
 public boolean shouldSelectCell(EventObject arg0) {
  // TODO Auto-generated method stub
  return true;
 }

 @Override
 public boolean stopCellEditing() {
  // TODO Auto-generated method stub
  return true;
 }
 
 @Override
 public Component getTableCellEditorComponent(JTable table, Object value,
   boolean isSelected, int row, int column) {
  Component cell=super.getTableCellEditorComponent(table, value, isSelected, row, column);
  for (int i=0;i<componentes.size();i++) {
            if(row==filas.get(i) && column==1){
             return componentes.get(i);
            }
        }
  return cell;
 }

}

Clase RenderTabla

package clases;

import java.awt.Component;
import java.util.Vector;

import javax.swing.DefaultCellEditor;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class RenderTabla extends DefaultTableCellRenderer{

 Vector<Component> componentes;
 Vector<Integer> filas;
 
 public RenderTabla(){
  super();
  componentes=new Vector<Component>();
  filas=new Vector<Integer>();
 }
 public void setComponente(Component c, int r){
  componentes.add(c);
  filas.add(r);
 }

 @Override
 public Component getTableCellRendererComponent(JTable table, Object value,
   boolean isSelected, boolean hasFocus, int row, int column) {
  Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
  for (int i=0;i<componentes.size();i++) {
            if(row==filas.get(i) && column==1){
             return componentes.get(i);
            }
        }
  return cell;
 }

}

Clase ComboColores

package clases;

import java.awt.Color;

import javax.swing.JComboBox;

public class ComboColores extends JComboBox<String>{
 
 static Color colordefecto=null;
 static String nombres[]={"","RED","GREEN","BLUE","WHITE","BLACK","GRAY","PINK","CYAN","DARK
 GRAY"
,"LIGHT GRAY","MAGENTA","ORANGE","YELLOW"};
 static Color colores[]={colordefecto,Color.RED,Color.GREEN,Color.BLUE,Color.WHITE,Color.BLACK,Color.GRAY
,Color.PINK,Color.CYAN,Color.DARK_GRAY,Color.LIGHT_GRAY,Color.MAGENTA,
Color.ORANGE,Color.YELLOW};
 
 public ComboColores(){
  super(nombres);
 }
 
 public String getNombreColor(int seleccionado){
  return nombres[seleccionado];
 }
 
 public Color getColorSeleccionado(int seleccionado){
  return colores[seleccionado];
 }
 
 public static Color buscarColor(String color){
  Color c=null;
  for(int i=0;i<nombres.length;i++){
   if(nombres[i].equalsIgnoreCase(color)){
    c= colores[i];
   }
  }
  return c;
 }
 
 public static String buscarColor(Color color){
  String c="";
  for(int i=0;i<colores.length;i++){
   if(colores[i]==color){
    c= nombres[i];
   }
  }
  return c;
 }

}

Clase FormaCodigo

package clases;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class FormaCodigo extends JFrame{
 
 JTextArea txt;
 
 public FormaCodigo(String datos[]){
 
  txt=new JTextArea();
  for(int i=0;i<datos.length;i++){
   if(datos[i]!=null){
    txt.setText(txt.getText()+datos[i]+"\n");
   }
  }
 
  add(new JScrollPane(txt));
 
  setBounds(0, 0, 500, 400);
  setLocationRelativeTo(null);
  setVisible(true);
 
 }
}

Descarga

Podrán descargar el proyecto completo directamente desde aquí. Se incluyen los archivos fuentes, imágenes y JAR, recuerden visitar Java Zone por mas ejemplos.

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Sr. Negativo

Otra vez muy buen aporte

Como siempre, se aprende mucho de tus códigos.