GUI mit Mouse Touch

babuschka

Top Contributor
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:
 
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 😉

Die Funktion
Code:
contains()
der Klasse Rectangle dürfte es auch tun. 🙂
 
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.
 
Hast du vllt ein Bsp?😳

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

Java:
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);
	}

}
 
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
 
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.
 
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:

Java:
@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.
 
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.
 
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
 
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

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.
 
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);
}
 
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
Code:
add(jPanel1,BorderLayout.CENTER)
hinzu :noe: das stimmt doch was nicht.
 
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);
}
 
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:
 
Zuletzt bearbeitet von einem Moderator:
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
 
Hast du dir schon Drag&Drop Beispiele/Tutorials angeschaut?
Bestehen da konkrete Fragen die man beantworten kann?
 
Stell konkrete Fragen, so kann man dir nicht helfen. außer dir den Hinweis zu geben ein Drag&Drop Tutorial anzuschauen.
 
Könnt ihr mir bitte sagen, wieso er jedes Mal bei der Zeile
List<File> listFile = (List<File>) meckert? Vorschläge?

meine Methode:
Java:
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:
 
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:
 

Zurück
Oben