JTable strecken & d. Spalten Vorgeschr. Gr. geben

taik84

Mitglied
Servus Leutz

Ich bastele gerade an einem Programm, das größtenteils an & mit einem JTable arbeitet.
Hier ist ein kleiner Auszug daraus.
Code:
String columnNames[] = {bla bla bla bla bla bla bla bla bla bla};
String data[][] = new String[1][11];
JTable tab = new JTable(data,columnNames){
    public boolean isCellEditable(int rowIndex, int columnIndex) {
      return false;
    }
  };
JScrollPane overview = new JScrollPane(tab);
JPanel center = new JPanel();
public void bla(){
   main.setLayout(new BoxLayout(main, BoxLayout.X_AXIS));
   main.add(center);
   center.setLayout(new FlowLayout());
   center.add(overview);
}
Meine Fragen wären:
1. Wenn ich das Programm ausführe, dann zeigt sich die Tabelle in der Mitte zusammegeknirscht und breitet sich nicht auf das ganze Panel aus. Komisch. Wie kann ich es beheben?

Wie hier : http://edv.cs.tu-berlin.de/~tretner/hg_klein.JPG

2. Wie kann ich in der Tabelle die Veränderung der Anzahl der Zeilen relativ einfach realisieren? Muss ich jetzt eigene Klasse bauen? Ich würde es gerne so haben, dass man auf einen Button drückt, dann erscheint ein kleines Fenster, wo ich die Daten eingebe und OK drücke und daraufhin dieses Fenster sich schließt und in der Tabelle im Hauptfenster die neue Zeile mit den eingegeben Daten eingefügt wird.

3. Und wie kann ich vorgeben, dass die Spalten eine bestimte Zahl an Zeichen besitzt?

So weit bin ich schon:
Code:
import javax.swing.table.*;
public class MyTableModel extends DefaultTableModel {
  String columnNames[];
  public DepotTableModel(Object[][] data, String[] columnNames){
    super(data, columnNames);
    this.columnNames = new String[columnNames.length];
    this.columnNames = columnNames;
  }
  public String getColumnName(int index) {
    return columnNames[index];
  }
  public int getColumnCount() {
    return 11;
  }
  public int getRowCount() {
    return -1;
  }
  public Object getValueAt(int row, int col) {
    return -1;
  }
  public Class getColumnClass(int index){
    try {
        switch (index) {
          case 0:
            return Class.forName("java.lang.String");
          case 1:
            return Class.forName("java.lang.String");
          case 2:
            return Class.forName("java.lang.Integer");
          case 3:
            return Class.forName("java.lang.String");
          case 4:
            return Class.forName("java.lang.Double");
          case 5:
            return Class.forName("java.lang.Double");
          case 6:
            return Class.forName("java.lang.String");   //Datum
          case 7:
            return Class.forName("java.lang.Double");
          case 8:
            return Class.forName("java.lang.Double");
          case 9:
            return Class.forName("java.lang.Double");
          case 10:
            return Class.forName("java.lang.Double");
          default:
            return null;
        }
    } catch (Exception e) {
        return null;
      }

  }
}

Danke.

Gruß

Taik
 
Zuletzt bearbeitet:
taik84 hat gesagt.:
Servus Leutz
1. Wenn ich das Programm ausführe, dann zeigt sich die Tabelle in der Mitte zusammegeknirscht und breitet sich nicht auf das ganze Panel aus. Komisch. Wie kann ich es beheben?

Indem Du das Layout richtig verwendest. Entweder in einem BorderLayout in die Position CENTER setzt oder im GridBagLayout die entsprechenden Constraints setzt - je nachdem, welches Layout Du verwendest. NullLayout und GridLayout eignen sich nicht wirklich gut...

2. Wie kann ich in der Tabelle die Veränderung der Anzahl der Zeilen relativ einfach realisieren? Muss ich jetzt eigene Klasse bauen? Ich würde es gerne so haben, dass man auf einen Button drückt, dann erscheint ein kleines Fenster, wo ich die Daten eingebe und OK drücke und daraufhin dieses Fenster sich schließt und in der Tabelle im Hauptfenster die neue Zeile mit den eingegeben Daten eingefügt wird.

Eine geeignete Implementierung der Methode getRowCount() ist dafür notwendig.
Einfach nur -1 zurückzugeben ist offensichtlich falsch.

3. Und wie kann ich vorgeben, dass die Spalten eine bestimte Zahl an Zeichen besitzt?

Meinst Du jetzt zur Eingabe? Dabei hilft die Verwendung eines Documents (bitte Suchfunktion benutzen).
 
Indem Du das Layout richtig verwendest. Entweder in einem BorderLayout in die Position CENTER setzt ...

Habe ich schon ausprobiert. Hat auch nicht funktioniert. Deswegen bin ich zu BoxLayout + FlowLayout übergegangen.

Eine geeignete Implementierung der Methode getRowCount() ist dafür notwendig.
Einfach nur -1 zurückzugeben ist offensichtlich falsch....

Ich gebe -1, weil ich nicht wirklich weiss wie ich es implementieren soll und der Compiler immer meckert, wenn ich gar nichts reinschreibe und um Fehler zumindest im Rest des QuellCodes zu finden, habe ich mich für return -1 entschieden ;-). Ich habe ein paar Beispiele im Internet gefunden, aber wenn ich nicht verstehe, was da gemacht wird, kann ich es auch nicht auf meine Situation anpassen.

Könntet mir etwas hier helfen?

Meinst Du jetzt zur Eingabe? Dabei hilft die Verwendung eines Documents (bitte Suchfunktion benutzen).

Nö. Ich meinte, dass die Spaltenbreite eine Bestimmte Zeichenzahl anzeigt (z.B. 7 Chars) und den Rest mit "..." abkürzt(z.B. "Nö. Ich...").


Gruß

Taik
 
Zuletzt bearbeitet:
taik84 hat gesagt.:
Habe ich schon ausprobiert. Hat auch nicht funktioniert. Deswegen bin ich zu BoxLayout + FlowLayout übergegangen.

Klar, weil Du im TableModel immer -1 oder NULL zurück gibst, wie soll die Tabelle denn dann wohl aussehen?

Ich gebe -1, weil ich nicht wirklich weiss wie ich es implementieren soll und der Compiler immer meckert, wenn ich gar nichts reinschreibe und um Fehler zumindest im Rest des QuellCodes zu finden, habe ich mich für return -1 entschieden ;-).

Das ist eher suboptimal. Wie soll sich Java denn vorstellen, was -1 Zeilen sind? 1 kann er zeichnen, 2, 3,... aber -1? Du kannst testweise mal 10 zurückgeben lassen, das funktioniert. Idealerweise ist der Rückgabewert eine Größe oder Länge des verwendeten Datenobjekts, auf welches bei getValueAt() zurückgegriffen wird. Mir scheint, Du hast von JTable und TableModel noch nicht viel verstanden, knie Dich bitte intensiv in das Thema hinein.

Ich habe ein paar Beispiele im Internet gefunden, aber wenn ich nicht verstehe, was da gemacht wird, kann ich es auch nicht auf meine Situation anpassen.

Könntet mir etwas hier helfen?

Du musst schon konkret zeigen, an welchen Stellen es (vom Verständnis?) klemmt.

Nö. Ich meinte, dass die Spaltenbreite eine Bestimmte Zeichenzahl anzeigt (z.B. 7 Chars) und den Rest mit "..." abkürzt(z.B. "Nö. Ich...").

Gruß

Taik

Das geschieht normalerweise automatisch, wenn der beinhaltete Text länger ist, als dargestellt werden kann.
 
Code:
JTable tab = new JTable(data,columnNames){
    public boolean isCellEditable(int rowIndex, int columnIndex) {
      return false;
    }
  };
Hier kannst Du sehen, dass ich noch nichts von meinem neuen Modell verwendet habe. ;-)
Das ist das Standart, was von Java schon vorgegebn ist. ;-) Und trotzdem funktioniert es nicht mit dem Anzeigen auf die volle größe.
 
Dann sieh zu, dass Du in data und columnNames Inhalte hinein bekommst.

String columnNames[] = {bla bla bla bla bla bla bla bla bla bla};
String data[][] = new String[1][11];

reicht dafür nicht aus.
Mir erscheint dieser Thread als recht wenig ergiebig. Du hast Dich weder mit JTable noch mit dem TableModel halbwegs beschäftigt und präsentierst hier immer nur Codestückwerk ohne Zusammenhang.
 
Ja es tut mir auch leid, dass ich zu viel Code verwendet habe. Aber es sich lange keiner gemeldet, deswegen dachte ich, dass ich zu wenig an Information gegeben habe. Also habe ich mein Beitrag ergänzt. Wenn ich irgendwas gefunden habe, habe ich dazugeschrieben. Dann weiter im Internet geuscht und weiter ausprobiert.

Taik
 
Code:
 String columnNames[] = {"Name","WKN","Stück","Währung","Devisenkurs","Einstandskurs","Datum","Kurs","Kapital","Veränderung","Anteil"};
  String data[][] = new String[1][11];
  JTable tab = new JTable(data,columnNames){
    public boolean isCellEditable(int rowIndex, int columnIndex) {
      return false;
    }
  };
  JScrollPane overview = new JScrollPane(tab);

Das ist der wirklicher Code, der auch von mir verwendet wird.
 
taik84 hat gesagt.:
Code:
 String columnNames[] = {"Name","WKN","Stück","Währung","Devisenkurs","Einstandskurs","Datum","Kurs","Kapital","Veränderung","Anteil"};
  String data[][] = new String[1][11];
  JTable tab = new JTable(data,columnNames)

data enthält NICHTS. Lies bitte in einem Buch nach, wie Arrays initialisiert werden.
 
Zurück