Mal wieder JTable

Status
Nicht offen für weitere Antworten.

roddy

Aktives Mitglied
Hallo zusammen,

ich weiss, dass es haufenweise Themen/Tutorials/Links zu JTable gibt, allerdings hab ich relativ spezielle Probleme und hier keine Lösung dafür gefunden. Vielleicht kann mir ja von euch einer Helfen:

- Problem 1: Die Spaltennamen werden nicht angezeigt

Ich benutze eine JTable mit eigenem Model. Wenn ich die Tabelle erstelle, werden aber keine Spaltennamen angezeigt und ich verstehe nicht, warum. Die Spaltennamen werden als Stringarray übergeben und mit dem Konstruktor für das TableModel eingespeichert. Was muss ich noch tun, damit sie erscheinen?

Aufbau der Tabelle:

Code:
          JTable bestand = new JTable(new RVTableModelBestand(zb.length,sa.length+1, columnNames));

zb.length, sa.length sind nicht 0, columnNames enthält ausschließlich Strings. Er baut die Tabelle auch richtig auf, es fehlen einfach nur die Spaltenbezeichnungen. Hier noch meine Klasse RVTableModelBestand:

Code:
import javax.swing.table.*;

public class RVTableModelBestand extends AbstractTableModel{
    private String[] columnNames;
    private Object[][] data;
    
//Mein Konstruktor:

    public RVTableModelBestand(int row, int col, String[] colnam){
        data = new Object[row][col];
        columnNames = colnam;
    }
    
    public int getColumnCount(){
        return columnNames.length;
    }
    
    public int getRowCount(){
        return data.length;
    }
    
    public String getColumnName(int col){
        return columnNames[col];
    }
    
    public Object getValueAt(int row, int col){
        return data[row][col];
    }
    
    public Class getColumnClass(int c){
        if (getValueAt(0,c)!=null){
        return getValueAt(0, c).getClass();
        }
        else if (getValueAt(1,c)!=null){
            return getValueAt(1,c).getClass();
        }
        else { return "String".getClass(); }
    }
    
    public boolean isCellEditable(int row, int col){
        if (col > 0 && row >= 0){
            return true;
        }
        else {
            return false;
        }
    }
    
    public void setValueAt(Object value, int row, int col){
        data[row][col] = value;
    }
}

Hat jemand eine Ahnung, was ich da ändern müsste, damit die Spalten-Header angezeigt werden?



- Problem 2:

Es geht um die selbe Tabelle. Alle durch Benutzereingabe überschreibbaren Daten sind Integer. Wenn man etwas anderes als einen Integer in die Tabelle einträgt, wird die entsprechende Zelle auch rot markiert. Das geschieht alles ohne mein Zutun (sind irgendwelche Default-Settings für die JTable nehme ich an). Wie kann ich an genau dieser Stelle einwirken? (Ich hätte gerne sofort eine Fehlermeldung, wenn ein Wert eingetragen wird, der nicht Integer ist. Die rote Markierung reicht mir nicht, da es immernoch möglich ist, fehlerhafte Daten abzuspeichern)[/code]
 

Mag1c

Top Contributor
Hi,

und wie genau schaut das "columnNames" aus, mit dem du dein TableModel initialisierst ?

zu 2.: Baue einen eigenen TableCellEditor. In der zu überschreibenden Methode "stopCellEditing()" kannst du den Wert validieren, einen Fehler anzeigen und durch "return false" das Editieren fortsetzen.

Gruß
Mag1c
 

roddy

Aktives Mitglied
Zu ersterem: Das columnNames sieht ziemlich genau so aus:

Code:
          String[] columnNames = new String[Main.NumberOfStellplatzarten() + 1];
          columnNames[0] = "Zählbereich";
          String[] sa = Main.Stellplatzarten();
          for (int i = 0; i<Main.NumberOfStellplatzarten(); i++){
              columnNames[i+1] = sa[i];
          }

Die Methode Main.Stellplatzarten() liefert einen String-Array zurück.

Zu zweiterem: Danke für den Tipp, werd mir das gleich mal anschauen.
 

Mag1c

Top Contributor
Hi,

also das mit den columnNames ist mir ein Rätsel. Hast du mal das TableModel mit System.out's zugepflastert (Array im Konstruktor, getColumnCount(), getColumnName() ) ?

zum Editor:
schau mal hier. Da habe ich ein kleines Bsp. mit nem Editor gepostet, der auf Zahlen prüft. Im "catch (NumberFormatException" sollte leicht noch eine Fehler-Msg angezeigt werden können.

Gruß
Mag1c
 

roddy

Aktives Mitglied
Ich hab schon haufenweise System.outs ausprobiert, deswegen dachte ich ja, dass es da noch einen anderen Ansatz zum debuggen geben muss als die Vermutung, dass der Stringarray irgendwo illegale Werte enthält und deshalb nicht richtig als Spaltenkopf angezeigt wird.

Darf ich zu deinem Code mal ganz dumm fragen, wozu du das folgende machst? Bzw. was das folgende macht? Bin noch n ziemlicher Anfänger und komme beim Thema "implements" und "extends" leider sehr schnell durcheinander...

Code:
    public RVtableCellEditor() {
        super(new JTextField());
    }

[/code]
 
M

michi2

Gast
Ich hab auch ein Problem mit JTable: ich will ne Tabelle machen und deren Zeilen anzahl zur laufzeit ändern, schaffs aber nicht (bin noch ein anfänger).
Könnt ihr mit helfen?
Ich benutze Java 1.4

PS: was sind das für tuts. von denen 'ro
 

roddy

Aktives Mitglied
Wenn du hier in der Suchanfrage JTable eingibst, wirst du von Ergebnissen erschlagen. Unter FAQ gibts ein Tutorial zum Umgang mit Tabellen, ich denke, da wirst du mit deinem Problem auch fündig. (Direkt auswendig selbst helfen kann ich dir leider nicht, ich hab auch erst heute angefangen, mich mit Tabellen zu beschäftigen)
 

Mag1c

Top Contributor
Hi roddy,

du leitest von DefaultCellEditor ab und diese Klasse hat nur einen Konstruktor, welcher als Parameter ein JTextField erwartet. In der abgeleiteten Klasse mußt du diesen Konstruktor benutzen und da der DefaultCellEditor nicht ohne JTextField funktioniert wird dort einfach eines erzeugt.

Gruß
Mag1c
 

roddy

Aktives Mitglied
Danke für die Erklärung erstmal! Ich hab das jetzt mal probiert und die entsprechende Methode wie folgt implementiert:

Code:
    public boolean stopCellEditing(){
        String text = (String) getCellEditorValue();
        System.out.println(text);
        char textarray[] = text.toCharArray();
        for (int i = 0; i<textarray.length; i++){
            if (textarray[i]<48 || textarray[i]>57){
                JOptionPane.showMessageDialog(null, "Fehlerhafter Wert wurde eingegeben, bitte korrigieren! Erlaubt sind nur ganzzahlige Werte zwischen 0 und 999!", "Achtung...", JOptionPane.WARNING_MESSAGE, null);
                return false;
            }
        }
        return super.stopCellEditing();
    }

Jetzt verhält sich mein Programm allerdings wie folgt: Wenn ein Wert eingegeben wird, der kein echter Integer ist (also chars kleiner 48 bzw. größer 57 enthält), ist es nicht mehr möglich, andere Zellen zu editieren, bis der Wert korrigiert wird. Die Fehlermeldung (JOptionPane...) erscheint aber dennoch nicht. Wo ist mein Denkfehler?
 

Mag1c

Top Contributor
Hi,

das ist komisch, ich habe mal deine JOptionPane-Zeile in meinen Editor gepackt ... und ich erhalte auch den Fehler-Dialog.

EDIT: auch dein kompletter stopCellEditing-Code funktioniert bei mir.

Gruß
Mag1c
 

roddy

Aktives Mitglied
Ich vermute, dann hab ich irgendetwas beim Aufrufen/Einbindens des TableCellEditors falsch gemacht. Ich verwende das ganze in folgendem Kontext:

Code:
      public static void startBestandGUI(){
          final Properties projekt = RVproperties.getProjektCFG();
          // Die Namen der Spalten werden generiert
          String[] columnNames = new String[Main.NumberOfStellplatzarten() + 1];
          columnNames[0] = "Zählbereich";
          String[] zb = Main.Zaehlbereiche();
          String[] sa = Main.Stellplatzarten();
          int[][] best = Main.Bestand();
          for (int i = 0; i<Main.NumberOfStellplatzarten(); i++){
              columnNames[i+1] = sa[i];
          }
          
          JTable bestand = new JTable(new RVTableModelBestand(zb.length,sa.length+1, columnNames));
          bestand.setCellEditor(new RVtableCellEditor());
          
          //Einrichten der Spaltenbreite
          TableColumn column = null;
          column = bestand.getColumnModel().getColumn(0);
          column.setPreferredWidth(100);
          for (int i = 0; i<sa.length; i++){
              column = bestand.getColumnModel().getColumn(i+1);
              column.setPreferredWidth(50);
          }
          
          for (int i = 0; i<zb.length; i++){
              bestand.setValueAt(zb[i], i,0);
          }
          
          for (int i = 0; i<zb.length; i++){
              for (int j = 1; j<best[i].length; j++){
                  bestand.setValueAt(best[i][j],i,j);
              }
          }
          ScrollPane scroll = new ScrollPane();
          scroll.add(bestand);
          scroll.setSize(640,480);
          String[] options = {"Änderungen speichern", "Abbrechen"};
          int todo = JOptionPane.showOptionDialog(null,scroll,"Bindestrichtest-Treffer...",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE,null, options, options[1]);
          if (todo == 0){... }
          else {... }
      }

Wäre nett, wenn du mal schaun könntest, ob dir da n Fehler auffällt![/code]
 

Mag1c

Top Contributor
Ja,

das setCellEditor(...) ist nicht gut. Das wird intern dazu genutzt, wenn die Tabelle in den Edit-Modus schaltet, der Tabelle den CellEditor bekannt zu geben. Das dient der Tabelle auch dazu, zu erkennen, ob die Tabelle im Edit-Modus ist. Sobald ein Edit-Vorgang beendet wird, wird der CellEditor wieder auf null gesetzt.

Du müsstest setDefaultEditor(...) benutzen und als Typ den Objekttyp der betreffenden Zellen angeben (also String.class, oder?)

Und noch ein Tip: das setValueAt wird normalerweise von der Tabelle benutzt, um editierte Zellen zurück ins Model zu schreiben. Wenn du, wie hier, den gesamten Model-Inhalt (re-)initialisieren willst, kannst du dir auch eine eigene Methode schreiben, wo alle Daten auf einmal kommen und dann mit fireTableStructureChanged() eine Neudarstellung der Tabelle veranlassen.

Gruß
Mag1c
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
O JTable zeigt die alte Daten wieder AWT, Swing, JavaFX & SWT 23
C Schon wieder JTable AWT, Swing, JavaFX & SWT 7
E wieder einmal JTable AWT, Swing, JavaFX & SWT 5
P JTable...mal wieder AWT, Swing, JavaFX & SWT 7
A Wie werde ich beim JTable die Selection wieder los? AWT, Swing, JavaFX & SWT 6
C JTable. Mal wieder AWT, Swing, JavaFX & SWT 10
J Spalte in JTable aus- und wieder einblenden AWT, Swing, JavaFX & SWT 10
G TableModel von JTable wieder entfernen AWT, Swing, JavaFX & SWT 10
richis-fragen Wie kann man den RowSorter dazu bringen die ursprünglich liste wieder anzuzeigen. AWT, Swing, JavaFX & SWT 28
J Eingaben aus Textfield & ComboBox speichern und in ComboBox wieder ausgeben AWT, Swing, JavaFX & SWT 3
B Text mit Absatz + OK-Button, der Fenster wieder schließt AWT, Swing, JavaFX & SWT 7
J JOptionPane ruft sich selbst immer wieder neu auf AWT, Swing, JavaFX & SWT 3
R JOptionPane schließt sich nicht wieder AWT, Swing, JavaFX & SWT 2
C Memory Karten nach Paar offen bleiben sonst wieder umdrehen AWT, Swing, JavaFX & SWT 1
C Benutzername in GUI eingeben und nach Spiel neues Fenster Benutzername wieder anzeigen AWT, Swing, JavaFX & SWT 1
T SWT Mysql Tabelle zeigt immer nur den ersten Wert immer wieder an AWT, Swing, JavaFX & SWT 3
X AWT Text der mit Graphics "drawString(...)" geschreiben wurde wieder löschen. AWT, Swing, JavaFX & SWT 6
F Swing Java Swing Array in Datei und wieder raus AWT, Swing, JavaFX & SWT 7
A Swing Paint mit Button Clear den Hintergrund säubern um wieder zeichnen zu können AWT, Swing, JavaFX & SWT 2
M Java anwendung VOR vollbildspielen (schon wieder...) AWT, Swing, JavaFX & SWT 5
P jframe setVisible(false) wieder sichtbar machen? AWT, Swing, JavaFX & SWT 4
B Swing Repaint Problem - mal wieder AWT, Swing, JavaFX & SWT 5
A jformattedtextfield unsichtbar und wieder sichtbar machen AWT, Swing, JavaFX & SWT 13
J Swing Fenster lässt sich nach Schließung nicht wieder öffnen AWT, Swing, JavaFX & SWT 4
A AWT Nach dem generieren von bildern verschwinden diese wieder AWT, Swing, JavaFX & SWT 9
J Mal wieder Probleme mit paintComponent AWT, Swing, JavaFX & SWT 3
C SWT CTabItem wieder sichtbar machen AWT, Swing, JavaFX & SWT 3
GUI-Programmer Wieder ne Layout Frage AWT, Swing, JavaFX & SWT 11
R Komponente wieder entfernen AWT, Swing, JavaFX & SWT 13
A Fokus wieder in ein JTextField setzen AWT, Swing, JavaFX & SWT 4
L Buttons aus Arrayliste erstellt wie komm ich nun wieder an das Oobjekt aus der arrayliste ran AWT, Swing, JavaFX & SWT 3
Z Swing Buttons wieder entfernen vom Bildschirm AWT, Swing, JavaFX & SWT 5
O Swing JButton werden richtig gewechselt aber die Maus macht die alten wieder Sichtbar?? AWT, Swing, JavaFX & SWT 5
N gezeichnete Graphiken speichern und wieder anzeigen AWT, Swing, JavaFX & SWT 8
hdi SWT Operation auf GUI-Komponente kommt mal wieder nicht an... AWT, Swing, JavaFX & SWT 9
Ollek Swing JPnales nach bestimmtenVorgang wieder anzeigen AWT, Swing, JavaFX & SWT 4
P Swing Hintergrundfarbe auslesen und wieder setzen AWT, Swing, JavaFX & SWT 4
M AWT Zurücksetzbutton, wieder auf das original Bild AWT, Swing, JavaFX & SWT 3
S ProgressBar newRunnable (schon wieder!) AWT, Swing, JavaFX & SWT 9
M Fenster nach minimierung zum tray wieder öffnen AWT, Swing, JavaFX & SWT 3
E Swing Wieder ein Bild einfügen AWT, Swing, JavaFX & SWT 2
P schon wieder schlange AWT, Swing, JavaFX & SWT 8
Luy Per TAB-Taste aus TextArea wieder raus? AWT, Swing, JavaFX & SWT 5
D Swing JMenu wieder schließen lassen AWT, Swing, JavaFX & SWT 7
F JFileChooser mal wieder AWT, Swing, JavaFX & SWT 2
B Wie kann ich ein event wieder beseitigen AWT, Swing, JavaFX & SWT 2
hdi Swing mal wieder EDT -> nichts passiert AWT, Swing, JavaFX & SWT 20
S Feintuning, mal wieder Threading + swing ... AWT, Swing, JavaFX & SWT 8
S JDialog startet immer wieder neu AWT, Swing, JavaFX & SWT 2
PAX Iconified JFrame per Code wieder anzeigen lassen (deiconify) AWT, Swing, JavaFX & SWT 2
T Mal wieder Swing GUI AWT, Swing, JavaFX & SWT 7
hdi repaint() mag mal wieder nicht. AWT, Swing, JavaFX & SWT 9
T JCheckBox deselektieren (Haken wieder entfernen) - wie? AWT, Swing, JavaFX & SWT 5
M ich will die alten "alte JButtons"wieder haben AWT, Swing, JavaFX & SWT 6
G Ein jTextField im laufe das Programmes immer wieder updaten AWT, Swing, JavaFX & SWT 2
G wieder mal das leidige thema listener AWT, Swing, JavaFX & SWT 3
G Drag and Drop mal wieder? AWT, Swing, JavaFX & SWT 2
T Ich komme mal wieder nicht mit Swing und Image klar. AWT, Swing, JavaFX & SWT 5
G SWT Toolbar: Toolitem entfernen und wieder hinzufügen AWT, Swing, JavaFX & SWT 16
M wieder einmal JScrollPane und JList AWT, Swing, JavaFX & SWT 4
S getSize gibt keine Größe wieder AWT, Swing, JavaFX & SWT 4
T Linien zeichnen und wieder löschen AWT, Swing, JavaFX & SWT 9
Z Und schon wieder die Linien (Problem beim überzeichnen) AWT, Swing, JavaFX & SWT 4
V mal wieder das gute alte gridbaglayout AWT, Swing, JavaFX & SWT 4
W JTabele Aktualisieren - Wieder einmal AWT, Swing, JavaFX & SWT 4
B Schon wieder ein Problem mit paintComponent(). AWT, Swing, JavaFX & SWT 2
S JScrollPane mal wieder AWT, Swing, JavaFX & SWT 2
R JLabel Icon wieder entfernen AWT, Swing, JavaFX & SWT 4
A Wieder einmal Event-Dispatch-Thread AWT, Swing, JavaFX & SWT 5
I JProgressBar String anzeigen, danach wieder normale Ansicht AWT, Swing, JavaFX & SWT 3
G mal wieder table. AWT, Swing, JavaFX & SWT 3
X wieder mal ein prob mit dnd AWT, Swing, JavaFX & SWT 14
Luma Alle Fenster verstecken und wieder sichtbar machen? AWT, Swing, JavaFX & SWT 6
S JFrame minimieren und wieder herstellen AWT, Swing, JavaFX & SWT 2
R Anonymen CaretListener wieder entfernen AWT, Swing, JavaFX & SWT 4
G JTabbedPane: Tabs verschwinden lassen und wieder anzeigen AWT, Swing, JavaFX & SWT 3
juppi JFrame will nicht wieder verschwinden AWT, Swing, JavaFX & SWT 2
K Und schon wieder JInternalFrame AWT, Swing, JavaFX & SWT 2
S Wieder eine Frage zu javax.swing.text AWT, Swing, JavaFX & SWT 2
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben