location point eines JLabel ändern?

Sensimillia

Grünschnabel
Hallo Forum,

Ich bin gerade dabei ein "selection rectangle" in ein Tool einzubauen, wie man es von Windows kennt, wenn man zum Beispiel im Explorer ins leere klickt und dann mit gedrückter Maustaste mehrere Ordner und Dateien markiert.
Dabei bin ich so vorgegangen:
Beim 'mousePressed' Event erstelle ich ein neues JLabel und setzte mit 'setLocation()' die Position des Labels auf die momentane Maus-Position.
Im 'mouseDragged' Event wird das Label entsprechend der Mausbewegung vergrössert oder verkleinert.
Problem ist, dass sich das Label nur nach Rechts und nach Unten vergrössern lässt, weil bei 'setLocation' der Fixpunkt automatisch auf die linke obere Ecke des Label gesetzt wurde.
Will ich aber das Rechteck nach links oder nach oben ziehen, so müsste der Fixpunkt auf die rechte untere Ecke gesetzt werden.
Ist das irgendwie möglich? Andere Lösung?
Ich hoffe es ist für euch nachvollziehbar, was ich da erklärt habe.
Schonmal Danke fürs durchlesen.

Gruss Sensi
 
Keine Ahnung, ob du da den Punkt verändern kannst, aber wenn du nach links oben gehen willst, änder doch einfach die Werte um mit minus werten
 
Hallo,

du musst die Punkte berechnen. Ich hab sowas auch schon gemacht und so gelöst. Ich denke es ist verständlich ohne Erklärung. Das hat in der mouseDragged-Methode gestanden. Die Punkte startX und startY hab ich in der mousePressed-Methode gesetzt.

Code:
endX = e.getPoint().x;
              endY = e.getPoint().y;

              if (startX < endX)
              {
                if (startY < endY)
                {
                  rectStartX = startX;
                  rectStartY = startY;
                  rectWidth = endX - startX;
                  rectHeight = endY - startY;

                }
                else
                {
                  rectStartX = startX;
                  rectStartY = endY;
                  rectWidth = endX - startX;
                  rectHeight = startY - endY;
                }
              }
              else
              {
                if (startY < endY)
                {
                  rectStartX = endX;
                  rectStartY = startY;
                  rectWidth = startX - endX;
                  rectHeight = endY - startY;
                }
                else
                {
                  rectStartX = endX;
                  rectStartY = endY;
                  rectWidth = startX - endX;
                  rectHeight = startY - endY;
                }

MFG

zEriX
 
Ich würde es aber gar nicht mit einem JLabel versuchen, sondern das Rechteck selbst zeichnen.

Schau mal hier
Java:
package de.tutorials.swing;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.event.MouseInputAdapter;

@SuppressWarnings("serial")
public class SelectionRectangleExample extends JFrame {

	public SelectionRectangleExample() {

		setSize(500, 500);
		setLocationRelativeTo(null);

		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setLayout(new GridLayout(1, 1));
		add(new SelectionRectanglePanel());
	}

	public static void main(String[] args) {
		new SelectionRectangleExample().setVisible(true);

	}

	@SuppressWarnings("serial")
	public class SelectionRectanglePanel extends Component {

		private int startX, startY, endX, endY, rectStartX, rectStartY,
				rectWidth, rectHeight;

		public SelectionRectanglePanel() {
			SelectionMouseListener listener = new SelectionMouseListener();
			addMouseListener(listener);
			addMouseMotionListener(listener);
		}

		public void paint(Graphics g) {
			super.paint(g);

			Graphics2D g2 = (Graphics2D) g;

			drawShape(g2, rectStartX, rectStartY, rectWidth, rectHeight);

		}

		private final void drawShape(final Graphics2D g2d, final int x,
				final int y, final int width, final int height) {
			AlphaComposite composite = AlphaComposite.getInstance(
					AlphaComposite.SRC_OVER, 0.25f);
			g2d.setComposite(composite);
			g2d.setColor(Color.blue);
			g2d.fillRect(x, y, width, height);
			composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
					1.0f);
			g2d.setComposite(composite);
			g2d.drawRect(x, y, width - 1, height - 1);

		}

		private class SelectionMouseListener extends MouseInputAdapter {
			@Override
			public void mousePressed(MouseEvent e) {
				startX = e.getPoint().x;
				startY = e.getPoint().y;
			}

			@Override
			public void mouseDragged(MouseEvent e) {
				endX = e.getPoint().x;
				endY = e.getPoint().y;

				if (startX < endX) {
					if (startY < endY) {
						rectStartX = startX;
						rectStartY = startY;
						rectWidth = endX - startX;
						rectHeight = endY - startY;

					} else {
						rectStartX = startX;
						rectStartY = endY;
						rectWidth = endX - startX;
						rectHeight = startY - endY;
					}
				} else {
					if (startY < endY) {
						rectStartX = endX;
						rectStartY = startY;
						rectWidth = startX - endX;
						rectHeight = endY - startY;
					} else {
						rectStartX = endX;
						rectStartY = endY;
						rectWidth = startX - endX;
						rectHeight = startY - endY;
					}
				}
				repaint();
			}

			@Override
			public void mouseReleased(MouseEvent e) {
				rectHeight = 0;
				rectWidth = 0;
			}
		}
	}

}

MFG

zEriX
 
Zurück