2011-11-23 1 views
6

Recentemente ho letto questo thread (Creating a custom button in Java) sulla creazione di pulsanti personalizzati in java estendendo la classe JButton, tuttavia tutte le soluzioni su questo thread utilizzano elementi grafici disegnati in java.Come creare un JButton personalizzato in java con una base immagine?

Volevo che il mio pulsante fosse basato su un'immagine di pulsante che avevo disegnato in Photoshop. Così ho cercato di applicare quello che ho letto in quel filo con questo risultato:

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; 
    } 
} 

Quando eseguo il programma principale dopo aver aggiunto questo pulsante per un JPanel non visualizzare. Presumo che potrebbe essere uno dei diversi motivi:

a) La dimensione del JButton non corrisponde all'immagine? b) Non ho caricato correttamente l'immagine. Negli appunti che mi ha dato il mio docente, scrive il codice dell'immagine del display con "imageName.png" senza percorso file, quindi non ho idea se questo è il modo corretto per farlo, o come il programma saprà caricare l'immagine . c) Qualcos'altro che è al di là delle mie conoscenze fino ad ora.

Se qualcuno sa come risolvere questo sarei molto grato.

Grazie mille!

+0

un paio di commenti, più o meno estranei al vostro problema: a) la forzatura paintComponent è b illegale) mai-mai _change_ qualsiasi cosa in un getter c) in particolare, setSize è fatta dal LayoutManager in ogni caso, non avrà alcun effetto in un'applicazione sana d) è corretto sovrascrivere getPreferredSize e restituire un suggerimento di ridimensionamento ragionevole, in base agli interni del componente, in questo caso che potrebbe essere la dimensione dell'immagine e) caricare l'immagine nella vernice (nessun sollevamento pesante mai nel ciclo di verniciatura!), caricarlo invece una volta al momento della costruzione – kleopatra

+0

btw, si prega di imparare le convenzioni di denominazione java e attenersi a loro – kleopatra

risposta

4

Per uno, è necessario utilizzare ImageIO.read(new File("somefile.png")) per caricare un Image. Si noti che se non è specificato alcun percorso assoluto, viene impostato come predefinito dalla directory di lavoro . Se sei a corto di eclissi, è la cartella del progetto. Fuori da un barattolo, è la cartella in cui si trova il barattolo (se non diversamente specificato).

Vedere http://docs.oracle.com/javase/tutorial/2d/images/loadimage.html per una spiegazione su come caricare un'immagine correttamente (inoltre dice come farlo all'interno di un'applet).

Inoltre, si dovrebbe caricare l'immagine volta, poi riutilizzarlo per ogni iterazione vernice:

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()); 
} 

Fatemi sapere se questo funziona per voi (assicuratevi di mettere il png nella directory di lavoro!).

+0

a) non utilizzare setXXSize, invece di sovrascrivere getPreferredSize (si sta già sottoclassi, nessuna scusa per essere sciatta ;-) b) il paintComponent override è illegale, deve essere implementato per rispettare il suo contratto di opacità – kleopatra

+0

-1 ahhh ... hai appena visto la tua modifica, è semplicemente sbagliato: ignorare getPref _certainly_ è la strada da percorrere. – kleopatra

+0

@kleopatra ah mi dispiace, credo di aver sbagliato. Risolto problema con una modifica. Sono troppo abituato a lavorare con la roba hackerata insieme, terrò presente quella nota sulla cosa setSize. La mancanza di 'super.paintComponent' è stato un errore da parte mia che so che non è corretto, quindi ho risolto anche quello. – jli

5

Ho fatto questa domanda in precedenza pure. La soluzione che ho trovato ha funzionato meglio in realtà stava facendo questo, invece di disegnare.

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

In modo che imposta il pulsante per l'immagine. Ora quello che ho scelto di fare è stato rendere invisibile il pulsante e rimuovere tutti i bordi. Così ho fatto questa prossima:

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

Morevoer, possiamo definire diverse immagini di stati dei pulsanti (vedi: [link] (http://www.leepoint.net/notes-java/GUI/components/20buttons/23buttonicons.html)). La tua soluzione con quel trucco ha funzionato perfettamente! – Alexxx