# GUI mit Mouse Touch



## babuschka (13. Nov 2012)

Hallo Freunde,

Ist es möglich, so etwas in Java zu programmieren?

Also ein Quadrat, mit vielen kleinen Quadraten.
Und wenn man mit der Maus auf ein Quadrat kommt,
färbt sich das Quadrat in eine Farbe. Wenn man dann 
drauf klickt, sollte igrnedwas passieren, wie Ausgabe von Musik.

Mir geht es eher drum, wie ich das erste programmieren könnte, dass sich das Quadrat färbt

Irgendwelche Ideen? ???:L ???:L

Vielen Dank im voraus :toll:


----------



## Gast2 (13. Nov 2012)

Ja, geht mit nem MouseListener.


----------



## babuschka (13. Nov 2012)

Echt? hmmmm und wie genau? ???:L

also wenn du mal auf die Seite gehst, kannst du das Quadrat auch mal visualisieren

Musicovery


----------



## BRoll (13. Nov 2012)

Deniz.Yoshi hat gesagt.:


> Echt? hmmmm und wie genau? ???:L
> 
> Musicovery




Mausposition einlesen

..mit Position und Größe des Rechtecks vergleichen
..wenn die Maus im Bereich des Rechtecks liegt,
muss dieser Fall zutreffen:

wenn Mausx>=Rechtx und Mausx<=Rechtx+Breite
und Mausy >=Rechty  und Mausy <= Rechty+Hoehe

Ich denke so müsste es klar sein


----------



## pro2 (14. Nov 2012)

BRoll hat gesagt.:


> Mausposition einlesen
> 
> ..mit Position und Größe des Rechtecks vergleichen
> ..wenn die Maus im Bereich des Rechtecks liegt,
> ...



Die Funktion 
	
	
	
	





```
contains()
```
 der Klasse Rectangle dürfte es auch tun.


----------



## babuschka (14. Nov 2012)

Hast du vllt ein Bsp?


----------



## pro2 (14. Nov 2012)

Schon mal so was in der Art angesehen? Wenn du das alles gelesen hast (oder zumindest die Kapitel), dürfte es dir eig. nicht mehr schwer fallen!
Ist jetzt vielleicht nicht das beste Tutorial, war jetzt nur so schnell aufgegriffen. Aber sieh dich mal bei Google nach Java2D Tutorials um, da wirst du einiges finden.


----------



## vanny (14. Nov 2012)

Deniz.Yoshi hat gesagt.:


> Hast du vllt ein Bsp?



API?
google?


----------



## X5-599 (14. Nov 2012)

Deniz.Yoshi hat gesagt.:


> Hast du vllt ein Bsp?



Zwar keine Rectangle, aber hier mal ein Beispiel mit JPanels.


```
public class WindowFrame extends JFrame implements MouseListener {
	
	private static final long serialVersionUID = 1L;

	public WindowFrame() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		init();
		setSize(800,600);
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new WindowFrame().setVisible(true);
	}

	private void init() {
		int nRows = 5;
		int nCols = 5;
		setLayout(new GridLayout(nRows, nCols));
		
		for(int i = 0; i < nRows; i++) {
			for(int j = 0; j < nCols; j++) {
				JPanel panel = new JPanel();
				panel.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
				panel.setForeground(Color.WHITE);
				panel.setOpaque(true);
				panel.setName("x="+j+", y="+i);
				panel.add(new JLabel(panel.getName()));
				panel.setSize(50, 50);
				panel.addMouseListener(this);
				add(panel);
			}
		}
	}
	
	
	@Override
	public void mouseClicked(MouseEvent e) {
		System.out.println("mouseClicked()");
		((JPanel)e.getSource()).setBackground(Color.BLUE);
	}

	@Override
	public void mousePressed(MouseEvent e) {
		System.out.println("mousePressed()");
		((JPanel)e.getSource()).setBackground(Color.ORANGE);
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		System.out.println("mouseReleased()");
		((JPanel)e.getSource()).setBackground(Color.LIGHT_GRAY);
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		System.out.println("mouseEntered()");
		((JPanel)e.getSource()).setBackground(Color.CYAN);
	}

	@Override
	public void mouseExited(MouseEvent e) {
		System.out.println("mouseExited()");
		((JPanel)e.getSource()).setBackground(Color.GREEN);
	}

}
```


----------



## babuschka (22. Nov 2012)

Danke :toll: Genau sowas meinte ich, 

nur mein Problem ist jetzt nur, dass es verallgemeinert ist, das MousePressed

wie ich kann ich die einzelnen Panels färben, wenn er mit der Mouse rüber geht bzw. drückt ???:L


----------



## Volvagia (23. Nov 2012)

Der Beispielcode benutzt doch #getSource vom Event und färbt sie einzeln.
Alternativ könntest du den Listener auch von vorneherein mit einen Komponenten bekannt machen. Erspaart Casten/Typecheck, sorgt aber für doppelte Vernetzung und du brauchst jeweils ein eigenes Objekt.


----------



## X5-599 (23. Nov 2012)

Jedes unserer JPanels hat den selben Listener. Somit kann man bei einem ausgelösten Event zentral feststellen welches JPanel dieses Event ausgelöst hat (mit getSource). Da unserem Listener nur JPanels bekannt sind, können wir ohne Bedenken die Rückgabe von getSource() auf JPanel casten.

Dieses JPanel ist eine Referenz auf das JPanel, welches das Event ausgelöst hat. Wenn du z.B. deinen JPanels beim Erstellen einen Namen gibst z.B. panel.setName("Panel A"), kannst du in den Listener-Methoden diesen wieder auslesen:


```
@Override
public void mouseEntered(MouseEvent e) {
    System.out.println("mouseEntered()");
    JPanel sourcePanel = (JPanel)e.getSource(); //Das Panel holen, welches das Event ausgelöst hat
    
    if(sourcePanel.getName().equals("Panel A")) {
        System.out.println("Panel A hat ausgelöst");
        sourcePanel.setBackground(Color.CYAN);    //So wird nur das "Panel A" eingefärbt
    }
    
}
```

Ich hoffe das war jetzt nicht allzu unverständlich. Bin halt kein Lehrer...  Ansonsten erkläre nochmal genau welche Funktionalität dir fehlt.


----------



## babuschka (23. Nov 2012)

Wenn wir aber nach dem Code gehen, erstellen wir ja die Panels in einer For Schleife

das heisst, dass ich gar nicht abfragen kann ???:L


----------



## Michael... (23. Nov 2012)

Deniz.Yoshi hat gesagt.:


> Wenn wir aber nach dem Code gehen, erstellen wir ja die Panels in einer For Schleife
> 
> das heisst, dass ich gar nicht abfragen kann ???:L


Wo soll was abgefragt werden? Innerhalb der Listener Methoden hast Du ja über das Event Zugriff auf das auslösende Panel.
Wenn Du ausserhalb was "abfragen" willst, dann musst Dir natürlich auf Referenzen die Panel halten. z.B. in einem Array, List... Ob die Panels in einer for Schleife oder sonstwie erstellt werden spielt keine Rolle.


----------



## babuschka (23. Nov 2012)

die Abfrage wegen dem Panel

ich will ja jedes einzelne Panel eine eig Farbe verpassen

und wenn ich die Panels in der For Schleife mache
ist es verallgemeinert oder seh ich das falsch?

die Idee  if(sourcePanel.getName().equals("Panel A")) 
funktioniert ja in diesem Sinne gar nicht


----------



## Michael... (23. Nov 2012)

Schon mal im Code ausprobiert?


Deniz.Yoshi hat gesagt.:


> und wenn ich die Panels in der For Schleife mache
> ist es verallgemeinert oder seh ich das falsch?


Ja, das siehst Du falsch. Die getSource() des Events liefert genau das eine Panel, welches für das Event verantwortlich ist.


----------



## X5-599 (26. Nov 2012)

Deniz.Yoshi hat gesagt.:


> die Abfrage wegen dem Panel
> 
> ich will ja jedes einzelne Panel eine eig Farbe verpassen
> 
> ...



Doch, das funktioniert. In dem MouseEvent steckt das Objekt, welches dieses Event ausgelöst hat immer mit drin (getSource()). Das ist hier jeweils eine Referenz auf das selbe JPanel was in der for-Schleife erzeugt wurde. Wenn du wie in meinem Beispiel allen JPanels einen Namen gegeben hast, wirst du den hier mit getName() wieder auslesen können.


----------



## babuschka (5. Dez 2012)

Das hat super geklappt. Im Eclipse ohne Probleme auszuführen.

Wie kann ich diesen Panel einem anderen Panel zuordnen?
Versuche gerade eine Oberfläche im NetBeans zu machen

Hab ein Fenster erzeugt und würde auch gerne diesen Panel meinem Fenster hinzufügen,
aber irgendwie erzeugt er nur den ersten Panel ???:L???:L

Code:

 public void init(){
            int nRows = 3;
            int nCols = 3;
            setLayout(new GridLayout(nRows, nCols));

            for(int i = 0; i < nRows; i++) {
                for(int j = 0; j < nCols; j++) {
                    panel = new JPanel();
                    panel.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
                    panel.setForeground(Color.WHITE);
                    panel.setOpaque(true);
                    panel.setName("x="+j+", y="+i);
                    panel.add(new JLabel(panel.getName()));
                    panel.setSize(50, 50);
                   // panel.addMouseListener(this);
                    jPanel1.add(panel);
                }
            }

    }

 public Gui() {
        initComponents();
        init();
        add(jPanel1,BorderLayout.CENTER);
    }


----------



## Michael... (5. Dez 2012)

Was ist jPanel1 und welches Layout benutzt die Komponente? Brauchst Du das überhaupt?
Warum fügst Du die in der Schleife erzeugten Panels nicht direkt dem ContentPane hinzu?
Du setzt als Layout des ContentPane ein GridLayout, das jPanel1 fügst Du aber mit 
	
	
	
	





```
add(jPanel1,BorderLayout.CENTER)
```
 hinzu :noe: das stimmt doch was nicht.


----------



## babuschka (5. Dez 2012)

Vllt ist dieser Code besser, ich mach da irgendein Fehler, worauf ich leider nicht komme ;(;(

	public void los(){
		JFrame fenster = new JFrame();
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fenster.setVisible(true);
		fenster.setSize(900, 600);

		int nRows = 3;
        int nCols = 3;

        panelOberfläche.setLayout(new GridLayout(nRows,nCols));

        for(int i = 0; i < nRows; i++) {
            for(int j = 0; j < nCols; j++) {
                panel = new JPanel();
                panel.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
                panel.setForeground(Color.WHITE);
                panel.setOpaque(true);
                panel.setName("x="+j+", y="+i);
                panel.add(new JLabel(panel.getName()));
                panel.setSize(50, 50);
                panel.addMouseListener(this);
                panelOberfläche.add(panel);
            }
        }

		JButton b1 = new JButton("PLAY");
		fenster.add(b1, BorderLayout.SOUTH);
		fenster.add(panelOberfläche,BorderLayout.CENTER);
	}


----------



## babuschka (5. Dez 2012)

Hab den Fehler :toll:


----------



## babuschka (12. Dez 2012)

Ich hab bisher ein super Code, falls jmd Interesse haben sollte, kann ich diese zusenden

über MouseOverview... danke an alle die mir hierbe geholfen haben :toll:


----------



## babuschka (17. Dez 2012)

Hallo,

Meine Idee ist es, einzelne Songs per Drag & Drop auf eins der Panel zu ziehen, und dann diese zu speichern.

Hat einer eine Idee, wie ich das mit dem Drag&Drop programmieren könnte?

Vielen Dank im voraus


----------



## Gast2 (17. Dez 2012)

Hast du dir schon Drag&Drop Beispiele/Tutorials angeschaut?
Bestehen da konkrete Fragen die man beantworten kann?


----------



## babuschka (17. Dez 2012)

Generell wie ich ein Musikstück per drag and Drop auf das Panel setzen kann und diese dann in der Playlist gespeichert wird


----------



## Gast2 (17. Dez 2012)

Stell konkrete Fragen, so kann man dir nicht helfen. außer dir den Hinweis zu geben ein Drag&Drop Tutorial anzuschauen.


----------



## babuschka (23. Dez 2012)

Könnt ihr mir bitte sagen, wieso er jedes Mal bei der Zeile
List<File> listFile = (List<File>) meckert? Vorschläge?

meine Methode:

```
public boolean importData(TransferSupport info){   
    if(!canImport(info))
        return false;
    //Transferobjekt holen
    Transferable transfer = info.getTransferable();
    
    try{     
        List<File> listFile = (List<File>)
                transfer.getTransferData(DataFlavor.javaFileListFlavor);
        for (File file : listFile) {
            Track importedTrack = track.importTrack(file.getPath());
        }
    }catch(UnsupportedFlavorException e){
        e.printStackTrace();
    }catch(IOException e){
        e.printStackTrace();
    }
    return false;
}
```

Vielen Dank vorab :toll:


----------



## babuschka (25. Dez 2012)

Hab das Problem gelöst.

Könnt ihr mir vllt mal die Logik erklären von Drag.

Also wenn ich auf das Panel ein Lied hineinziehe, soll es in eine Playlist gespeichert werden.

Wenn der Benutzer dann auf diesen Panel klickt, soll ´mein Player per Zufall ein Lied hinausziehen.

Ich hab meine MyTransferHandler Klasse mit der Methode importData.
Dann hab ich die Klasse MP3Player,Track und Playlist.

Vllt mal kurz erklären, wie ich vorfahren soll.

Vielen Dank:toll:


----------

