2011-11-23 21 views
6

Recientemente leí este hilo (Creating a custom button in Java) sobre cómo crear botones personalizados en java extendiendo la clase JButton, sin embargo, todas las soluciones en este hilo usan gráficos dibujados en java.¿Cómo crear un JButton personalizado en Java con una base de imagen?

Quería tener mi botón basado en una imagen de botón que había dibujado en photoshop. Así que traté de aplicar lo que he leído en ese hilo con este resultado:

import javax.swing.*; 
import java.awt.*; 

public class nextButton extends JButton { 
    @Override 
     protected void paintComponent(Graphics g) { 
     Image image = new ImageIcon("nextButton.png").getImage(); 
     g.drawImage(image,0,0,this); 
} 

    @Override 
    public Dimension getPreferredSize() { 
     Dimension size = super.getPreferredSize(); 
     size.setSize(75, 150); 
     return size; 
    } 
} 

Cuando ejecuto el programa principal que se incrementa en este botón para un JPanel que no se vea. Supongo que podría ser una de varias razones:

a) ¿El tamaño del JButton no coincide con la imagen? b) No he cargado la imagen correctamente. En las notas que mi profesor me dio, escribe el código de imagen de la pantalla con solo "imageName.png" sin ruta de archivo, así que no tengo idea si esta es la forma correcta de hacerlo, o cómo el programa sabrá cargar la imagen . c) Algo más que no tengo conocimiento hasta ahora.

Si alguien sabe cómo resolver esto, estaría muy agradecido.

¡Muchas gracias!

+0

un par de comentarios, más o menos relacionada con su problema: a) la anulación paintComponent es b ilegal) de nunca jamás _change_ nada en un captador c) en particular, setSize se hace por LayoutManager de todos modos, no tendrá efecto en una aplicación sana d) es correcto anular getPreferredSize y devolver una sugerencia de tamaño razonable, basada en las partes internas del componente, que podría ser del tamaño de la imagen e) no volver cargue la imagen en pintura (¡sin levantar objetos pesados ​​en el ciclo de pintura!), en lugar de cargarlo una vez en el tiempo de construcción – kleopatra

+0

por cierto, aprenda las convenciones de nomenclatura de Java y adhiérase a ellas – kleopatra

Respuesta

4

Para empezar, debe usar ImageIO.read(new File("somefile.png")) para cargar un Image. Tenga en cuenta que si no se especifica una ruta de acceso absoluta, se establece de forma predeterminada en el directorio de trabajo . Si te estás quedando sin eclipse, es la carpeta del proyecto. De un contenedor, es la carpeta en la que se encuentra el contenedor (a menos que se especifique lo contrario).

Consulte http://docs.oracle.com/javase/tutorial/2d/images/loadimage.html para obtener una explicación sobre cómo cargar una imagen correctamente (también dice cómo hacerlo desde dentro de un applet).

Además, debe cargar la imagen vez, a continuación, volver a utilizar para cada iteración de pintura:

BufferedImage image; 

public nextButton() { 
    try { 
     image = ImageIO.read(new File("nextButton.png")); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.drawImage(image, 0, 0, null); 
} 

@Override 
public Dimension getPreferredSize() { 
    return new Dimension(image.getWidth(), image.getHeight()); 
} 

Quiero saber si esto funciona para usted (asegúrese de poner su PNG en el directorio de trabajo!)

+0

a) no use setXXSize, en su lugar anule getPreferredSize (ya está subclasando, no hay excusa para ser descuidado ;-) b) paintComponent override es ilegal, debe ser implementado para cumplir con su contrato de opacidad – kleopatra

+0

-1 ahhh ... acabo de ver su edición, eso es simplemente incorrecto: anulando getPref _ciertamente_ es el camino a seguir. – kleopatra

+0

@kleopatra ah perdón por eso, creo que lo he equivocado. Se solucionó con una edición. Estoy demasiado acostumbrado a trabajar con hackear cosas de Swing, tendré en cuenta esa nota sobre lo de setSize. La falta de 'super.paintComponent' fue un error de mi parte que sé que es incorrecto, así que lo solucioné también. – jli

5

hice esta pregunta anterior también. La solución que encontré que funcionó mejor fue en realidad hacer esto, en lugar de dibujar.

ImageIcon icon = new ImageIcon("pathOfImageHere.png"); 
JButton button = new JButton(icon); 

Lo que establece el botón en la imagen. Ahora lo que elegí hacer fue hacer el botón invisible y eliminar todos los bordes. Así que hice esta siguiente:

button.setOpaque(false); 
button.setContentAreaFilled(false); 
button.setBorderPainted(false); 
button.setFocusPainted(false); 
+0

Además, podemos definir diferentes imágenes de estados de botón (ver: [enlace] (http://www.leepoint.net/notes-java/GUI/components/20buttons/23buttonicons.html)). ¡Tu solución con ese truco funcionó perfectamente! – Alexxx

Cuestiones relacionadas