# Koordinaten



## MiRaMC (6. Mai 2006)

Also zusammen, hier mein Problem:

Ich erzeuge in einer for-Schleife eine Reihe untereinander liegender JPanels (Höhe: 30 Pixel). Die Anzahl der JPanels variiert. Wenn auf ein solches Panel geklickt wird, soll eine Aktion ausgeführt werden welche die Zahl braucht, an welcher Stelle dieses Panel liegt. 
Also lese ich bei einem Mausklick die Mauskoordinaten in der gesammten Liste aus. Ist die Y-Koordinate also zwischen 0 und 30 ist die Position des Panels 1, zwischen 31 und 60, 2 usw.
Um die aus den Mauskoordinaten die Position zu berechnen hab ich es mit Y-Koordinate / 30 versucht. Weil dabei aber in den wenigsten fällen eine gerade Zahl rauskommt, gibt es starke rundungsfehler, was dieses Verfahren unmöglich macht. 
Wie soll ich dass aber sonst machen? 
Danke an alle die sich die Mühe machen, ihre Gehirnzellen anzustrengen!


----------



## flashray (6. Mai 2006)

Hallo,

da brauchst du nichts zu rechnen. Die Klase JPanel stellt die Methoden getLocation() und getLocationOnScreen() zur Verfügung. Eine liefert die Koordinaten relativ zum Container in der sich diese befindet, und die andere absolute Koordinaten bezogen auf die linke obere Ecke des Bildschirms.

http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JPanel.html


Vg Erdal


----------



## MiRaMC (7. Mai 2006)

Kann ich so nicht machen, weil ich dadurch dass die Panels in einer for-Schleife erzeugt werden, nicht auf deren Eigenschaften zugreifen kann.


----------



## flashray (7. Mai 2006)

Hallo,

wenn du auf die panels klickst erfährst du ihre Koordinaten.


```
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class ColoredPanels extends JFrame implements ActionListener {

	private JButton btn = new JButton("Generate new panels");

	private JPanel panel = new JPanel();

	public ColoredPanels() {
		super("Example");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setAlwaysOnTop(true);
		this.setLocationByPlatform(true);
		this.setSize(480, 640);

		panel.setLayout(new FlowLayout());
		btn.addActionListener(this);
		this.generate();

		this.add(panel, BorderLayout.CENTER);
		this.add(btn, BorderLayout.SOUTH);

		this.setVisible(true);
	}

	public static void main(String[] args) {
		new ColoredPanels();
	}

	public void generate() {
		panel.removeAll();
		panel.setLayout(new FlowLayout());
		int r = (int) (Math.random() * 50);
		r = r == 0 ? 1 : r;
		for (int i = 0; i < r; i++) {
			panel.add(new JColoredPanel());
		}
		panel.updateUI();
	}

	public void actionPerformed(ActionEvent e) {
		generate();
	}

	class JColoredPanel extends JPanel {
		public JColoredPanel() {
			int r = (int) (Math.random() * 3);
			r = r == 0 ? 3 : r;
			System.out.println(r);
			switch (r) {
			case 1:
				this.setBackground(Color.BLUE);
				break;
			case 2:
				this.setBackground(Color.GREEN);
				break;
			case 3:
				this.setBackground(Color.RED);
			}
			this.setBorder(BorderFactory.createEtchedBorder());
			this.setPreferredSize(new Dimension(50, 50));
			this.setMinimumSize(new Dimension(50, 50));
			this.addMouseListener(new MouseAdapter() {
				public void mouseReleased(MouseEvent e) {
					String loc1 = ((JPanel) e.getSource()).getLocation()
							.toString();
					String loc2 = ((JPanel) e.getSource())
							.getLocationOnScreen().toString();
					String col = ((JPanel) e.getSource()).getBackground()
							.toString();
					JOptionPane.showMessageDialog(JColoredPanel.this,
							"Location:" + loc1 + "\nLocationOnScreen:" + loc2
									+ "\nColor:" + col);
				}

			});
		}
	}
}
```


Vg Erdal


----------



## MiRaMC (7. Mai 2006)

Sehr interessant! Probier grad aus. Kann ich glaub was draus machen! Danke!


----------



## MiRaMC (7. Mai 2006)

OK, ich hab jetzt das was ich will. Musste zwar noch einiges umbauen aber letztlich passts. Danke an Alle!


----------

