Jliste

Guten Abend,

ich habe folgendes Problem:

Ich habe 3 Jlisten in meiner Benutzeroberfläche erstellt, einmal für Sender Empfänger und Nachricht.

Die einzelnen Jlisten werden von einer Excel-Datei mit Daten gefüllt.

Die Excel-Datei sieht folgendermaßen aus:

Nachricht Sender Empfänger Latenz
MSG1 ECU1 ECU2 0,16
MSG1 ECU1 ECU2 0,16
MSG1 ECU1 ECU2 0,13
MSG1 ECU1 ECU2 0,12
MSG2 ECU3 ECU1 0,14
MSG2 ECU3 ECU1 0,15
MSG2 ECU3 ECU1 0,14
MSG3 ECU2 ECU3 0,14
MSG3 ECU2 ECU3 0,14
MSG3 ECU2 ECU3 0,14
MSG4 ECU1 ECU4 0,19
MSG4 ECU1 ECU4 0,18
MSG5 ECU2 ECU3 0,14
MSG5 ECU2 ECU3 0,14
MSG6 ECU1 ECU3 0,14
MSG6 ECU2 ECU3 0,14
MSG6 ECU2 ECU3 0,14

Nun möchte ich, wenn ich einen Sender in der ersten JListe auswähle, dann kriege ich in JListe des Empfängers nur die Empfänger angezeigt bekommen, die eine Nachricht vom ausgewählten Sender erhalten. Genauso gilt für Nachricht, wenn ich einen Empfänger ausgewählt habe dann kriege ich in der JListe der Nachricht, nur die Nachrichten angezeigt die von den ausgewählten Sender und Empfänger abhängen.

Zum Beispiel:

Wenn ich als Sender ECU1 auswähle muss ich beim Empfänger ECU2 und ECU4 angezeigt bekommen, wähle ich bei Empfänger ECU4 dann müssen in der JListe der Nachricht MSG4 und MSG6 angezeigt werden.

ich hoffe, ich könnte mein Problem gut beschreiben

Viele Grüße

Was du sicherlich mal als erstes brauchst, ist eine Möglichkeit herauszufinden welche Elemente überhaupt selektiert sind. Das kannst du mit einem ListSelectionListener machen. z.B. auf diese Weise:


import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.ListModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class JListeTest {
	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setBounds(20, 20, 400, 400);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		final JList<Sender> senderList = new JList<>();
		senderList.setModel(createSenderModel());
		frame.add(new JScrollPane(senderList));
		
		senderList.addListSelectionListener(new ListSelectionListener() {
			@Override
			public void valueChanged(ListSelectionEvent e) {
				if(!e.getValueIsAdjusting()){
					// das if statement ist optional
					
					System.out.println(senderList.getSelectedValuesList());
				}
			}
		});
		
		frame.setVisible(true);
	}
	
	private static ListModel<Sender> createSenderModel(){
		DefaultListModel<Sender> model = new DefaultListModel<>();
		model.addElement(new Sender("sender a"));
		model.addElement(new Sender("sender b"));
		model.addElement(new Sender("sender c"));
		model.addElement(new Sender("sender d"));
		return model;
	}
	
	private static class Sender{
		private String name;
		
		public Sender(String name){
			this.name = name;
		}
		
		@Override
		public String toString() {
			return name;
		}
	}
}

[QUOTE=Unregistriert]…
MSG6 ECU1 ECU3 0,14

Wenn ich als Sender ECU1 auswähle muss ich beim Empfänger ECU2 und ECU4 angezeigt bekommen[/QUOTE]

Ich hätte jetzt vermute, dass auch ECU3 dazugehört. (Der ECU heißt jetzt übrigens „Euro“ :smiley: ), aber vielleicht war das nur ein Versehen. So ganz sind die Abhängigkeiten nicht klar. Sollen auch Mehrfachauswahlen möglich sein? Sind die einzelnen Zeilen eindeutig, bzw. was steht (auf Basis der gegebenen Excel-Datei) in den Listen drin? Welche Datenstrukturen verwendest du bisher? Schreibst du das direkt in die JList bzw. ListModels?

Von all diesen Fragen hängt ab, was die „geeignetste“ Lösung wäre. EINE Möglichkeit KÖNNTE sein: Man erstellt eine Klasse für die Zeilen, pragmatisch

class Row {
    private String message;
    private String sender;
    private String receipient; 
    // Konstruktor und getter dafür...
}

Dann könnte man bei jeder Auswahl (die man mit einem ListSelectionListener mitbekommt) das jeweils andere ListModel leeren, und mit GROB sowas wie

for (Row row : allRows)
{
    if (row.getSender().equals(selectedSender)) otherListModel.add(row.getReceipient());
}

das andere ListModel füllen. Aber ggf. könnte man da auch ein paar allgemeine, praktische Filtering-Klassen drumrumbauen. Beschreib’ ggf mal genauer, und poste vielleicht ein bißchen vom bestehenden Code.

Ich denke, du solltest für Nachricht und Station jeweils eine entsprechende Klasse schreiben. Beim ersten Durchlauf durch die Excel-Liste kannst du dann für jede Nachricht/Station, die noch nicht existiert, ein Objekt der entsprechenden Klassen erstellen (als Speicherstruktur würde sich dabei wohl eine Map anbieten, Schlüssel der Name der Station/Nachricht). Anschließend durchläufst du die Liste ein zweites Mal und stellst die Verbindungen zwischen den Objekten her. Nehmen wir z.B. die Nachricht als zentrale Klasse, dann würdest du zu jeder Nachricht in deren Objekt den Sender und eine Liste aller Empfänger hinterlegen. Die Stationen bekämen hingegen einen Verweis auf alle Nachrichten, die sie gesendet oder empfangen haben. Also in etwa sowas:


	private Station sender;
	private List<Station> receivers;
}

class Station {

	private List<Message> sendedMessages;
	private List<Message> receivedMessages;
}```
Zusammen mit dem Listener von Beni könntest du dann bei der Selektion demensprechend über Station und Message die benötigten Objekte zusammensammeln und als Inhalt der Listen setzen.
Nicht sicher, ob das der beste Ansatz ist, aber es sollte gehen.