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
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
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
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
einlesen (vgl. Code 2).
Folglich habe ich auch den Code in
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"
Code 2: Parser!
Code 3: Der geänderte "MyTableModel" Code
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:
Schonmal vielen Dank im Voraus! Falls ich was vergessen hab, sagt es mir
Greetz
Jens
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
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
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
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
Folglich habe ich auch den Code in
Code:
MyTableModel
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
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: