domingo, 1 de enero de 2012

JMenuBar con imagen de fondo en java


El primer post de este nuevo año 2012 que esta lleno de cosas nuevas,hoy les traigo como personalizar el aburrido fondo del componente JMenuBar para darle un mejor aspecto y asi un mejor estilo a nuestros formularios o aplicaciones
¿Como lo hacemos?
teniendo ya nuestromenúhecho vamos a colocar estecódigo,el cual se compone de una variable tipoTexturePaint (es una clase que proporciona una manera de rellenar un objecto con una textura que se especifica con un BufferedImage).Tambiénhacemos uso de la clase paintComponent para poder dibujar unosrectánguloso recuadros tipo tablero en el MenuBar.

menu_bar = new JMenuBar(){
private final TexturePaint imagen = Crear_cuadriculas();
@Override protected void paintComponent(Graphics g) {
super.paintComponent(g);
//dibujo la imagen
Graphics2D g2 = (Graphics2D)g;
g2.setPaint(imagen);
//en rectangulos,obtengo las dimensioones del menubar
g2.fillRect(0, 0, getWidth(), getHeight());
}
};
La función cuadricula es la encargada de crear las cuadriculas con su respectiva dimensión es decir el mismo tamaño de cada cuadro con una separación.
private TexturePaint Crear_cuadriculas() {
int cuadro = 4;//tamaño de las cuadriculas, o recuadros
int dimension = cuadro*cuadro;
BufferedImage imagen = new BufferedImage(dimension,dimension,BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g2 = imagen.createGraphics();
g2.setPaint(new Color(100,150,150,50));
g2.fillRect(0,0,dimension,dimension);
for(int i=0;i*cuadrodimension;i++) {
for(int j=0;j*cuadrodimension;j++) {
if((i+j)%2==0) g2.fillRect(i*cuadro, j*cuadro, cuadro, cuadro);
}
}
g2.dispose();
return new TexturePaint(imagen, new Rectangle(0,0,dimension,dimension));
}

Si lo imaginas,lo programas













6 comentarios:

  1. que tal amigo he hecho etsoy y me funciona, pero que pasa con los jmenuitems esos no cambian siguen igual, alguna manera de cambiarlos tambien

    ResponderEliminar
  2. Claro Jose puedes hacer lo mismo que con el JMenuBar crear una clase interna de esta manera
    items=new JMenuIten(){
    rivate final TexturePaint imagen = Crear_cuadriculas();
    @Override protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    //dibujo la imagen
    Graphics2D g2 = (Graphics2D)g;
    g2.setPaint(imagen);
    //en rectangulos,obtengo las dimensioones del menubar
    g2.fillRect(0, 0, getWidth(), getHeight());
    }
    });
    eso te dene de funcionar si tienes algun problema me avisas :)

    ResponderEliminar
  3. lo intente de manera parecida en vez de crear una clase interna, creo una externa para poder instanciarla desde otras, el problema es que mis JMenuItem tiene un parametro:
    nuevoEmpleado =new ItemsPersonales("Nuevo Empleado");
    modificaEmpleado =new ItemsPersonales("Modifica Empleado");
    eliminaEmpleado =new ItemsPersonales("Elimina Empleados");
    Por lo tanto no me reconoce el constructor quise crear otro contructor pero no me estable el texto , la imagen de fondo ya le dibuja pero el texto no

    public ItemsPersonales(String nombre)
    {
    this.nombre=nombre;
    }

    Me imagino que se ha tener que sobreescribir el metodo que se encarga de eso pero no se cual es??.
    alguna idea ?

    ResponderEliminar
    Respuestas
    1. Te debería de funcionar por que basicamente lo que se hace es pintar el objeto con la clase Graphics2D entonces en tu clase externa debes de tener lo siguiente
      class ItemsPersonales extends JMenuItem {
      public ItemsPersonales (String txt){
      this.setText(txt);
      }
      protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      //dibujo la imagen
      TexturePaint imagen = Crear_cuadriculas();
      Graphics2D g2 = (Graphics2D)g;
      g2.setPaint(imagen);
      //en rectangulos,obtengo las dimensioones del menubar
      g2.fillRect(0, 0, getWidth(), getHeight());
      }
      private TexturePaint Crear_cuadriculas() {
      int cuadro = 4;//tamaño de las cuadriculas, o recuadros
      int dimension = cuadro*cuadro;
      BufferedImage imagen = new BufferedImage(dimension,dimension,BufferedImage.TYPE_4BYTE_ABGR);
      Graphics2D g2 = imagen.createGraphics();
      g2.setPaint(new Color(100,150,150,50));
      g2.fillRect(0,0,dimension,dimension);
      for(int i=0;i*cuadro<dimension;i++) {
      for(int j=0;j*cuadro<dimension;j++) {
      if((i+j)%2==0) g2.fillRect(i*cuadro, j*cuadro, cuadro, cuadro);
      }
      }
      g2.dispose();
      return new TexturePaint(imagen, new Rectangle(0,0,dimension,dimension));
      }
      }

      me imagino que tienes que tener algo asi en tu clase externa??

      Eliminar
  4. aaaaaaaaaaaaaaaaaa lo que pasa es que yo primero creaba una variable de tipo string,
    luego esa variable la asociaba a una que recibia el constructor y el set text no sabia donde ponerlo habia primero lo puse dentro de texturepaint , luego en paintcomponents
    String txt;
    public ItemsPersonales(String txt)
    {
    this.txt=txt;
    }

    pues muchas gracias se ven de lujo las barras , en verdad que esto es lo que deberian enseñerle a uno en la escuela , gracias , gracias por ese tiempo que te dedicaste a ayudarme.
    Un saludo desde Oaxaca,Mexico y feliz año

    ResponderEliminar
    Respuestas
    1. Gracias a ti por visitar mi blog amigo y la verdad esto no te van a enseñar a la escuela ya depende de ti por seguir aprendiendo y investigar cualquier duda que tengas NADA ES IMPOSIBLE siempre que te lo propongas y feliz año para ti :)

      Eliminar