viernes, 3 de junio de 2016

Spring Framework y el ciclo de vida MVC

Spring Framerowk se adhiere el paradigma de programación Modelo-Vista-Controlador (MVC) para el desarrollo de sus proyectos.
Cuando se crea una aplicacion Java SE web todo se hace en torno a un Servlet central, que es el encargado de seleccionar que controlador se encarga de cada respuesta, y dentro de cada uno de estos controladores se realizan las tareas necesarias para servirla.

Spring Framework nos provee para desempeñar la tarea de Servlet central de DispatcherServlet, lo que hace especial a este Servlet, es que aparte de desempeñar las tareas de comunes de despachador, tiene una completa integración con Spring IoC.


Tal y como podemos ver en la imagen anterior, DispatcherServlet realiza las tareas de Controlador Frontal, delega en el Controlador de cada llamada las operaciones internas requeridas para realizar la respuesta y una vez que este le devuelve la información necesaria para emitir dicha respuesta DispatcherServlet delega en un ViewResolver el renderizado de la respuesta.
Típicamente esta acción se realizada con la clase ModelAndView, en dicha clase el Controlador cargaba los datos y el nombre de la vista para que esta fuera renderizada.

public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map myModel= new HashMap();
miModelo.put("integer_value", 500);
miModelo.put("string_value", "cadena aleatoria");
ModelAndView miMAV = new ModelAndView();
miMAV.setViewName("my_currently_view");
miMAV.addObject(myModel);
return miMAV;
}
Con la aparición de los Controladores por anotaciones (@Controller), esta operación ha variado significativamente, utilizandose la clase Model a través del Controlador para registrar los datos que serán utilizados por la vista, la cual es devuelta en el retorno del método del controlador.

martes, 4 de diciembre de 2012

Leer Excel desde Java con POI

Hola tal vez alguna ves hemos necesitado leer un archivo excel desde java y no hemos tenido idea de como hacerlo.
Bueno les traigo un método bien fácil y practico para esto necesitamos usar la api Apache POI.
Adjunto el código para que puedan observarlo.
Admite tanto Xls como Xlsx ,estan separados en métodos distintos para que observen las diferencias.
Para esto necesitaran los siguientes plugins:
  • xbean.jar
  • dom4j-2.0.0-ALPHA-2.jar ( o la version1.4 da lo mismo)
  • poi-ooxml-schemas-3.8-20120326.jar
  • poi-ooxml-3.8-20120326.jar
  • poi-3.8-20120326.jar
CODIGO EJEMPLO:

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**

 * @author jonathan-palomino.blogspot.com

 */

public class LectorExcel {

 boolean antiguo = false;
 /**

  * Este metodo es usado para leer archivos Excel

  *

  * @param Nombre_Archivo

  *            - Nombre de archivo Excel.

  */
 private void Leer_Archivo_Excel(String Nombre_Archivo) {

  /**

   * Crea una nueva instancia de Lista_Datos_Celda

   */

  List Lista_Datos_Celda = new ArrayList();

  if (Nombre_Archivo.contains(".xlsx")) {

   GENERAR_XLSX(Nombre_Archivo, Lista_Datos_Celda);

   antiguo = false;

  } else if (Nombre_Archivo.contains(".xls")) {

   GENERAR_XLS(Nombre_Archivo, Lista_Datos_Celda);

   antiguo = true;

  }

  /**

   * Llama el metodo Imprimir_Consola para imprimir los datos de la celda

   * en la consola.

   */

  Imprimir_Consola(Lista_Datos_Celda);

 }

 private void GENERAR_XLSX(String Nombre_Archivo, List Lista_Datos_Celda) {

  try {

   /**

    * Crea una nueva instancia de la clase FileInputStream

    */

   FileInputStream fileInputStream = new FileInputStream(

     Nombre_Archivo);

   /**

    * Crea una nueva instancia de la clase XSSFWorkBook

    */

   XSSFWorkbook Libro_trabajo = new XSSFWorkbook(fileInputStream);

   XSSFSheet Hoja_hssf = Libro_trabajo.getSheetAt(0);

   /**

    * Iterar las filas y las celdas de la hoja de cálculo para obtener

    * toda la data.

    */

   Iterator Iterador_de_Fila = Hoja_hssf.rowIterator();

   while (Iterador_de_Fila.hasNext()) {

    XSSFRow Fila_hssf = (XSSFRow) Iterador_de_Fila.next();

    Iterator iterador = Fila_hssf.cellIterator();

    List Lista_celda_temporal = new ArrayList();

    while (iterador.hasNext()) {

     XSSFCell Celda_hssf = (XSSFCell) iterador.next();

     Lista_celda_temporal.add(Celda_hssf);

    }

    Lista_Datos_Celda.add(Lista_celda_temporal);

   }

  } catch (Exception e) {

   e.printStackTrace();

  }

 }

 private void GENERAR_XLS(String Nombre_Archivo, List Lista_Datos_Celda) {

  try {

   /**

    * Crea una nueva instancia de la clase FileInputStream

    */

   FileInputStream fileInputStream = new FileInputStream(

     Nombre_Archivo);

   /**

    * Crea una nueva instancia de la clase POIFSFileSystem

    */

   POIFSFileSystem fsFileSystem = new POIFSFileSystem(fileInputStream);

   /**

    * Crea una nueva instancia de la clase HSSFWorkBook

    */

   HSSFWorkbook Libro_trabajo = new HSSFWorkbook(fsFileSystem);

   HSSFSheet Hoja_hssf = Libro_trabajo.getSheetAt(0);

   /**

    * Iterar las filas y las celdas de la hoja de cálculo para obtener

    * toda la data.

    */

   Iterator Iterador_de_Fila = Hoja_hssf.rowIterator();

   while (Iterador_de_Fila.hasNext()) {

    HSSFRow Fila_hssf = (HSSFRow) Iterador_de_Fila.next();

    Iterator iterador = Fila_hssf.cellIterator();

    List Lista_celda_temporal = new ArrayList();

    while (iterador.hasNext()) {

     HSSFCell Celda_hssf = (HSSFCell) iterador.next();

     Lista_celda_temporal.add(Celda_hssf);

    }

    Lista_Datos_Celda.add(Lista_celda_temporal);

   }

  } catch (Exception e) {

   e.printStackTrace();

  }

 }

 /**

  * Este método se utiliza para imprimir los datos de la celda a la consola.

  *

  * @param Datos_celdas

  *            - Listado de los datos que hay en la hoja de cálculo.

  */

 private void Imprimir_Consola(List Datos_celdas) {

  String Valor_de_celda;

  for (int i = 0; i < Datos_celdas.size(); i++) {

   List Lista_celda_temporal = (List) Datos_celdas.get(i);

   for (int j = 0; j < Lista_celda_temporal.size(); j++) {

    if (antiguo) {

     HSSFCell hssfCell = (HSSFCell) Lista_celda_temporal.get(j);

     Valor_de_celda = hssfCell.toString();

    } else {

     XSSFCell hssfCell = (XSSFCell) Lista_celda_temporal.get(j);

     Valor_de_celda = hssfCell.toString();

    }

    System.out.print(Valor_de_celda + "\t");

   }

   System.out.println();

  }

 }

 public static void main(String[] args) {

  String fileName = "C:" + File.separator + "Users" + File.separator

    + "synccon" + File.separator + "Desktop" + File.separator

    + "abc.xls";

  System.out.println(fileName);

  new LectorExcel().Leer_Archivo_Excel(fileName);

 }

}

martes, 10 de julio de 2012

Estructuras dinámicas

Hola ,hace mucho tiempo que tenemos estructuras optimas para guardar datos como las listas genéricas o los treemap pero a modo de ejemplo vamos a reinventar la rueda.
Lo que intentaremos haces es una estructura doble con 2 apuntadores en memoria para que así puedas ir de derecha a izquierda y viceversa en cualquier momento.
Nos referimos a un nodo doble aquí unas imágenes para obtener una idea.
inicio
Nodo inicial con 2 apuntadores inicialmente a null
fin
El nodo final con la misma idea.
Agreguemos una estructura nueva se vería así:
nodo1
Aqui vemos un nodo inicio apuntando hacia un nodo con datos.
Si aplicamos la misma idea tendremos lo siguiente:
nodo n
Entonces tenemos una estructura dinámica en memoria ya que los datos se pierden al cerrar el programa o si es que apuntan los nodos inicio y fin a nulo así el recolector de basura los elimina.
Vamos de plano al código:
/**
 *
 * @author jonathan-palomino.blogspot.com
 */
//Clase para una lista doble :
public class NodoDoble {
	private Productos Producto;// informacion
	private NodoDoble ApuntAnt;	// enlace con el anterior
	private NodoDoble ApuntSgte;// enlace con el siguiente

	// constructor
	NodoDoble(Productos Producto){this.Producto=Producto;}
//Esta clase productos será una clase que podrá contener N datos que se podrán setear desde un aplicativo algo así como capas.
	// get/set
        void setPro(Productos Producto){this.Producto=Producto;}
	void setApuntSgte(NodoDoble ApuntSgte){this.ApuntSgte=ApuntSgte;}
	void setApuntAnt(NodoDoble ApuntAnt){this.ApuntAnt = ApuntAnt;}

	Productos getPro(){return Producto;	}
	NodoDoble getApuntSgte(){return ApuntSgte;	}
	NodoDoble getApuntAnt(){return ApuntAnt;	}
}// fin de la clase de nodo doble
Para la clase enlazadora donde podremos poner la lógica de agregación para que trabaje.

/**
 *
 * @author jonathan-palomino.blogspot.com
 */
public class ListaDobleConOrden{
	private NodoDoble inicio;
	private NodoDoble fin;

	// constructor
	ListaDobleConOrden(){inicio=null; fin=null;}

	// get/set
	void setInicio(NodoDoble inicio){this.inicio=inicio;	}
	void setFin(NodoDoble fin){this.fin=fin;	}
	NodoDoble getInicio(){return inicio;	}
	NodoDoble getFin(){ return fin;	}

	// metodos de administracion
	void agrega(Productos Producto){
		NodoDoble nuevo, auxiliar;

		//...preparar nuevo nodo ...
 		nuevo = new NodoDoble(Producto);
		nuevo.setApuntSgte(null);
		nuevo.setApuntAnt(null);

		//...adicionar nuevo nodo a la lista...
		if(inicio == null) {
			//primer nodo
			inicio = nuevo;
			fin = inicio;
		} else //Por codigo orden
                if(Producto.getCodigo().compareTo(
                    inicio.getPro().getCodigo())<0) {
                    //antes del primer nodo
                    nuevo.setApuntSgte(inicio);
                    inicio.setApuntAnt(nuevo);
                    inicio = nuevo;
                } else
                if(Producto.getCodigo().compareTo(
                    fin.getPro().getCodigo())>0 ||
			Producto.getCodigo().compareTo(
                    fin.getPro().getCodigo())==0)	{
                    //después del último nodo
                    nuevo.setApuntAnt(fin);
                    fin.setApuntSgte(nuevo);
                    fin = nuevo;
		} else {
                    //entre dos nodos ya existentes
                    auxiliar = inicio;

                    // ubica el anterior
                    while(Producto.getCodigo().compareTo(
			auxiliar.getPro().getCodigo())>0||
			Producto.getCodigo().compareTo(
			auxiliar.getPro().getCodigo())==0) {
                auxiliar = auxiliar.getApuntSgte();
            }

                    // enlaza
                    nuevo.setApuntSgte(auxiliar);
                    nuevo.setApuntAnt(auxiliar.getApuntAnt());
                    auxiliar.getApuntAnt().setApuntSgte(nuevo);
                    auxiliar.setApuntAnt(nuevo);
		}
	}
	//.....busca un codigo en la lista
	NodoDoble busca(String codigo) {
            // empieza por el primero de la lista
            NodoDoble Auxiliar = inicio;

            // mientras no sea nulo
            while(Auxiliar != null)	{
		if(codigo.equals(Auxiliar.getPro().getCodigo()))
                    return Auxiliar;// lo encontró
		else
                    Auxiliar = Auxiliar.getApuntSgte(); // pasa al siguiente
	}// fin del while
	// terminó la lista y no lo encontró
	return null;
	}
}//fin de la clase ListaDobleConOrden
La clase productos solo es una clase de seteo u getteo de valores:
public class Productos {

private  String Codigo;
    // constructor vacío
    public Productos(){ }
    // constructor que recibe un objeto con datos
    public Productos(Productos obj)
    {
        Codigo = obj.getCodigo();
    }
    public String getCodigo() {
        return Codigo;
    }
    public void setCodigo(String Codigo) {
        this.Codigo = Codigo;
    }
}
Para ejemplo de uso:
public class Principal{
static ListaDobleConOrden ldco =new ListaDobleConOrden();
Productos Productos;
public static void main(String args[]){
ldco.setInicio(null);
    Productos =new Productos();
    Productos.setDescripcion( "abc" );
    ldco.agrega(Productos);
}
}
En caso necesites buscar algo se puede usar
NodoDoble auxiliar = Principal.ldco.busca(codigo);

viernes, 1 de junio de 2012

Jtable con Checkboxs

Si en alguna oportunidad has necesitado poner checkbox en un Jtable y no tubiste ni idea aquí veremos lo fácil que resulta.
Todo va dentro de un arreglo estático pero Uds pueden ponerlo en un for while u otra estructura de control antes de lanzar el agregado o la función getTable()
Adjunto el código:
/** 
* 
* @author http://jonathan-palomino.blogspot.com/ 
* 
*/ 
import javax.swing.SwingUtilities; 
import java.awt.BorderLayout; 
import javax.swing.JPanel; 
import javax.swing.JFrame; 
import javax.swing.UIManager;
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel;
public class J_table extends JFrame {
    private static final long serialVersionUID = 1L; 
    private JPanel jContentPane = null; 
    private JScrollPane scroll = null; 
    private JTable Table = null; 
    Object[] columnas = {"ACTIVOS", "NOMBRE", "EDAD"}; 
    Object[][] datos = { 
        {true,"JOSE",50}, 
        {false,"ANDREA",12}, 
        {true,"IVETTE",18}, 
        {false,"JUAN",18}};
    /** 
     * This method initializes scroll    
     *     
     * @return javax.swing.JScrollPane    
     */ 
    private JScrollPane getScroll() { 
        if (scroll == null) { 
            scroll = new JScrollPane(); 
            scroll.setViewportView(getTable()); 
        } 
        return scroll; 
    }
    /** 
     * This method initializes Table    
     *     
     * @return javax.swing.JTable    
     */ 
    private JTable getTable() { 
        if (Table == null) { 
             DefaultTableModel modelo = new DefaultTableModel(datos, columnas) { 
                    public Class getColumnClass(int column) { 
                        return getValueAt(1, column).getClass(); 
                    } 
                }; 
            Table = new JTable(modelo); 
           
        } 
        return Table; 
    }
    /** 
     * @param args 
     */ 
    public static void main(String[] args) { 
        // TODO Auto-generated method stub 
        SwingUtilities.invokeLater(new Runnable() { 
            public void run() { 
                try{ 
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
                }catch(Exception e) { 
                    e.printStackTrace(); 
                } 
                J_table thisClass = new J_table(); 
                thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
                thisClass.setVisible(true); 
            } 
        }); 
    }
    /** 
     * This is the default constructor 
     */ 
    public J_table() { 
        super(); 
        initialize(); 
    }
    /** 
     * This method initializes this 
     * 
     * @return void 
     */ 
    private void initialize() { 
        this.setSize(609, 281); 
        this.setContentPane(getJContentPane()); 
        this.setTitle("JTable con checkbox por http://jonathan-palomino.blogspot.com/"); 
        this.setLocationRelativeTo(null); 
    }
    /** 
     * This method initializes jContentPane 
     * 
     * @return javax.swing.JPanel 
     */ 
    private JPanel getJContentPane() { 
        if (jContentPane == null) { 
            jContentPane = new JPanel(); 
            jContentPane.setLayout(new BorderLayout()); 
            jContentPane.add(getScroll(), BorderLayout.CENTER); 
        } 
        return jContentPane; 
    }
} 

Jlabel editable con tecla Enter

En este caso podremos editar en tiempo de ejecución un Jlabel con la tecla Enter con lo cual lo podremos modificar a nuestro gusto.
Dejo el código para que lo prueben:

/** 
* 
* @author http://jonathan-palomino.blogspot.com/ 
* 
*/ 
import javax.swing.SwingUtilities; 
import java.awt.BorderLayout; 
import javax.swing.JPanel; 
import javax.swing.JFrame; 
import javax.swing.JTextField;
import java.awt.CardLayout; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent;
import javax.swing.JLabel; 
import java.awt.Font; 
import javax.swing.SwingConstants;
public class principal extends JFrame {
    private static final long serialVersionUID = 1L; 
    private JPanel jContentPane = null; 
    private JPanel panel_edicion = null; 
    private JLabel etiqueta_editable = null; 
    /*************************************/ 
    //si el usuario hizo enter 
    private static final int confirmar = KeyEvent.VK_ENTER; 
    //si es usuario pulso escape 
    private static final int cancelo = KeyEvent.VK_ESCAPE; 
    private CardLayout card;//utilizo el carlayotu para manejar varios objetos dentro del mismo panel 
    private static final String txt_caja = "text field";  //  @jve:decl-index=0: 
    private JTextField caja_edicion; 
    private static final String LABEL = "label"; 
    private String valor=new String("");
    /** 
     * This method initializes panel_edicion    
     *     
     * @return javax.swing.JPanel    
     */ 
    private JPanel getPanel_edicion() { 
        if (panel_edicion == null) { 
            card = new CardLayout(); 
            etiqueta_editable = new JLabel(); 
            etiqueta_editable.setText("Programación fácil con JAVA"); 
            etiqueta_editable.setHorizontalAlignment(SwingConstants.CENTER); 
            etiqueta_editable.setFont(new Font("Dialog", Font.BOLD, 48)); 
            etiqueta_editable.addMouseListener(new MouseAdapter() { 
                public void mouseClicked(MouseEvent e) { 
                    //si el usurario hizo doble clic encima de la etiqueta 
                    if (e.getClickCount() == 2) { 
                        editando(); 
                    } 
                } 
            }); 
            caja_edicion = new JTextField(); 
            caja_edicion.addKeyListener(new KeyAdapter() { 
                public void keyReleased(KeyEvent e) { 
                    if (e.getKeyCode() == confirmar) { 
                        confirmar(); 
                    } else if (e.getKeyCode() == cancelo) { 
                        cancelar(); 
                    } 
                } 
            }); 
            panel_edicion = new JPanel(card); 
            panel_edicion.add(caja_edicion, txt_caja); 
            panel_edicion.add(etiqueta_editable, LABEL); 
            card.show(panel_edicion, LABEL); 
        } 
        return panel_edicion; 
    }
    /** 
     * @param args 
     */ 
    public static void main(String[] args) { 
        // TODO Auto-generated method stub 
        SwingUtilities.invokeLater(new Runnable() { 
            public void run() { 
                principal thisClass = new principal(); 
                thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
                thisClass.setVisible(true); 
            } 
        }); 
    }
    /** 
     * This is the default constructor 
     */ 
    public principal() { 
        super(); 
        initialize(); 
    }
    /** 
     * This method initializes this 
     * 
     * @return void 
     */ 
    private void initialize() { 
        this.setSize(864, 251); 
        this.setContentPane(getJContentPane()); 
        this.setTitle("JLabel editable en tiempo de ejecucion por jonathan-palomino.blogspot.com"); 
        this.setLocationRelativeTo(null); 
    }
    /** 
     * This method initializes jContentPane 
     * 
     * @return javax.swing.JPanel 
     */ 
    private JPanel getJContentPane() { 
        if (jContentPane == null) { 
            jContentPane = new JPanel(); 
            jContentPane.setLayout(new BorderLayout()); 
            jContentPane.add(getPanel_edicion(), BorderLayout.CENTER); 
        } 
        return jContentPane; 
    } 
    /*********************************************/ 
    private void editando() { 
        card.show(getPanel_edicion(), txt_caja); 
        caja_edicion.setText(valor); 
        caja_edicion.requestFocus(); 
        caja_edicion.selectAll(); 
    }
    private void cancelar() { 
        caja_edicion.setText(valor); 
        card.show(getPanel_edicion(), LABEL); 
    }
    public void confirmar() { 
        valor = caja_edicion.getText(); 
        etiqueta_editable.setText(valor); 
        card.show(getPanel_edicion(), LABEL); 
    } 
    
} 

Aplicando sombra un texto

Hola,quien no ha querido aplicar efectos al titulo de una aplicación en este caso aplicaremos sombra y su inclinación como tamaño según parámetros.
Así obtendrán esta imagen


/** 
* 
* @author http://jonathan-palomino.blogspot.com/ 
* 
*/ 
import javax.swing.SwingUtilities; 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Graphics2D;
import javax.swing.JPanel; 
import javax.swing.JFrame; 
import java.awt.geom.AffineTransform;
public class Principal extends JFrame {
    private static final long serialVersionUID = 1L; 
    private JPanel jContentPane = null; 
    private int tamaño = 55; 
    private String mensaje = "Programación fácil con JAVA";  //  @jve:decl-index=0: 
    private int Width=50; 
        private double inclinacion_vertical =-0.95; 
        private double inclinacion_horizontal=0; 
        private double escala_altura=2; 
    /** 
     * @param args 
     */ 
    public static void main(String[] args) { 
        // TODO Auto-generated method stub 
        SwingUtilities.invokeLater(new Runnable() { 
            public void run() { 
                Principal thisClass = new Principal(); 
                thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
                thisClass.setVisible(true); 
            } 
        }); 
    }
    /** 
     * This is the default constructor 
     */ 
    public Principal() { 
        super(); 
        initialize(); 
        
    }
    /** 
     * This method initializes this 
     * 
     * @return void 
     */ 
    private void initialize() { 
        this.setSize(985, 257); 
        this.setResizable(false); 
        this.setLocationRelativeTo(null); 
        this.setContentPane(getJContentPane()); 
        this.setTitle("TEXTO CON SOMBRA"); 
        this.setBackground(Color.white); 
        Font font = new Font("DokChampa", Font.BOLD, tamaño); 
        this.setFont(font); 
    }
    /** 
     * This method initializes jContentPane 
     * 
     * @return javax.swing.JPanel 
     */ 
    private JPanel getJContentPane() { 
        if (jContentPane == null) { 
            jContentPane = new JPanel(); 
            jContentPane.setLayout(new BorderLayout()); 
        } 
        return jContentPane; 
    }
        public void paint(Graphics g) { 
            super.paint(g); 
            Graphics2D graph = (Graphics2D)g; 
            int x = Width; 
            int y = tamaño*5/2; 
            graph.translate(10, y); 
            graph.setPaint(Color.lightGray);            
            AffineTransform origTransform = graph.getTransform(); 
            graph.shear(inclinacion_vertical, inclinacion_horizontal); 
            graph.scale(1, escala_altura); 
            graph.drawString(mensaje, 0, 0); 
            graph.setTransform(origTransform); 
            graph.setPaint(Color.blue); 
            graph.drawString(mensaje, 0, 0); 
        } 
   
} 

viernes, 20 de abril de 2012

Crear un pop up en un boton

Si querían poner un pop up en sus botones como menú de opciones esta es la forma les adjunto el código:

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenuItem; 
import javax.swing.JPopupMenu;
/** 
* 
* @author jonathan-palomino.blogspot.com 
*/ 
public class Pop_Up extends JFrame{
    public Pop_Up() { 
        setSize(200,150); 
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
        prueba.setBounds(40, 40, 140, 50); 
        fantasma.setBounds(10, 10, 50, 30); 
        fantasma.setText(""); 
        prueba.setText("Boton padre"); 
        element.add(ele1); 
        element.add(ele2); 
        
        prueba.setComponentPopupMenu(element); 
        
        add(prueba); 
        add(fantasma); 
    } 
    public static void main(String[] args){ 
        Pop_Up ob = new Pop_Up(); 
        ob.show(); 
    } 
    JButton prueba = new JButton(); 
    JPopupMenu element = new JPopupMenu(); 
    JMenuItem ele1 = new JMenuItem("Elemento1");    
    JMenuItem ele2 = new JMenuItem("Elemento2"); 
    JLabel fantasma = new JLabel(); 
}