Drag & Drop durch Verbindungslinien

Fartos

Mitglied
Hallo,

ich hab mal eine Frage und zwar, wie kann ich zwischen 2 Elementen mittels Verbindungslinien
miteinander verknüpfen, sodass ein update stattfinden kann.
Die Zwei Elemente sind Attribute aus DB-Tabelle.
Da ich keine Erfahrung mit GUI habe, habe ich mir gedacht, dass ich mit D&D das
lösen kann. Nur wie mache ich es mit den Verbindungslinien?

Könnte mir jemand auf die Sprünge Helfen?

Vg
 
Die Frage ist so allgemein formuilert, dass man da nur "in dem du eine Linie zeichnest" antworten kann.
Was genau machst du denn? Wie stellst du die "Attribute aus DB-Tabelle" dar? Soll es einfach nur von A nach B-Linie sein, oder müssen da ganz abgefahrene Algos dahinter stecken, die die Überschneidungen der Linien verringern?
 
danke erstmal für die schnelle Antwort.

Die Idee kommt eigentlich von den DatenmappingsTools wie stylos oder Altova.
D.h wenn ich z.b Att(A) klicke ziehe ich damit eine Linie zur Att(B) dann soll ein Event ausgelöst
werden und im Hintergrund sorgt ein Algorithmus für das update zwischen den beiden Atts.
A und B sind 2 Attribute aus 2 Tabellen in DB.

Übernimmt eigentlich das Linienziehen nicht die Aufgabe des DnD?
 
Mir ist nach wie wo keine Klasse
Code:
JTableAttribute extends JComponent
bekannt. Und warum soll Drag & Drop irgendwas zeichnen? oO
Hast du überhaupt schon irgendwas Code-ähnliches?
 
wenn ich dich richtig verstehe, dann wirst du wohl die Mausdaten auslesen müssen und zwischen mousePressed und mouseReleased die Linie selbst zeichnen.
Dann schaust du nach, was sich in deiner GUI am Start und am Ende deiner Linie befindet, und startest dann dein was auch immer.

Mit DnD hat das nix zu tun.

Gruß Vanny
 
ja ja stimmt @vanny das hat wohl mit DnD nixt zu tun. Jetzt wird es mir langsam klarer, wie ich vorgehen soll. Aber nur mit Eure Hilfe wird es mir gelingen, was ich vorhabe zu implementieren.

Also mit mousePressed fange ich die Linie zu zeichnen bis ich die mouse loslasse. Dabei ermittele ich den beiden Werten bei mousePressed und bei mouseReleased. Diese beiden Werte dienen als Variablen in den Algorithmus, der nach dem Loslassen der mouse starten soll.

Vielleicht könntet ihr mir noch ein paar Vorschläge geben, wie ich das ganze implementieren kann. Ich meine, welche Funktionen in Java, mit denen ich den geklickten Werte ermitteln kann und wie ich ein Event starten kann nach dem ich die Mouse loslasse.

Besten dank im voraus
 
Sorry @vanny aber,

ich hab schon in meinem ersten Beitrag geschrieben, dass ich keine Erfahrung auf diesem Gebiet habe.
Einfach irgend ein Code hier rein zu basteln und korrigieren zu lassen würde mir nur sehr wenig helfen.
Am besten hätte ich gern, dass du oder einer der Exp. mir auf paar praktische Hinweise bringt, wie ich z.b ein Event auslösen(Methode zu Daten updaten z.b) kann wenn ich die mouse loslasse und ....... sonst den anderen Weg kann ich selber gehen.

Vg
 
1. Mainclass:

Java:
import javax.swing.SwingUtilities;

public class StartIt {
	
	public static void main(String[] args) {
		
		SwingUtilities.invokeLater(new Runnable() {
			
			public void run() {
				new HauptFenster();
			}
		});
		
	}

}

2. Dein Frame:

Java:
package gui;

import java.awt.BorderLayout;
import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class HauptFenster extends JFrame{
	
	private JLabel lblPosition;
	
	public HauptFenster(){
		
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setTitle("Maus abfragen...");
		this.setSize((int)(java.awt.Toolkit.getDefaultToolkit().getScreenSize().getWidth()*0.8), (int)(java.awt.Toolkit.getDefaultToolkit().getScreenSize().getHeight()*0.8));
		this.setLocationRelativeTo(null);
		
		lblPosition = new JLabel();
		MausBereich mausBereich = new MausBereich(this);
		
		this.getContentPane().add(BorderLayout.NORTH, lblPosition);
		this.setVisible(true);
	}
	
	public void setLabelText(int x, int y, Color c){
		lblPosition.setForeground(c);
		String text = 	"<html>Mausposition :<br>" +
						"x = <b>" + x + "</b><br>" +
						"y = <b>" + y + "</b><br>" +
						"</html>";
		lblPosition.setText(text);
		repaint();
	}

}

3. Deine Mausfläche incl. Listener:

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class MausBereich extends JPanel implements MouseMotionListener {

	private HauptFenster hauptFenster;
	private MouseEvent me;
	private int x1, y1, x2, y2;
	private boolean lineStart;
	

	public MausBereich(HauptFenster hauptFenster) {
		this.hauptFenster = hauptFenster;
		this.setBackground(Color.WHITE);
		this.addMouseMotionListener(this);
		hauptFenster.getContentPane().add(BorderLayout.CENTER, this);

	}

	public void mouseDragged(MouseEvent e) {
		if(!lineStart){
			lineStart = true;
			x1 = (int) e.getPoint().getX();
			y1 = (int) e.getPoint().getY();
		}
		final MouseEvent me = e;
		SwingUtilities.invokeLater(new Runnable() {

			public void run() {
				x2 = (int) me.getPoint().getX();
				y2 = (int) me.getPoint().getY();
				hauptFenster.setLabelText((int) me.getPoint().getX(),
						(int) me.getPoint().getY(), Color.RED);
				
			}
		});
	}

	public void mouseMoved(MouseEvent e) {
		lineStart = false;
		final MouseEvent me = e;
		SwingUtilities.invokeLater(new Runnable() {

			public void run() {
				hauptFenster.setLabelText((int) me.getPoint().getX(),
						(int) me.getPoint().getY(), Color.BLACK);
			}
		});
	}
	
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		if(lineStart){
			g.drawLine(x1, y1, x2, y2);
		}
	}

}

mit dem MouseListener verhält es sich ähnlich.
Was du nun für Methoden benötigst, um deine Logik zu steuern hängt nun witklich von etwas mehr Information ab.
Ich denke mal damit kommst du aber schon mal ein Stück weiter.


Gruß Vanny
 
Zuletzt bearbeitet von einem Moderator:
Naja Krampf ^^..ne is richtig, ich hatte etwas anderes ausprobiert und vergessen es wieder zurück zu setzen^^ sry.

aber sollte er dann mit mehreren Threads arbeiten, wäre das Problem ja schon mal gelöst xD.
Ich lasse es jetzt aber mal so, damit dein Post hier nich aus dem Kontext gerissen wird.

Gruß und danke für den Hinweis Vanny😳
 

Zurück
Oben