wo liegt der Fehler? (JTable)

derHuber

Mitglied
Hallo zusammen,

ich habe mich in den letzten Tagen mit den JTables auseinandergesetzt (Danke an Beni für die tolle Zusammenfassung).
Jetzt wollte ich aus dem dritten Lösungsvorschlag (defaultTableModel) eine eigene Klasse + Konstruktormethode schreiben, da ich Sie für ein privates Projekt gut gebrauchen könnte.
Der Code basiert auf "Möglichkeit 3" des Authors Beni:

http://www.java-forum.org/java-faq-beitraege/7035-jtable-teil-2-kommen-daten-tabelle.html

und wurde von mir angepasst (Lernstand in der Schule).

Kurzfassung der Klasse: mit JTableVector (String title, int zeile, int spalte) soll ein JTable erstellt werden welches gleich zeile Zeilen und spalte Spalten haben soll. Mein Code:
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;


public class JTableVector extends JFrame{


  public JTableVector(String title, int zeile, int spalte){
    super(title);
    setSize(300,300);
    setVisible(true);
    setResizable(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    Container cp = getContentPane();
    cp.setLayout(new BorderLayout());

    String[] titles = new String[] {"a", "b"};

    final DefaultTableModel model = new DefaultTableModel (titles,0);
    JTable jtblTabelle = new JTable(model);
    
    neueZeile(zeile);
    neueSpalte(spalte);

    cp.add(new JScrollPane (jtblTabelle),BorderLayout.CENTER);
    pack();
  }
  
  public static Vector erstelleDatenVector(String prefix, int groesse){
    Vector vector = new Vector(groesse);
    for(int i = 0; i<groesse; i++)
      vector.add(prefix +" : " + groesse + " : " + i);
      return vector;
  }
  
  public static void neueZeile (int zeile){
    for(int i = 0; i==zeile; i++)
    int groesse = model.getColumnCount();
    Vector newDatas = erstelleDatenVector ("Zeile", groesse);
    model.addRow(newDatas);
  }

  public static void neueSpalte(int spalte) {
    for(int i = o; i==spalte; i++)
    int groesse = model.getRowCount();
    Vector newDatas = erstelleDatenVector( "Spalte", groesse );
    String name = String.valueOf( model.getColumnCount() );
    model.addColumn( name, newDatas );
  }

}

Die Fehlermeldung:
Code:
int groesse = model.getColumnCount();
        ^
JTableVector.java:49:5: not a statement
    int groesse = model.getColumnCount();
    ^
JTableVector.java:49:17: illegal start of expression
    int groesse = model.getColumnCount();
                ^
JTableVector.java:49:24: ';' expected
    int groesse = model.getColumnCount();
                       ^
Ich hab verschiedene Sachen ausprobiert. z.B.: Wenn die methode als For-Schleife in die Konstruktor-Methode reingeschrieben wird meckert der Compiler nicht. Was mich darauf schließen lässt, dass die ansteuerung nicht korrekt ist. Aber wieso und warum ist mir total unklar. Würde mich über Erklärungen und Hilfen sehr freuen.

Danke im voraus

gruss Fabi
 
Zuletzt bearbeitet von einem Moderator:
model ist eine lokale Variable im Konstruktor, du kannst von außen nicht darauf zugreifen, und wenn der Konstruktor fertig ist, ist sie "weg". Mache eine Instanzvariable daraus:

Java:
public class JTableVector extends JFrame{
 
  final DefaultTableModel model;
 
  public JTableVector(String title, int zeile, int spalte){
    ...
    model = new DefaultTableModel (titles,0);
    ...
  }
  
  public static void neueZeile (int zeile){
    for(int i = 0; i==zeile; i++) {
      int groesse = model.getColumnCount();  //<-- jetzt ist model hier "sichtbar"
      Vector newDatas = erstelleDatenVector ("Zeile", groesse);
      model.addRow(newDatas);
    }
  }
  ...

}
[edit] vergessene Klammern
 
Zuletzt bearbeitet:
und eine for-Schleife ohne Klammern kann nur einen Unter-Befehl aufnehmen,
eine Variablendeklaration, deren Variable danach nicht mehr verwendet werden kann, ist daher intelligenterweise nicht erlaubt
 
Danke für die schnelle Antwort!

Das klingt total logisch und ich dachte mir auch sowas in der Richtung.
Ich habe es gleich geändert doch die Fehlermeldungen sind immer noch die gleichen...

Java:
import javax.swing.*;
import java.awt.*;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;


public class JTableVector extends JFrame{

final DefaultTableModel model;

  public JTableVector(String title, int zeile, int spalte){
    super(title);
    setSize(300,300);
    setVisible(true);
    setResizable(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    Container cp = getContentPane();
    cp.setLayout(new BorderLayout());

    String[] titles = new String[] {"a", "b"};

    model = new DefaultTableModel (titles,0);
    JTable jtblTabelle = new JTable(model);
    
    neueZeile(zeile);
    neueSpalte(spalte);

    cp.add(new JScrollPane (jtblTabelle),BorderLayout.CENTER);
    pack();
  }
  
  public static Vector erstelleDatenVector(String prefix, int groesse){
    Vector vector = new Vector(groesse);
    for(int i = 0; i<groesse; i++)
      vector.add(prefix +" : " + groesse + " : " + i);
      return vector;
  }
  
  public static void neueZeile (int zeile){
    for(int i = 0; i==zeile; i++)
    int groesse = model.getColumnCount();
    Vector newDatas = erstelleDatenVector ("Zeile", groesse);
    model.addRow(newDatas);
  }

  public static void neueSpalte(int spalte) {
    for(int i = 0; i==spalte; i++)
    int groesse = model.getRowCount();
    Vector newDatas = erstelleDatenVector( "Spalte", groesse );
    String name = String.valueOf( model.getColumnCount() );
    model.addColumn( name, newDatas );
  }

}
 
Zuletzt bearbeitet:
und eine for-Schleife ohne Klammern kann nur einen Unter-Befehl aufnehmen,
eine Variablendeklaration, deren Variable danach nicht mehr verwendet werden kann, ist daher intelligenterweise nicht erlaubt

Bezieht sich der Satz auf "final", da muss ich gestehen, dass ich das einfach aus dem Beispiel übernommen habe. Ich habe aber dennoch "public" ausprobiert, was auch nichts gebracht hat.

Kannst du mir das genauer erklären?

edit: Tschuldigung für die vergessenen JAVA-Tags.
 
for (...)
a;
b;
c;

die for-Schleife wiederholt nur den a-Befehl, nicht b oder den Rest der Methode oder was auch immer,
es macht daher keinen Sinn in a eine Variable zu deklarieren, was sollte mit der noch passieren?

für mehrere Befehle verwendet man Klammern (und zur Ansicht Einrückung, für den Compiler aber egal)
Java:
for (...)  {
  a;
  b;
}
c;
dann kann man auch Variablen deklarieren und vieles andere
 
Danke, das war mir nicht bewusst ich habe es gleich abgeändert. Jetzt kommen keine Fehlermeldungen von Compiler.

Ich habe noch zwei Fragen:
Was bewirkt "final"? (google, API usw. habe ich nichts brauchbares gefunden)
was bewirkt pack();? (bei der API-Erklärung ist der Funken nicht wirklich übergesprungen)

Habe das Programm jetzt mit einer Testklasse geprüft aber es werden keine Zeilen/Spalten erstellt.(Bin noch dran den Fehler zu suchen!)
 
  • [c]final[/c] an einer Variablendeklaration bewirkt, dass die Variable nur einmal zugewiesen werden kann:
    Java:
    final int a = 0;
    a = 1; // compile error, a is final and assigned/initialized before
  • [c]final[/c] an einer Klassendeklaration bewirkt, dass keine Klasse von dieser Klasse erben kann.
  • [c]final[/c] an einer Interface-Deklaration bewirkt, dass kein Interface von diesem Interface erben kann.
  • [c]final[/c] an einer Methode bewirkt, dass die Methode in keiner Ableitung überschrieben werden kann.
[c]pack()[/c] setzt das Fenster auf die Größe die es laut [c]getPreferredSize()[/c] haben muss. Je nach LayoutManager werden dann die Kinder des Fensters gefragt die wieder ihre Kinder fragen und so weiter. Am Ende kommt raus, dass das Fenster 615 mal 360 Pixels groß sein muss, damit alles so groß sein kann wie es möchte. Und dann wird die Größe des Fensters auf diese Größe gesetzt.

Ebenius
 
Danke für die ausführliche Erklärung. Leider bin ich dem Fehler noch nicht auf die Schliche gekommen. Denke aber rein logisch gesehen dürfte der Code funktionieren.

Klasse JTableVector:
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;


public class JTableVector extends JFrame{

public DefaultTableModel model;

  public JTableVector(String title, int zeile, int spalte){
    super(title);
    setSize(300,300);
    setVisible(true);
    setResizable(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    Container cp = getContentPane();
    cp.setLayout(new BorderLayout());

    String[] titles = new String[] {"a", "b"};

    model = new DefaultTableModel (titles,0);
    JTable jtblTabelle = new JTable(model);
    cp.add(new JScrollPane (jtblTabelle),BorderLayout.CENTER);

    neueZeile(zeile);
    neueSpalte(spalte);

    pack();
  }
  
  public static Vector erstelleDatenVector(String prefix, int groesse){
    Vector vector = new Vector(groesse);
    for(int i = 0; i<groesse; i++)
      vector.add(prefix +" : " + groesse + " : " + i);
      return vector;
  }
  
  public void neueZeile (int zeile){
    for(int i = 0; i==zeile; i++){
    int groesse = model.getColumnCount();
    Vector newDatas = erstelleDatenVector ("Zeile", groesse);
    model.addRow(newDatas);
    }
  }

  public void neueSpalte(int spalte) {
    for(int i = 0; i==spalte; i++){
    int groesse = model.getRowCount();
    Vector newDatas = erstelleDatenVector( "Spalte", groesse );
    String name = String.valueOf( model.getColumnCount() );
    model.addColumn( name, newDatas );
    }
  }

}
[/Java]

und meine Testklasse:

[code=Java]

public class JTableVectortest {

  public static void main(String[] args) {
    new JTableVector("Datenbank",3,3);
  }
}

Anmerkung zum Stil, Aufbau o.ä. sind ausdrücklich erwünscht.

Der Compiler gibt nachdem er das Programm aussführt folgendes aus.
Java:
Note: JTableVector.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
 
Zuletzt bearbeitet:
Hallo Zusammen,

Ich habe den Fehler gefunden!

die For-Schleifen Bedingungen waren falsch.
Java:
for(int i = 0; i<zeile; i++)
for(int i = 0; i<spalte; i++)

Danke nochmal an alle die geholfen haben!! :toll::applaus:
 

Zurück
Oben