ImageIcon in Objektarray (TableModel) einfügen.

Status
Nicht offen für weitere Antworten.

w0ddes

Bekanntes Mitglied
Hallo zusammmen,

ich stehe hier vor einem sehr komischen Problem. Zur Erklärung:

Ich habe eine JTable. Die Daten dafür sind in der (abstrakten) Klasse
Code:
MyTableModel
aus der dann ja folglich die JTable erstellt wird.
Ich möchte nun einen bestimmten String in der 2. Spalte in dem Objektarray durch ein spezifisches Icon ersetzen. (Den Objektarray benutze ich, damit man doch eigentlich
Code:
ImageIcons
einfügen kann, oder liege ich da falsch???:L)
EDIT: In Code 1 ist es noch die 3.te Spalte! 2. Spalte ergibt sich später durch den wegfall der ersten Tabellenspalte.

Mein Problem ist nun folgendes: Wenn ich die Daten IN der Klasse
Code:
MyTableModel
vorgebe (vgl. Code 1) funktioniert das ohne Probleme.
Ich habe nun die gleichen Daten in eine .txt Datei geschrieben, die Semikolons entfernt und die einzelnen "Daten" durch "Tabulatoren" getrennt. Diese .txt lasse ich vom
Code:
ParserForTableData
einlesen (vgl. Code 2).
Folglich habe ich auch den Code in
Code:
MyTableModel
angepasst. (Vgl. Code 3) Jedoch bekomme ich nun eine Fehlermeldung "ArrayStoreException".

Mir fällt grade noch was ein:
Das Einlesen funktioniert ohne Probleme. Nur das ersetzen funktioniert nicht.

Im Übrigen benutze ich Eclipse 3.4.2; jdk_1.6.0_14 ist installiert.

Aber falls ihr doch noch irgendwo Verbesserungsvorschläge habt (die ihr bestimmt habt), immer her damit :) Bin noch relativer Programmier- und Java-Anfänger.


Code1: MyTableModel "vorher"

Java:
import javax.swing.ImageIcon;
import javax.swing.table.AbstractTableModel;

/**
 * @author Jens Kröner
 */

public class MyTableModel extends AbstractTableModel {

	
	private ImageIcon enemy = new ImageIcon("images/avatar-3339.gif");
	private ImageIcon friend = new ImageIcon("images/avatar-4519.gif");
	private ImageIcon neutral = new ImageIcon("images/avatar-30.gif");
	private ImageIcon unknown = new ImageIcon("images/avatar_75-40x40.jpg");
	
	private String[] columnNames = {"ID",
						"Battlespace",
						"Affiliation",
						"Position",
						"Type",
						"Status",
						"Velocity"};
	

	//HIER sind die Daten vorgegeben:
	private Object[][] dataSensor = {{ 1, "Air", "Friend", "\"Coordinates\"","F-16", "Status", "450kmh"},
			   { 2, "Land", "Enemy", "\"Coordinates\"","Jeep", "Status", "50kmh"},
			   { 3, "Sea", "Unknown","\"Coordinates\"","Unknown","Unknown", "30kmh"},
			   { 4, "Sea", "Neutral","\"Coordinates\"","Speedboat", "Unknown", "40kmh"},
			   { 5, "Air", "Friend","\"Coordinates\"", "Helicopter","Status", "200kmh"},
			   { 6, "Unknown", "Unknown", "\"Coordinates\"", "Unknown", "UFO", "1000kmh"},
			   { 7, "Land", "Friend", "\"Coordinates\"", "Troopers", "Staus","7kmh"},
			   { 8, "Air", "Neutral","\"Coordinates\"", "Passenger Plane","Status", "400kmh"},
			   { 9, "Sea", "Neutral","\"Coordinates\"","Freighter", "Unknown", "40kmh"},
			   {10, "Land", "Unknown", "\"Coordinates\"","Jeep","Unknown","80km/h"},
			   {11, "Air", "Enemy", "\"Coordinates\"","Helicopter", "Unknown","200km/h"}};
	
        //HIER wird die Methode zum ersetzen des Strings mit dem Icon aufgerufen:
      
	private Object[][] data = transferData(dataSensor);
	

	//Das ist die Methode zum ersetzen:
	private Object[][] transferData(Object[][] data12) {
		Object[][] transferedData = data12;
		for(int i = 0; i< data12.length; i++){
			for (int j = 0; j < columnNames.length; j++){
				if (j ==2){
					String affil = data12[i][j].toString();
					if (affil.toLowerCase().contains("enemy")){
						transferedData[i][j] = enemy;
					}else if( affil.toLowerCase().contains("friend")){
						transferedData[i][j] = friend;
					}else if(affil.toLowerCase().contains("neutral")){
						transferedData[i][j] = neutral;
					}else if(affil.toLowerCase().contains("unknown")){
						transferedData[i][j] = unknown;
					}else{
						transferedData[i][j] = affil;
					}
				}else{
					transferedData[i][j] = data12[i][j];
				}
			}
		} 
		return transferedData;
	} 
	
	//hier folgen noch für das Problem unwichtige Methoden (getColumnCount etc ...)
    
}


Code 2: Parser!

Java:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
//import java.util.Scanner;

public class ParserForTableData {
		
	private File source = null;
	public Object[][] daten = null;
	

        //2 Konstruktoren :

	public ParserForTableData(File file){
		source = file;		
	}
	
	public ParserForTableData(String string){
		source = new File(string);
	}
	

        //die wichtigste Methode:

	public Object[][] getData(){
		
		/*
		 * Diese Methode würde Wort für Wort einlesen -> Problem wenn Leerzeichen enthalten sind
		 */
		
                /*	
                ArrayList<Object> eingelesen =new ArrayList<Object>();
		Object wort = null;
		
		try{
		  	Scanner sc =new Scanner(source);			
		
			while (sc.hasNext()) {
				wort = sc.next();
				eingelesen.add(wort);
				
				if (DEBUG){
					System.out.println("Gelesenes Wort: " + wort);
				}
			}
			System.out.println(eingelesen);	
		} catch (IOException e) {
			e.printStackTrace();
		}
					
			
		*/
			
			
			
		
			// Dieser Abschnitt liest den Text ZEILENWEISE aus der Datei und speichert in einer ArrayList -> man kann jede Zeile einzeln abrufen
		
          try{	
			BufferedReader in = new BufferedReader(new FileReader(source));
			ArrayList<String> text = new ArrayList<String>();
			String zeile = null;
			while ((zeile = in.readLine()) != null)        //-> bis zum Ende lesen
			{
				text.add(zeile); 				
			}
			
			
		        //Dieser Abschnitt speichert jede Zeile zuerst in einem String und splittet diesen dann nach "\t" (RegEx für Tabulator)
			 
			daten = new Object[text.size()][6];   	// Größe des Arrays nach "Anzahl der Zeilen" und "Anzahl Spalten" (Spalten sind vorgegeben)
			
			for(int i=0; i < text.size(); i++){
								
				String puffer = text.get(i);	
				String[] temp = new String[6];		//auch hier: Größe des Array nach "Anzahl der Spalten" (Vorgegeben)
				temp = puffer.split("\t");			//Aufsplitten des Arrays
								
				for (int j = 0; j <= temp.length; j++){		//Schleife so lang, wie es Zeilen gibt		
					daten[i] = temp;						//gesplitteter String wird in einzelne Felder je Zeile eingefügt
				}
			}

		} catch	(FileNotFoundException e){
				e.printStackTrace();
			}	
		} catch (IOException e) {
				e.printStackTrace();
		}
		}
		
		return daten;
	}
}


Code 3: Der geänderte "MyTableModel" Code

Java:
package qwert;

//import java.util.Arrays;
import javax.swing.ImageIcon;
import javax.swing.table.AbstractTableModel;

/**
 * @author Jens Kröner
 */

public class MyTableModel extends AbstractTableModel {

	
	private ImageIcon enemy = new ImageIcon("images/avatar-3339.gif");
	private ImageIcon friend = new ImageIcon("images/avatar-4519.gif");
	private ImageIcon neutral = new ImageIcon("images/avatar-30.gif");
	private ImageIcon unknown = new ImageIcon("images/avatar_75-40x40.jpg");
	
	public ParserForTableData tableData = new ParserForTableData("O:\\appl\\Desktop\\data.txt");
	
	private static final long serialVersionUID = 1L;	
	
	private String[] columnNames = {"Battlespace",
									"Affiliation",
									"Position",
									"Type",
									"Status",
									"Velocity"};
	
	private Object[][] dataAusDatei = tableData.getData();  
	
	private Object[][] data = transferData(dataAusDatei);		// könnte auch als private Object[][] data = transferData(tableData.getData());  geschrieben werden.
	
	
	
	private Object[][] transferData(Object[][] dataToTransfer) {
		Object[][] transferedData = dataToTransfer;	
		  for(int i = 0; i< dataToTransfer.length; i++){
			for (int j = 0; j < columnNames.length; j++){
				if (j == 1){
					String affil = dataToTransfer[i][j].toString();
					if (affil.toLowerCase().contains("enemy")){
						transferedData[i][j] = enemy;
					}else if(affil.toLowerCase().contains("friend")){															
						transferedData[i][j] = friend;						
					}else if(affil.toLowerCase().contains("neutral")){
						transferedData[i][j] = neutral;
					}else if(affil.toLowerCase().contains("unknown")){
						transferedData[i][j] = unknown;
					}else{
						transferedData[i][j] = affil;
					}
				}
			}
		} 
		return transferedData;
	} 
	
	
     //hier würden wieder die "unwichtigen" Methoden folgen...
    
    
}

Edit: Der vollständigkeithalber auch noch der Inhalt der .txt

Air Friend 1.5,5.2 F-16 Tank voll 450.0
Land Enemy 2.4,5.2 Jeep Munition leer 50.0
Sea Unknown 1.6,2.7 Unknown N/A 30.0
Sea Neutral 2.1,3.7 Speedboat N/A 40.0
Air Friend 3.4,5.3 Helicopter Beschädigt 200.0
Air Unknown 10.3,4.5 Unknown UFO 1000.0
Land Friend 3.4,5.6 Troopers Verwundet 7.0
Air Neutral 2.8,6.4 Passenger Plane N/A 400.0
Sea Neutral 7.3,4.4 Freighter N/A 40.0
Land Unknown 3.3,5.8 Jeep Tank leer 80.0
Air Enemy 5.5,1.1 Helicopter Attacking 200.0

und die Fehlermeldung:

Code:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayStoreException: javax.swing.ImageIcon
	at qwert.MyTableModel.transferData(MyTableModel.java:45)
	at qwert.MyTableModel.<init>(MyTableModel.java:32)
	at qwert.TEST.<init>(TEST.java:22)
	at qwert.TEST$2.run(TEST.java:90)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)




Schonmal vielen Dank im Voraus! Falls ich was vergessen hab, sagt es mir :)

Greetz
Jens
 
Zuletzt bearbeitet:

fastjack

Top Contributor
Hi,

setze doch mal an wichtige Stellen den günstigsten und schnellsten Debugger der Welt ein ;) Ich würde jetzt erst mal mit System.out.println() schauen, ob der Parser richtig arbeitet und dann in MyTableModel genau dasselbe für transferData machen. Schau einfach mal was in den Methoden reinkommt, passiert und rauskommt.

P.S.: Irgenwie fehlt in der zweiten Fassung der Else-Block mit der Zuweisung transferedData[j] = data12[j]; vielleicht liegts ja daran ?


Bis dann.
 
Zuletzt bearbeitet:
S

SlaterB

Gast
ArrayStoreException deutet darauf hin, dass das Object[] kein Object[] ist, was in Java leider möglich ist

Java:
public class Test {
    private static Object[] dataSensor = new String[]   {"Air", "Friend"};

    public static void main(String[] args)    {
        System.out.println(dataSensor.getClass());
        dataSensor[0] = 4;
    }
}
liefert z.B. auch eine StoreException + die Ausgabe
class [Ljava.lang.String;

die Deklaration wie in deiner Klasse MyTableModel führt bei mir dagegen zu einem Object[],
gib bei dir das Array + eines der Unterarrays aus, um das zu testen,
schreibe notfalls explizit new Object[][]
 

w0ddes

Bekanntes Mitglied
Hey,
ich hab für die Übersicht meine ganzen System.out's rausgenommen .. Diese Idee hatte ich nämlich auch schon.

Also ich kann sagen, dass der Parser funktioniert. Wenn ich die "transferData" Methode 'umgehe' (also die Daten direkt weiter gebe) werden mir alle Werte korrekt und an der gewünschten Position in der Tabelle angezeigt.

Der Fehler deutet ja auf einen falschen Typ für den Array hin .. aber es ist doch ein Objektarray. Das bringt mich etwas zum verzweifeln. Das Problem MUSS in der "transferData"-methode liegen ..

Kurz Frage: Ich habe jetzt bei "transferData" folgendes eingefügt:

Java:
	private Object[][] transferData(Object[][] dataToTransfer) {
		System.out.println(Arrays.toString(dataToTransfer));
		Object[][] transferedData = dataToTransfer;	
		System.out.println(Arrays.toString(transferedData));
				
               //  [.....]

                }else if(affil.toLowerCase().contains("friend")){	
						System.out.println(affil);
						transferedData[i][j] = friend;	

               //  [.....]

Die Ausgabe ist:
Code:
[[Ljava.lang.String;@201f9, [Ljava.lang.String;@1cf8583, [Ljava.lang.String;@14693c7, [Ljava.lang.String;@901887, [Ljava.lang.String;@3a6727, [Ljava.lang.String;@4a65e0, [Ljava.lang.String;@665753, [Ljava.lang.String;@ef22f8, [Ljava.lang.String;@1e0cf70, [Ljava.lang.String;@52fe85, [Ljava.lang.String;@c40c80]
[[Ljava.lang.String;@201f9, [Ljava.lang.String;@1cf8583, [Ljava.lang.String;@14693c7, [Ljava.lang.String;@901887, [Ljava.lang.String;@3a6727, [Ljava.lang.String;@4a65e0, [Ljava.lang.String;@665753, [Ljava.lang.String;@ef22f8, [Ljava.lang.String;@1e0cf70, [Ljava.lang.String;@52fe85, [Ljava.lang.String;@c40c80]
Friend
Wie kann ich das weiter umformatieren?


EDIT: @ fastjack: Ja die Anweisung fehlt, ist aber aufgrund von
Code:
Object[][] transferedData = dataToTransfer;
(Code 3, Zeile 37) hinfällig. Hatte es auch eingefügt, aber keine änderung.

bin jetzt erstmal auf dem Heimweg, schau dann von zu Hause wieder rein. Bis denn und frohes raten :p
 
Zuletzt bearbeitet:
S

SlaterB

Gast
ach, der Code hat sich ja geändert, hier liegt der Fehler
Java:
String[] temp = new String[6];   // unnötiges Objekt, in der nächsten Zeile kommt ein neues
temp = puffer.split("\t"); // erzeugt wirklich ein String-Array, darin kann man später kein Objekt speichern
                                
for (int j = 0; j <= temp.length; j++){     
    daten[i] = temp;  // Befehl hängt nicht von j ab, Schleife überflüssig   
  
// andererseits wäre
   daten[i][j] = temp[j]; 
// ideal, um das String[] nicht zu übernehmen, sondern die Strings ins echte Object[] zu schreiben   
}

oder wirklich transferData umbauen, so dass dort z.B. immer ein neues Object[][] angelegt wird und alle Daten kopiert werden
 

w0ddes

Bekanntes Mitglied
hm .. frag mich nicht warum, aber ich hatte da mal

Java:
daten[i][j] = temp[j];
stehen .. (deswegen auch die schleife mit j) ..

Mir ist grade eingefallen, dass das ganze Zeug auf der Arbeit ist, werd also morgen erst deine Hilfe mal probieren können.

Bis dahin: Greetz
 

w0ddes

Bekanntes Mitglied
Es funktioniert!

hab den Code so geändert:
Java:
				String puffer = text.get(i);	
				String[] temp = puffer.split("\t");			//Aufsplitten des Arrays
				
				for (int j = 0; j < temp.length; j++){		    //Schleife so lang, wie es Zeilen gibt		
					daten[i][j] = temp[j];						//gesplitteter String wird in einzelne Felder je Zeile eingefügt
jetzt funktionierts .. Problem war wohl das
Java:
daten[i][j] = temp[j];
Ich hatte das wohl geändert, da die for-Schleife eine ArrayOutofBounds Exception ausgelöst hatte ->
Java:
 j <= temp.length
war natürlich falsch ..
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P ImageIcon zusammen mit Fenstergrösse skalieren Java Basics - Anfänger-Themen 3
G ImageIcon in Byte-Array ablegen Java Basics - Anfänger-Themen 7
O ImageIcon, Swing Java Basics - Anfänger-Themen 1
F Interface ImageIcon wird nicht angezeigt Java Basics - Anfänger-Themen 4
R Java ImageIcon drehen Java Basics - Anfänger-Themen 6
F Problem bei ImageIcon aktualisieren Java Basics - Anfänger-Themen 5
P ImageIcon in JAR Java Basics - Anfänger-Themen 5
T Compiler-Fehler Mit Array und "for" mehrere ImageIcon erstellen Java Basics - Anfänger-Themen 7
S GUI ImageIcon Mouselistener Link Java Basics - Anfänger-Themen 0
E Bild vom FileChooser aus via ImageIcon in DB schreiben Java Basics - Anfänger-Themen 16
R JLabel imageicon jede Sekunde wechseln Java Basics - Anfänger-Themen 3
K ImageIcon laden Java Basics - Anfänger-Themen 6
S Button durch ImageIcon ersetzen Java Basics - Anfänger-Themen 9
P byte Array aus ImageIcon Java Basics - Anfänger-Themen 10
D JButton oder ImageIcon klickt "langsam" Java Basics - Anfänger-Themen 5
R ImageIcon wird nich angezeigt - Jar, Eclipse Java Basics - Anfänger-Themen 6
P ImageIcon/Pfad Java Basics - Anfänger-Themen 3
C ImageIcon erweitern Java Basics - Anfänger-Themen 6
H ImageIcon rotieren Java Basics - Anfänger-Themen 4
T ImageIcon ohne Classloader Java Basics - Anfänger-Themen 12
S ImageIcon Array Java Basics - Anfänger-Themen 8
Developer_X eigenes ImageIcon schreiben Java Basics - Anfänger-Themen 11
P ImageIcon Problem Java Basics - Anfänger-Themen 15
B Aus JTable ImageIcon abfragen Java Basics - Anfänger-Themen 8
G ImageIcon Java Basics - Anfänger-Themen 4
D ImageIcon in Label Java Basics - Anfänger-Themen 7
J ImageIcon im JLabel automatisch resizen. Java Basics - Anfänger-Themen 6
G JLabel nachträglich verändern, bzw. ImageIcon ändern? Java Basics - Anfänger-Themen 3
G JPEG aus Blob als ImageIcon anzeigen Java Basics - Anfänger-Themen 5
L ImageIcon an jLabel anpassen? Java Basics - Anfänger-Themen 5
T new JLabel(new ImageIcon("dateiname&pfad.gif") Java Basics - Anfänger-Themen 2
B ImageIcon komprimieren (zB Jpeg) Java Basics - Anfänger-Themen 14
D ImageIcon beschreiben Java Basics - Anfänger-Themen 13
U BufferedImage anzeigen, imageIcon oder paintComponent(); Java Basics - Anfänger-Themen 6
M imageicon aus jar (ja hab die suchfunktion schon benutzt :)) Java Basics - Anfänger-Themen 2
F Tooltips bei ImageIcon in Tabellenspalte Java Basics - Anfänger-Themen 1
X ImageIcon und .exe-Datei Java Basics - Anfänger-Themen 2
K Bildgröße eines ImageIcon verändern Java Basics - Anfänger-Themen 2
L bytestrom in ImageIcon-Objekt umwandeln Java Basics - Anfänger-Themen 3
S Image von ImageIcon anpassen Java Basics - Anfänger-Themen 3
D ImageIcon JApplet Java Basics - Anfänger-Themen 2
Dilandau permission exception bei ImageIcon Java Basics - Anfänger-Themen 6
H Objektarray - Speicherverschwendung? Java Basics - Anfänger-Themen 5
S Methoden Objektarray(erfassen) Java Basics - Anfänger-Themen 18
dapzoo Compiler-Fehler Beim Werte verteilen in Objektarray NullPointerException Java Basics - Anfänger-Themen 4
B Objekte in ObjektArray speichern und ausgeben Java Basics - Anfänger-Themen 5
M Objektarray Ausgabe Java Basics - Anfänger-Themen 8
G Objektarray inerhalb des Konstruktors erstellen Java Basics - Anfänger-Themen 2
D Objektarray sortieren Java Basics - Anfänger-Themen 10
G Objektarray mit sich selbst rekombinieren Java Basics - Anfänger-Themen 5
padde479 Zeile entfernen TableModel Java Basics - Anfänger-Themen 11
O TableModel Java Basics - Anfänger-Themen 8
E JTable + TableModel updaten? Java Basics - Anfänger-Themen 1
M TableModel Hintergrundfarbe Java Basics - Anfänger-Themen 6
GianaSisters Methoden eigenes TableModel -> removeRow möglich machen Java Basics - Anfänger-Themen 30
E Tablemodel füllen..mit gefilterten Daten Java Basics - Anfänger-Themen 2
K keine Reaktion im TableModel nach ändern der liste? Java Basics - Anfänger-Themen 2
K funktioniert in einem TableModel ein Initialisierungsblock? Java Basics - Anfänger-Themen 3
W Problem mit Serialisierung und TableModel Java Basics - Anfänger-Themen 3
J JTable aktualisieren wenn TableModel sich ändert Java Basics - Anfänger-Themen 6
Z TableModel Methode setValueAt Java Basics - Anfänger-Themen 9
babel TableModel Java Basics - Anfänger-Themen 28
C eigenes TableModel Java Basics - Anfänger-Themen 2
W Innerhalb TableModel auf aktivierte Reihe reagieren Java Basics - Anfänger-Themen 3
B JTable- TableModel und TableCellRenderer Konflikt Java Basics - Anfänger-Themen 4
J Vector - JTable - TableModel Java Basics - Anfänger-Themen 14
G TableModel Java Basics - Anfänger-Themen 7
M TableModel befüllen Java Basics - Anfänger-Themen 14
Q Eigenes TableModel - NullPointerException Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben