Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
nachdem ich nun schon in 3 noch immer offenen threads nachgefragt hatte, was denn nun sinnvoller ist, als mit vectoren zu arbeiten, (kennt denn wirklich niemand eine antwort darauf?) frage ich nochmal zusammengefasst in einem eigenen post nach.
folgende standard-problematik
auslesen aus der datenbank (funzt)
schreiben in einen vector (funzt)
schreiben in ein ObjectArray (funzt)
fireTableDataChanged() mit vector (funzt)
Daten sortieren mit ObjectArray (funzt)
daten sortieren und anordnen mit vector (funzt NICHT)
fireTableDataChanged() mit ObjectArray (funzt NICHT)
ObjectArray in Vector umwandel, und später ins defaultTableModel übernehmen(funzt NICHT)
ich muss also daten aus einer datenbank auslesen, diese entsprechend umsortieren oder viel mehr umpositionieren, und diese dann alle 2 sec in einer JTabel ausgeben.
also entweder bin ich zu blöd für Java, oder java zu blöd für mich...
kann mir also nun irgendjemand bitte bitte bitte erklären, wie ich entweder mit einem Array ein fireTableDataChanged() machen kann, oder alternativ wie ich einen vector sauber nach positionen sortieren kann?
oder eine noch bessere alternative, oder irgendwas mit dem ich was anfangen kann?
dankedankedanke an alle, die mir das ganze irgendwie gedanklich näherbringen können, oder es vermögen, den knoten in meinem hirn aufzulösen...
zum Unterschied der beiden Auszug aus Java-Quellcode,
Konstruktoren JTable:
Code:
public JTable(Vector rowData, Vector columnNames) {
this(new DefaultTableModel(rowData, columnNames));
}
vs
public JTable(final Object[][] rowData, final Object[] columnNames) {
this(new AbstractTableModel() {
public String getColumnName(int column) { return columnNames[column].toString(); }
public int getRowCount() { return rowData.length; }
public int getColumnCount() { return columnNames.length; }
public Object getValueAt(int row, int col) { return rowData[row][col]; }
public boolean isCellEditable(int row, int column) { return true; }
public void setValueAt(Object value, int row, int col) {
rowData[row][col] = value;
fireTableCellUpdated(row, col);
}
});
}
da sollte man also schon genau überlegen, was man nimmt,
am besten eh ein eigenes Model
----------
> fireTableDataChanged() mit ObjectArray (funzt NICHT)
ergibt sich sicherlich aus dem obigen, vielleicht aber doch nicht ganz so schlimm,
kann man man erst beantworten, wenn du ein vollständiges Beispielprogramm postest (OHNE DB )
> wie ich einen vector sauber nach positionen sortieren kann?
klingt für mich nicht schwerer, als ein Object[][] zu sortieren,
das machst du doch sicherlich mit Comparator?
wiederum:
poste den Code, der mit Object[][] geht und den zu Vector der nicht funktioniert
code kommt morgen, ich muss jetzt raus, sonst platzt mir der kopf, oder mein pc geht hops :~/ aber danke schonmal im voraus, für die mühen, die ich dir machen werde
hier nun mein codegestöpsel... am besten mal alles, dann kann man sich glaube ich besser rein denken.
Code:
import java.awt.BorderLayout;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DecimalFormat;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class MainTable extends JFrame{
DecimalFormat f = new DecimalFormat("#0.000");
public MainTable()
{
super("MainTable");
while (isrunning == true)
{
try
{
if (i == 0)
{
this.TabelleErzeugen(holeDaten());
this.initGUI();
i++;
}
holeDaten();
Thread.sleep(3000);
}
catch (InterruptedException e)
{
e.getMessage();
}
}
}
private JFrame frame = new JFrame();
private JTable table;
private boolean isrunning = true;
private DefaultTableModel defaultTableModel;
DBZugriff dbZugriff = new DBZugriff();
public boolean neueDaten = false;
public int firstrunner = 0;
int i = 0;
int j = 0;
String rsold = "";
String rsnew = "";
ResultSet rs = null;
ResultSet rsput = null;
static int count = 0;
public final static Vector columnNames = new Vector()
{
{
add("Bank");
add("Bank1");
add("Bank2");
add("Bank3");
add("Bank4");
add("Bank5");
add("Bank6");
add("Bank7");
add("Bank8");
add("Bank9");
add("Bank10");
add("Bank11");
}
};
public void GUI()
{
Vector vDaten = new Vector();
Vector vTitel = new Vector();
Vector vtemp = new Vector();
Vector sortForTable = new Vector();
}
public void initGUI()
{
frame = new JFrame("Viewer");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new JScrollPane(table), BorderLayout.CENTER );
frame.pack();
frame.setVisible(true);
}
public Object [][] holeDaten() {
TryFloat tryFloat = new TryFloat();
DBZugriff getDB = new DBZugriff();
j= 0;
String dbLogin ="Client" ;
String dbPassword ="Clientpwd";
Object results[][] = new String[2000][1000];
try {
dbZugriff.OpenDB(dbLogin, dbPassword);
rs = dbZugriff.statement.executeQuery("SELECT T1.1, T2.1, T1.2, T1.3, T1.4, T1.5, T2.5, T2.6, T1.Letzter_Zeit_Datum FROM table T1, table T2 WHERE T1.1= T2.1 AND T1.2= T2.2 ORDER BY T1.2 DESC ");
while (rs.next()){i = 0;
i= i + 1;
j= j + 1;
System.out.println("i = " + i + " j = " + j);
System.out.println(rs.getString("T1.1"));
results[i][j] = rs.getString("T1.1");
i= i + 1;
results[i][j] = rs.getString("T2.1");
i= i + 1;
results[i][j] = String.valueOf(tryFloat.setFloat(rs.getString("T1.2"))/1000);//rs.getString("T1.2");//tryFloat.setFloat(rs.getString("T1.2"))/1000;
i= i + 1;
results[i][j] = rs.getString("T1.3");
i= i + 1;
results[i][j] = String.valueOf(f.format(tryFloat.setFloat(rs.getString("T1.4"))));
i= i + 1;
results[i][j]= String.valueOf(f.format(tryFloat.setFloat(rs.getString("T1.5"))));
i= i + 1;
results[i][j] = String.valueOf(f.format(tryFloat.setFloat(rs.getString("T2.4"))));
i= i + 1;
results[i][j] = String.valueOf(f.format(tryFloat.setFloat(rs.getString("T2.5"))));
i= i + 1;
results[i][j] = String.valueOf(f.format(tryFloat.setFloat(rs.getString("T1.4")) + tryFloat.setFloat(rs.getString("T2.4"))));
i= i + 1;
results[i][j] = String.valueOf(f.format(tryFloat.setFloat(rs.getString("T1.5"))+ tryFloat.setFloat(rs.getString("T2.5"))));
i= i + 1;
results[i][j] = rs.getString("T2.6");
}
dbZugriff.CloseDB();
rsold = rsnew;
rsnew = results.toString();
if (rsold != rsnew){
neueDaten = true;
rsold=results.toString();
System.out.println("NEUE DATEN = " + neueDaten);
}
else{
neueDaten = false;
System.out.println("NEUE DATEN = " + neueDaten);
}
return results;
}
catch (SQLException e)
{
e.printStackTrace();
}
catch (ArrayIndexOutOfBoundsException e)
{
System.out.println (e);
dbZugriff.CloseDB();
}
return results;
}
public void TabelleErzeugen(Object[][] holeDaten)
{
Object[][] daten = holeDaten();
Vector vDaten = new Vector();
for (Object[] o : daten) {
vDaten.addAll(java.util.Arrays.asList(o));
}
System.out.println(daten[1][1]);
System.out.println(columnNames);
defaultTableModel.setDataVector(vDaten, columnNames);
table = new JTable(defaultTableModel);
((JLabel)table.getDefaultRenderer(String.class)).setHorizontalAlignment (JLabel.RIGHT);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.setDefaultRenderer(Object.class, new MyTableCellRenderer());
defaultTableModel.fireTableDataChanged();
}
public void TabelleUpdate(Object[][] holeDaten)
{
Object[][] daten = holeDaten();
Vector vDaten = new Vector();
for (Object[] o : daten) {
vDaten.addAll(java.util.Arrays.asList(o));
}
System.out.println(daten[1][1]);
System.out.println(columnNames);
defaultTableModel.setDataVector(vDaten, columnNames);
table = new JTable(defaultTableModel);
((JLabel)table.getDefaultRenderer(String.class)).setHorizontalAlignment (JLabel.RIGHT);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.setDefaultRenderer(Object.class, new MyTableCellRenderer());
defaultTableModel.fireTableDataChanged();
}
public static void main(String[] args)
{
MainTable mainTable = new MainTable();
}
}
diese version:
fehler:
Exception in thread "main" java.lang.NullPointerException
at ausleser.MainTable.TabelleErzeugen(MainTable.java:195)
at ausleser.MainTable.<init>(MainTable.java:26)
at ausleser.MainTable.main(MainTable.java:296)
bei System.out.println(vDaten) in tabelle erzeugen, und tabelle update
fehler:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source)
at java.lang.AbstractStringBuilder.append(Unknown Source)
at java.lang.StringBuilder.append(Unknown Source)
at java.util.AbstractCollection.toString(Unknown Source)
at java.util.Vector.toString(Unknown Source)
at java.lang.String.valueOf(Unknown Source)
at java.io.PrintStream.println(Unknown Source)
at ausleser.MainTable.TabelleErzeugen(MainTable.java:193)
at ausleser.MainTable.<init>(MainTable.java:26)
at ausleser.MainTable.main(MainTable.java:296)
bei reduzierung der größe des Object results[][] = new String[2000][1000]; auf [1000][1000]
fehler:
Exception in thread "main" java.lang.NullPointerException
at ausleser.MainTable.TabelleErzeugen(MainTable.java:195)
at ausleser.MainTable.<init>(MainTable.java:26)
at ausleser.MainTable.main(MainTable.java:296)
und nun, ohne etwas zu ändern bei Object results[][] = new String[2000][1000]; auf [1000][1000] gibt er mir nun meinen vector aus?!? -> verwirrung_total.setHelpFlag(SOS)
was willst du mir erzählen, dass bei
table.getColumn("Bank5").setMinWidth(140);
ein Fehler kommt?
wo werden die columnNames überhaupt gesetzt,
sehe das nirgendwo im Programm,
und was hat das mit den ursprünglichen Fragen zu tun?
immer noch gilt: poste ein lauffähiges Beispielprogramm,
DB-Operationen und Quark wie setPreferredWidth(140); gehört nicht dazu
(falls nicht gerade genau in dem Moment die Exception kommt)
die Daten sind Testdaten:
TestZeile1: TestWert1, TestWert2, TestWert3
TestZeile2: TestWert4, TestWert5, TestWert6
im Programm vorgegeben
ja, du hast rech... durch meine bereinigung in code, wo ich 100te kommentiereungen und alttext rausgenommen habe, um es übersichtlicher zu machen, stimmt natürlich die zeilennummerierung nicht mehr. entschuldige bitte. mein fehler.
code oben bereinigt.
generell ist das prog jedoch lauffähig... ich habs ja grade eben nochmal getestet..
der/die fehler treten in zeile 171, 25, und daraus resultierend natürlich im Main auf..
zeilen wie folgt:
Code:
public void TabelleErzeugen(Object[][] holeDaten)
{
Object[][] daten = holeDaten();
Vector vDaten = new Vector();
for (Object[] o : daten) {
vDaten.addAll(java.util.Arrays.asList(o));
}
System.out.println(daten[1][1]);
System.out.println(columnNames);
-->> defaultTableModel.setDataVector(vDaten, columnNames);
table = new JTable(defaultTableModel);
Code:
super("MainTable");
while (isrunning == true)
{
try
{
if (i == 0)
{
-->> this.TabelleErzeugen(holeDaten());
this.initGUI();
i++;
}
holeDaten();
Thread.sleep(3000);
}
.....
die columns werden hier gesetzt: also zeile 56 oben
Code:
public final static Vector columnNames = new Vector()
{
{
add("Bank");
add("Bank1");
add("Bank2");
add("Bank3");
add("Bank4");
add("Bank5");
add("Bank6");
add("Bank7");
add("Bank8");
add("Bank9");
add("Bank10");
add("Bank11");
}
};
> generell ist das prog jedoch lauffähig... ich habs ja grade eben nochmal getestet..
ich frage mich immer noch, wie das zur ursprünglichen Frage
> wie ich einen vector sauber nach positionen sortieren kann?
passt, das ist ja nun ein Fehler der sehr deutlich und reproduzierbar ist..
> der/die fehler treten in zeile 171, 25, und daraus resultierend natürlich im Main auf..
hmm, 171 ist leer oder der Anfang der Operation TabelleErzeugen(),
25 ist der Aufruf von TabelleErzeugen() in der main,
was sagt das jetzt?
außerdem musst du den Fehler schon nennen, selber kann ich ihn in den untestbaren Programm nicht lesen,
da das Programm untestbar ist, sind die Chancen, den Fehler zu erklären, auch schlecht
edit: nun hast du es gekürzt,
defaultTableModel.setDataVector(vDaten, columnNames);
macht durchaus Sinn als Fehlerstelle,
und was ist denn nun der Fehler?
ist in defaultTableModel ein Objekt drin oder ist das noch null?
> die columns werden hier gesetzt: also zeile 56 oben
also der fehler ist eine NullPionterException in den angegebenen zeilen.
die daten für den vector werden hier gesetzt.
Code:
Object[][] daten = holeDaten();
Vector vDaten = new Vector();
for (Object[] o : daten) {
vDaten.addAll(java.util.Arrays.asList(o));
}
und hier ins model übergeben
Code:
defaultTableModel.setDataVector(vDaten, columnNames);
table = new JTable(defaultTableModel);
die daten aus der db sind nicht leer, und die ausgabe von vector gibt mit am anfang des vectors jede menge leere datenfelder aus, dann konnen meine daten.
gibt es irgendwo
defaultTableModel = new DefaultTableModel();
?
---------
> die daten aus der db sind nicht leer, und die ausgabe von vector gibt mit am anfang des vectors jede menge leere datenfelder aus, dann konnen meine daten.
öhm... ja, ok. mit dem defaultTableModel = new DefaultTableModel(); hast du recht. das habe ich wohl irgendwie beim ganze editieren versehentlich rausgelöscht.
und jetzt kommt auch meine ursprüngliche fehlermeldung wieder:
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Vector
at javax.swing.table.DefaultTableModel.justifyRows(Unknown Source)
at javax.swing.table.DefaultTableModel.setDataVector(Unknown Source)
wieder fehler in zeile 171
mit den testdaten habe ich mein object gefüllt. gleicher effekt
die datenbankabfrage ist gaaarnicht verrückt, sondern eine vorsortierung von daten aus 2 verspiedenen tabellen, die den selben primärschlüssel, und mehrere identische sekundärschlüssel haben ... und die klappt auch genau so, wie sie soll.
> und jetzt kommt auch meine ursprüngliche fehlermeldung wieder
die Fehlermeldung kommt, weil dein Vector nur Strings enthält,
erwartet wird aber, dass der Vector wiederum Vectoren für die einzelnen Zeilen enthält,
so wie Object[][] daten zweidimensional ist,
schau dir doch einfach mal den Inhalt des Vectors an,
ist natürlich leichter mit 3-4 Testdaten statt tausender aus der immer noch verrückten DB-Operation,
mit
vDaten.addAll(java.util.Arrays.asList(o));
fügst du nicht o als Liste hinzu, sondern alle Elemente von o einzeln,
vDaten.add(java.util.Arrays.asList(o));
meinst du vielleicht, damit wäre die zweidimensionale Struktur gesichtert,
Arrays.asList(o) liefert aber ArrayList, was DefaultTableModel leider immer noch nicht akzeptiert,
es muss sein:
Code:
public class Test
{
public static void main(String[] args)
{
Vector col = new Vector();
Collections.addAll(col, "a", "b", "c");
Object[][] daten = new Object[][]
{
{"1", "2", "3"},
{"4", "5", "6"}};
Vector vDaten = new Vector();
for (Object[] o : daten)
{
Vector line = new Vector();
line.addAll(Arrays.asList(o));
vDaten.add(line);
}
System.out.println(daten[1][1]);
System.out.println(col);
System.out.println(vDaten.get(0).getClass());
DefaultTableModel defaultTableModel = new DefaultTableModel();
defaultTableModel.setDataVector(vDaten, col);
}
}
so sieht ein Testprogramm aus, klein, ohne DB oder ähnlichen Wahnsinn,
von jedermann ausführbar
oh. du hast recht. hab ich wohl die sache mit den vectoren nicht ordentlich genug durchgelesen. werde ich gleich mal nachholen.
und angezeigt wird meine table jetzt auch. super
nur.. was verstehst du unter Arrays.asList(o) liefert aber ArrayList, was DefaultTableModel leider immer noch nicht akzeptiert?
welche einschränkungen ergeben sich daraus für mich?
dass du Arrays.asList(o) nicht direkt in vDaten einfügen kannst,
sondern doch jeweils einen
Vector line = new Vector();
anlegen musst, so wie in meinem Beispiel und wie es ja nun anscheinend auch schon machst
denn eigentlich sind ja Vector und ArrayList das gleiche, eine List,
wenn DefaultTableModel nur mit List arbeiten würde, dann wäres es egal, ob Vector oder ArrayList,
das ist der Vorteil von Interface bzw. der Nachteil, wenn man diese nicht benutzt
(DefaultTableModel ist wahrscheinlich so alt, dass es damals List und ArrayList noch gar nicht gab,
und wurde nicht aktualisiert)