2016-11-04 4 views
-1

En premier lieu, le code ci-dessous fonctionne comme prévu (sauf pour la partie que je ne l'ai pas pu tester pour des raisons que je inscrirez ci-dessous)Faire une classe Button (pas d'utilisation du swing)

public class Button implements MouseListener { 

    String function; 
    int currentState; 
    int[] pos; 
    int[] size; 
    private BufferedImage normal; 
    private BufferedImage hover; 
    private BufferedImage click; 
    BufferedImage currentImage; 

    public Button(String func, String location, int[] position,int[] dimensions){ 
    function = func; 
    //State 0 means not interacted with, State 1 means hovered and state 2 means clicked 
    currentState = 0; 
    pos = position; 
    size = dimensions; 

    String dpath = "/Images/"; 
    String npath = dpath+location+".png"; 
    String hpath = dpath+location+"h.png"; 
    String cpath = dpath+location+"c.png"; 
    try{ 
    normal =ImageIO.read(getClass().getResource(npath)); 
    hover =ImageIO.read(getClass().getResource(hpath)); 
    click =ImageIO.read(getClass().getResource(cpath)); 
    }catch(Exception e){ 
    System.err.println("Error loading button image: "+ e); 
    } 
    currentImage = normal; 
    } 

    private void changeState(int c){ 
    currentState = c; 
    changeImage(); 
    } 
    private void changeImage(){ 
    if (currentState == 0){ 
    currentImage = normal; 
    }else if (currentState == 1){ 
    currentImage = hover; 
    }else if (currentState == 2){ 
    currentImage = click; 
    } 

    public int getX(){ 
    return pos[0]; 
    } 
    public int getY(){ 
    return pos[1]; 
    } 
    public BufferedImage getSprite(){ 
    return currentImage; 
    } 

Ceci est peint sur l'écran d'une autre classe en utilisant

g.drawImage(but.getSprite(), but.getX(), but.getY(), null); 

Je l'ai réglé de façon lorsque le bouton est cliqué plané et laissé seul le bouton utilisera ChangeState() et ChangeImage(). Dans chacune de mes méthodes (mousePressed, mouseReleased, mouseEntered et mouseExited), j'ai défini les paramètres pour qu'ils changent l'image mais pour des raisons évidentes, aucun de ceux-ci ne sera activé sauf si j'ai défini une zone et ce que j'ai read, la zone que le MouseListener peut bien écouter est tout JComponents. Cela signifie-t-il que j'ai besoin d'utiliser un JLabel (en raison de sa nature principalement interactive par défaut) ou existe-t-il un meilleur moyen d'implémenter une zone cliquable?

Répondre

0

Regardez here après que je vais vous donner une simple classe pour voir comment dessiner l'image sur JPanel ou JComponent alors u peut essayer de travailler avec mouseMotion:

Exemple d'image de dessin sur « JPanel » :

`import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.imageio.ImageIO; 
import javax.swing.JPanel; 

public class DrawOnJ extends JPanel{ 

    BufferedImage MyImage; 

    public ImagePanel() { 
     try {     
      MyImage = ImageIO.read(new File("your img path/name")); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 

    @Override 
    protected void paintComponent(Graphics gr) { 
     super.paintComponent(g); 
     gr.drawImage(MyImage, 0, 0, this); 
    } 

}` 

Et ceci pour dessiner l'image sur "JLabel":

BufferedImage image = null; // get your buffered image. 
ImageIcon icon = new ImageIcon((Image)image); 
JLabel label = new JLabel(); 
label.setIcon(icon);