Koordinaten

MiRaMC

Erfahrenes Mitglied
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!
 
Kann ich so nicht machen, weil ich dadurch dass die Panels in einer for-Schleife erzeugt werden, nicht auf deren Eigenschaften zugreifen kann.
 
Zuletzt bearbeitet:
Hallo,

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

Java:
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
 
OK, ich hab jetzt das was ich will. Musste zwar noch einiges umbauen aber letztlich passts. Danke an Alle!
 
Zurück