# MouseListener auf Bild legen ?



## Art1977 (14. Mai 2005)

Ich habe mir folgendes Icon auf meine shell "gemalt"
wie kann ich darauf nun nen Listener legen, das ich quasi den Bereich als "Button" verwenden kann?


```
ImageData playData = new ImageData("PlayButton.gif"); 
        final Image playImage = new Image(display, playData); 
 
        shell.addPaintListener(new PaintListener(){ 
        public void paintControl(PaintEvent e) { 
           e.gc.drawImage(playImage, 220, 454);           
           
        }
     
     });
```


----------



## L-ectron-X (14. Mai 2005)

Lege doch das Bild gleich auf einen JButton, oder auf ein JLabel, daran kann man z.B. den ActionListener bzw. MouseListener registrieren.
Beispielcode findet sich hier im Forum.  :arrow: Suche


----------



## Art1977 (14. Mai 2005)

Das Problem ist aber dabei


```
Image playImage = new Image(shell.getDisplay(),"PlayButton2.gif");
        play.setImage(playImage); 
        play.pack(); 
        play.setLocation(220, 454);     
        play.addListener(SWT.Selection, new Listener() 
        { 
           public void handleEvent(Event e) 
           { 
              shell.close(); 
           } 
        } 
        );
```

Hier bei Play siehst du das Problem, wenn ichs über nen Button mache!







Ich finde einfach keine gute Lösung für das Problem hat jemand ne Idee.....
[/img]


----------



## SebiB90 (14. Mai 2005)

dann benutz ein JLabel


----------



## Roar (14. Mai 2005)

huhu, er benutzt swt da is nix mit JButtons oder JLabels

@art: füg doch einfach das tsprechende swt konstrukt für einen mouselistener deiner shell hinzu und überprüfe wo geklickt weurde jenachdem kannste dann reasgieren.


----------



## SebiB90 (14. Mai 2005)

Roar hat gesagt.:
			
		

> huhu, er benutzt swt da is nix mit JButtons oder JLabels


oh..
ich kenn mich mit swt nicht aus aber gibts da nichts was dem label ähnelt?


----------



## Art1977 (14. Mai 2005)

@SebiB90

wie Roar schon sagt, ich benutze SWT und wollte eigentlich kein AWT und Swing verwenden


@Roar
kannste mir mal kurz sagen, wie du das meinst ? Ich bekomm es nciht auf die Reihe nen bestimmten Bereich von meiner Shell zu definieren auf den ich den Mouselistener setzten kann. Ich schaff das nur auf die gesamte Shell, aber das bringt mir ja nix, zu mal ich das Bild ja quasi auf die Shell "gezeichnet" habe. Ich kann zumindest kein Listener auf nen Image setzten, das funktioniert auch nicht. :-(. 

Kannste mal kurz nen beispiel sagen, wie du das meinst ?


----------



## Roar (14. Mai 2005)

nimm doch ein (swt) Label, papp da dein Image drauf (setImage()) und füg einen MouseListener hinzu. wenn du da nmoch buttonartige effekte draufmachen willst auchnoch nen MouseTrackListener wo du dann andere rahmen oder so drummalen kannst...


----------



## Art1977 (14. Mai 2005)

Jo @roar, genau das habe ich eben probiert. funktioniert einwandfrei, nun mal sehen, ob ich die labels ineinander "nesten" kann.


----------



## Art1977 (14. Mai 2005)

Also Labels ineinandersetzten klapptschonmal nicht, jetzt kann ich zwar nen keylistener auf meine Controls legen, aber immernoch nur auf das gesamte label, kann ich da irgendwie innerhalb bereiche für den listener definieren?


----------



## Roar (14. Mai 2005)

Art1977 hat gesagt.:
			
		

> Also Labels ineinandersetzten klapptschonmal nicht, jetzt kann ich zwar nen keylistener auf meine Controls legen, aber immernoch nur auf das gesamte label, kann ich da irgendwie innerhalb bereiche für den listener definieren?


öhh das kapier ich nich, wie meinst du das "ineinander nesten" ? du kansnt ein label nicht auf ein andere setzen. in ein Panel kannst du mehrere labels setzen.


----------



## Art1977 (15. Mai 2005)

Nun du siehst ja oben das bild von der bisherigen GUI.

Ich will halt nun den gemalten Buttons, quasi funktionen hinzufügen. Also da wo der PlayButton sitzt soll er abspielen usw....

Wenn ich jeweils die nen Label in nen Label hätte setzten könne, könnte ich für jeden einzelnen nen eigenen MouseListener benutzen. Das geht aber halt leider nicht. 

Nun hab ich nen Label drübergelegt und nen bild reingesetzt und so hingeschoben, dass es immernoch so aussieht, als wäre es der eine button. Ich müsste aber jetzt irgendwie innerhalb des Labels Bereiche definieren, die dann die entsprechende Funktion auslösen. Aber ich habe null plan, wie man das machen könnte.

ich poste mal schnell hier den code von der gui klasse.


```
package de.fulda.mmprog.audio.gui;

import org.eclipse.swt.SWT; 
import org.eclipse.swt.events.PaintEvent; 
import org.eclipse.swt.events.PaintListener; 
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image; 
import org.eclipse.swt.graphics.ImageData; 
import org.eclipse.swt.graphics.Point; 
import org.eclipse.swt.graphics.Rectangle; 
import org.eclipse.swt.graphics.Region; 
import org.eclipse.swt.widgets.Button; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Event; 
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener; 
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;

import de.fulda.mmprog.audio.controller.Controller;

public class AlternativeGUI { 
    
    private Controller myctrl;
	private Table table;
	private String filen;
    
    static int[] circle(int r, int offsetX, int offsetY) 
     { 
        int[] polygon = new int[8 * r + 4]; 
        //x^2 + y^2 = r^2 
        for (int i = 0; i < 2 * r + 1; i++) { 
           int x = i - r; 
           int y = (int)Math.sqrt(r*r - x*x); 
           polygon[2*i] = offsetX + x; 
           polygon[2*i+1] = offsetY + y; 
           polygon[8*r - 2*i - 2] = offsetX + x; 
           polygon[8*r - 2*i - 1] = offsetY - y; 
        } 
        return polygon; 
     } 
      
   public void open() {
        final Display display = new Display(); 
        //Shell must be created with style SWT.NO_TRIM 
        final Shell shell = new Shell(display, SWT.NO_TRIM | SWT.ON_TOP ); 
        shell.setBackground(display.getSystemColor(SWT.COLOR_BLACK)); 
        //define a region 
        Region region = new Region(); 
    
        //Anfang ist oben links die Ecke 
        region.add(new int[]{238, 0, 785, 0, 800, 15, 800, 455, 785 ,470 
                            , 785, 526, 765, 545, 290, 545, 270, 525 
                            , 270, 510, 185, 495, 146, 513,  90, 416 
                            , 118, 389, 241, 6}); 
        region.add(circle(222, 233, 225)); 
        region.add(circle(75, 77, 485)); 
        region.add(circle(75, 236, 460)); 
        region.add(circle(15, 785, 15));//rechts Oben, runde Ecke 
        region.add(circle(15, 785, 455)); 
        region.add(circle(15, 770, 530)); 
        
        /*  So kann man noch Flächen rausschneiden
        region.subtract(new int[]{80, 50, 55, 105, 79, 105}); 
        region.subtract(circle(60, 100, 150)); 
        */ 
        
        //define the shape of the shell using setRegion 
        shell.setRegion(region); 
        Rectangle size = region.getBounds(); 
        shell.setSize(size.width, size.height); 
        //shell.setSize(800,600); 
  
         ImageData data = new ImageData("Skin2.jpg"); 
         final Image i = new Image(display, data); 
  
         shell.addPaintListener(new PaintListener()
         { 
         public void paintControl(PaintEvent e) 
         { 
            e.gc.drawImage(i, 0, 0);           
         } 
          
         }); 
       
        //add ability to move shell around 
        Listener l = new Listener() 
        { 
           Point origin; 
           public void handleEvent(Event e) 
           { 
              switch (e.type) 
              { 
                 case SWT.MouseDown: 
                    origin = new Point(e.x, e.y); 
                    break; 
                 case SWT.MouseUp: 
                    origin = null; 
                    break; 
                 case SWT.MouseMove: 
                    if (origin != null) 
                    { 
                       Point p = display.map(shell, null, e.x, e.y); 
                       shell.setLocation(p.x - origin.x, p.y - origin.y); 
                    } 
                    break; 
              } 
           } 
        }; 
        shell.addListener(SWT.MouseDown, l); 
        shell.addListener(SWT.MouseUp, l); 
        shell.addListener(SWT.MouseMove, l);   
        
        Button exit = new Button(shell, SWT.FLAT | SWT.PUSH); 
        exit.setBackground(shell.getBackground()); 
        exit.setText("X"); 
        exit.pack(); 
        exit.setLocation(769, 9); 
        exit.addListener(SWT.Selection, new Listener() 
        { 
           public void handleEvent(Event e) 
           { 
              shell.close(); 
           } 
        } 
        ); 
      
        
        /*
        Button play = new Button(shell, SWT.PUSH | SWT.FLAT | SWT.NO_BACKGROUND);
        Image playImage = new Image(shell.getDisplay(),"PlayButton2.gif");
        play.setImage(playImage); 
        play.pack(); 
        play.setLocation(220, 454);     
        play.addListener(SWT.Selection, new Listener() 
        { 
           public void handleEvent(Event e) 
           { 
              shell.close(); 
           } 
        } 
        ); 
       */
        
        
        // ButtonGIF wird an die Stelle gezeichnet, hat mir aber auch nicht 
        /* weiter geholfen
        ImageData playData = new ImageData("PlayButton2.gif"); 
        final Image playImage = new Image(display, playData); 
 
        shell.addPaintListener(new PaintListener(){ 
        public void paintControl(PaintEvent e) { 
           e.gc.drawImage(playImage, 220, 454);           
           
        }
     
     }); */
        
        
        Group group1 = new Group(shell,SWT.NO_TRIM );
        group1.setBounds(30,440,90,90);
        group1.setText("Volume");
         
        
        //HintergrundLabel für den Controller 
        ImageData controlData = new ImageData("Controller.gif");
        final Image controllerImage = new Image(display, controlData); 
        Label controlLabel = new Label(shell,SWT.FLAT);
        //controlLabel.setBounds(300,420,94,94);
        controlLabel.setBounds(188,424,92,92);
        controlLabel.setImage(controllerImage);
        
        /*
        controlLabel.addMouseListener(MouseListener l)
        
       
        
        
        
           shell.open(); 
        

       while (!shell.isDisposed()) { 
          if (!display.readAndDispatch()) 
             display.sleep(); 
       } 
       region.dispose(); 
       display.dispose(); 
} 
 

}
```


----------



## Art1977 (15. Mai 2005)

Ich sage jetzt mal lieber nichts dazu, hab den wald vor lauter bäumen nicht gesehen!

Ich habe jetzte einfach 5 labels gemacht, alle 20*19 groß und einfach auf den controller gelegt. Darauf dann das bild des entsprechenden buttons. 

Nun die nächste Frage, wenn ich da meinen listener drauflege, funktioniert der immer nur mit nem Doppelklick, ich denke beim ersten mal wird registriert, dass ich mich im label befinde, beim 2. klick wird der event ausgelöst.

Was muss ich tun, damit das auch mit einem klick funktioniert ?


```
playLabel.addListener(SWT.PUSH, new Listener() 
                { 
                   public void handleEvent(Event e) 
                   {          
                      myctrl.playsound();
                   } 
                   
                  
                } 
                );
```


----------



## Roar (15. Mai 2005)

eifnach einen MouseListener auf das Label setzen:


```
playLabel.addMouseListener(new org.eclipse.swt.events.MouseListener() {
     public void mouseDown(..)
 .....
});
```


----------



## JFun (21. Okt 2005)

Hallo, wie macht man solche Skins, mit GUI- Builder oder muss man alles von Hand programmieren ?

Danke


----------



## Gast (14. Dez 2005)

Hi Leute

wie kann ich Audio und Video auf mein GUI abspielen ?

wie kann ich  mediaplayer mit meiner GUI einbinden

eure Gast

merci milles fois.))


----------



## The_S (14. Dez 2005)

Schau dir mal das JMF (Java Media Framework) an.


----------

