# JList mit 2-zeiligen Objekten füllen



## markus99 (30. Apr 2012)

Hallo! Eines vorweg: ich bin Anfänger!

Dank dem Forum hier bin ich gestern (bzw. heute bis 5 früh) schon wesentlich weiter mit meinem kleinen Projekt.

Zuerst muss ich Netzwerk-Adapternamen und die zugehörige IP-Adresse auszulesen (*funktioniert*)

Ich speichere dann den Namen und die IP-Adresse als String in 2 verschiedenen Hashmaps mit demselben Index und rufe diese über eine while Schleife in meinem JList Objekt ab (_funktioniert_).

Nun stehe ich vor der nächsten Hürde!
Ich möchte 2 Zeilen "zusammenführen", also einmal den Adapternamen und direkt darunter die zugehörige IP-Adresse als eine Zeile(bzw. selektion) nutzbar machen.

Und es wird noch besser! Ich möchte unbedingt eine Grafik an der Linken Seite in diesen "2 Zeilen" (was ja ein Eintrag werden soll) anzeigen.

Ich glaube das funktioniert nur irgendwie über spezielle Objekte innerhalb einer JList.
Gibt es hierzu Referenzcode?

Alleine komm ich irgendwie nicht weiter :bahnhof:


----------



## turtle (30. Apr 2012)

> Ich möchte 2 Zeilen "zusammenführen", also einmal den Adapternamen und direkt darunter die zugehörige IP-Adresse als eine Zeile(bzw. selektion) nutzbar machen


Ein JLabel Text kann mit HTML formatiert werden, wie hier schön beschrieben.

Natürlich kann ein JLabel auch ein Bild + Text anzeigen und Du kannst angeben, wo das Bild relativ zum Text (oben, unten, links, rechts) sein kann.



> Ich speichere dann den Namen und die IP-Adresse als String in 2 verschiedenen Hashmaps mit demselben Index


Das würde ich anders machen und beide Attribute in EINEM Objekt speichern.


----------



## bERt0r (30. Apr 2012)

Wenns komplexer werden sollte kannst du dir deinen eigenen ListCellRenderer schreiben, das kann dann z.B ein Panel sein mit mehreren Labels.


----------



## markus99 (30. Apr 2012)

turtle hat gesagt.:


> Ein JLabel Text kann mit HTML formatiert werden, wie hier schön beschrieben.


Danke für den Link, soetwas habe ich auch schon länger gesucht!
Nun die Frage aller Fragen, wie erstelle ich praktisch ein neues Objekt (und auf welcher Basis?) mit HTML-Inhalten, um diese dann einer Liste hinzuzufügen?



turtle hat gesagt.:


> Natürlich kann ein JLabel auch ein Bild + Text anzeigen und Du kannst angeben, wo das Bild relativ zum Text (oben, unten, links, rechts) sein kann.
> Das würde ich anders machen und beide Attribute in EINEM Objekt speichern.



Ich kann mir schon ungefähr vorstellen wie das aussieht, wollte das auch so umsetzen.
Die 2 Hashmaps sind nur temporär.

Hier mal der Inhalt der Klasse, falls es irgendwie hilft (vielleicht gibt es noch andere gravierende Hirnzwirbler?).
Es gibt 4 Klassen, die MainDialog ist die Hauptklasse. Die holt sich ein "listScrollPane" Objekt, welches in der untenstehenden Klasse befüllt wird.


```
import javax.swing.*;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.*;

public class MainDialogAdapterList
{
	JList<String> wordList;
	JScrollPane listScrollPane = new JScrollPane();
	HashMap<Integer, String> map1 = new HashMap<Integer, String>();
	HashMap<Integer, String> map2 = new HashMap<Integer, String>();
	
	public MainDialogAdapterList()
	{
		fuelleAdapterListe();
		DefaultListModel<String> model = new DefaultListModel<String>();
		int laenge = 0;
		while (laenge < map2.size())
		{
			model.addElement(map1.get(laenge));
        		model.addElement(map2.get(laenge));
        		laenge++;
		}
                wordList = new JList<String>(model);

		//wordList = new JList(words); //backup
		listScrollPane.add(wordList);
		listScrollPane.getViewport().add(wordList);
		listScrollPane.setLocation(50,50);
		listScrollPane.setBounds(50,50,350,350);
		listScrollPane.setVisible(true);
	}
	
	private void fuelleAdapterListe()
	{
		try 
		{
			Enumeration<NetworkInterface> interfaceNIC = NetworkInterface.getNetworkInterfaces();
			int x = 1;
			int y = 0; //templösung
			while (interfaceNIC.hasMoreElements()) 
			{
				NetworkInterface n = interfaceNIC.nextElement();
				Enumeration<InetAddress> addresses = n.getInetAddresses();
				while (addresses.hasMoreElements()) 
				{
					InetAddress address = addresses.nextElement();
					if(!address.getHostAddress().contains(":") && !address.getHostAddress().contains("%"))
					{
						map1.put(y, "NIC "+ y +": " + n.getDisplayName()); //alternative, befüllen der hashmap1 mit wert 0++ für Adapter
						x++;
						map2.put(y, "- " + address.getHostAddress()); //alternative, befüllen der hashmap2 mit wert 0++ für IP
						x++; //x = 2 nach D1
						y++; //templösung
					}
				}
			}
		}
	        catch (SocketException e)
	        {
                e.printStackTrace();
	        }		
	}
}
```


----------



## Marco13 (30. Apr 2012)

Was machst du denn, wenn man in der Liste was auswählt? (Worauf ich raus will: Man könnte in Erwägung ziehen, einfach InetAddress-Objekte in die Liste zu legen....)


----------



## markus99 (30. Apr 2012)

Also mit dem Tool übe ich praktisch nur den effektiven Einsatz mit Java.

Ich möchte am Ende Profile für Netzwerkadapter anlegen, mitsammt out-of-the-box (windows commands).

Edit:
Eigene Felder für IP/Subnet Masken usw. benötige ich beim übernehmen der Profile natürlich auch!
Gut zu wissen dass es das bereits in java gibt.


----------



## markus99 (30. Apr 2012)

Ich bin leider noch nicht weitergekommen.

Mit HTML würde es zwar klappen, aber wie kann ich ein Objekt im html-code einbinden?
Alle Beispiele die ich so finde sind rein statisch.

Und den ListCellRenderer kann ich mir "nicht selbst schreiben", da ich nun zwar ungefähr weiß wie er aufgebaut sein soll, aber wie in der ersten Zeile im ersten Beitrag ersichtlich ist bin ich totaler Anfänger 


*Edit: Kleiner Fortschritt zwischendurch.*
Habe nun gelernt dass man -> " <- in HTML Code den man gerne in Strings verwendet durch -> \" <- ersetzen muss.

Nächste Hürde: Wie kann ich in Eclipse eine Resource "definieren"?
Ich möchte gerne eine Bilddatei statisch im Projekt unterbringen und diese über HTML-Code in meiner JList aufrufen.

Dabei habe ich bereits versucht die Datei ins root der java Files zu kopieren und über <img src=\"name.jpg\"> aufzurufen. Hat jemand Erfahrung/Hinweise diesbezüglich?

EDIT: Wenn ich das Bild über den http:// Link aufrufe funktioniert es tadellos! Aber ich möchte es unbedingt irgendwie lokal verankern ;(


----------



## markus99 (1. Mai 2012)

Puhh ... Endlich habe ich die Liste in etwa so wie ich sie haben möchte!
Ziemliche fummlerei mit dem angepassten HTML code!

Das ganze läuft nun wunderbar dynamisch über 2 Schleifen, eine zum Auslesen und speichern der aktiven Netzwerkadapter, sowie eine zum Hinzufügen zur Liste.

Die Icons werde ich noch austauschen und individuell gestalten, eben für VMs, Apple Devices, VPN usw.
Für einen blutigen Anfänger nicht so übel 

Thema erledigt, Danke an alle Ratgeber!


----------

