JTable: Eingabe nur für bestimmte Var.Typen zulassen

Status
Nicht offen für weitere Antworten.

Scrimau

Mitglied
Hi, ich möchte in meiner Tabelle (JTable) für eine Spalte nur bestimmte Eingaben zulassen, z.B nur Integer für die erste Spalte, Doubles für die 2. Spalte, etc.
Ich dachte ich könnte das mit einem eigens abgeleiteten DefaultTableModel bewerkstelligen, klappte allerdings nicht (dann verwarf er alles was ich eingab):

Java:
import javax.swing.table.DefaultTableModel;

public class Tabelle extends DefaultTableModel{

    @Override
    public void setValueAt(Object aValue, int row, int col) {
        if (aValue instanceof Integer) {
            super.setValueAt(aValue, row, col);
        }
    }
}

Edit: Habe jetzt mal diese Sache hier ausprobiert:
Java:
@Override
    public void setValueAt(Object aValue, int row, int col) {
        if (Integer.valueOf(aValue.toString())!=null) {
            super.setValueAt(aValue, row, col);
        }

Nun lässt er zwar nur Integer zu, aber es gibt eine Exception:
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "sfsfs"

kann ich die vielleicht einfach missachten? :D (oder halt mit try catch abfangen und dann einfach ignorieren?)
Oder bin ich auf dem völlig falschen Weg?


Bin dankbar für jeden Vorschlag
 
Zuletzt bearbeitet:

HannsW

Bekanntes Mitglied
Ich würde es mit try-catch machen. Im catch-Zweig setzt Du dann deinen Wert auf " " ( leeren string), DAs dürfte auch mit Double klappen.
Hanns
 

hdi

Top Contributor
Du musst die Methode getColumnClass() überschreiben und für diese Spalte Integer.class zurückgeben. Dann kommt bei der instanceof Prüfung auch true raus und er setzt den Wert - defaultmässig wird alles als String behandelt.
 

Scrimau

Mitglied
Du musst die Methode getColumnClass() überschreiben und für diese Spalte Integer.class zurückgeben. Dann kommt bei der instanceof Prüfung auch true raus und er setzt den Wert - defaultmässig wird alles als String behandelt.

Danke, so hatte ich mir das vorgestellt jetzt nur noch 1 kleine Sache, wie begrenze ich jetz z.B. die EIngabe auf einen bestimmten Bereich sagen wir von 1..100, hatte mir das so gedacht, das funzt aber wieder nicht:

Java:
import javax.swing.table.DefaultTableModel;

public class Tabelle extends DefaultTableModel{

    Integer max;

    public void setmax(Integer wert)
    {
        this.max=wert;
    }

   public Integer getmax()
    {
        return this.max;
    }

    @Override
    public void setValueAt(Object aValue, int row, int col)
    {
        
        if ((aValue>=0 && aValue<max) || col==3)
        {
            super.setValueAt(aValue, row, col);
        }
    }

    @Override
    public Class getColumnClass(int col)
    {
        if (col==1 || col==2)
            return Integer.class;
        else
            return Double.class;
    }
}

Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: Uncompilable source code - operator >= cannot be applied to java.lang.Object,int
 
S

SlaterB

Gast
tja, ohne instanceof + Cast kein Rechnen oder Vergleich auf > 0,
 

Scrimau

Mitglied
Habs jetz so:

Java:
import javax.swing.table.DefaultTableModel;

public class Tabelle extends DefaultTableModel{

    Integer max;

    public void setmax(Integer wert)
    {
        this.max=wert;
    }

   public Integer getmax()
    {
        return this.max;
    }

    @Override
    public void setValueAt(Object aValue, int row, int col)
    {
       
        if (aValue instanceof Integer)
        {
            if ((Integer.valueOf(aValue.toString())>=0 && Integer.valueOf(aValue.toString())<max) || col==3)
            {
                super.setValueAt(Integer.valueOf(aValue.toString()), row, col);
            }            
        }

    }

    @Override
    public Class getColumnClass(int col)
    {
        if (col==1 || col==2)
            return Integer.class;
        else
            return Double.class;
    }
}

Aber da funktioniert es in der 2.Spalte (weiss der Geier, warum) aber in den übrigen Spalten setzt er es immer wieder zurück, egal welcher Eingabewert.

Hat wer nen Lösungsvorschlag?
 
Zuletzt bearbeitet:

hdi

Top Contributor
1) Der Spaltenindex beginnt bei 0, nicht bei 1.
D.h. deine Klassen für die Spalten intern sind für die 2. und 3.Spalte Integer, für alle anderen Double.
2) Deshalb kannst du in der 2. und 3. Spalte auch einen int-Wert setzen (das dürfte nicht nur in der 2. Spalte funktionieren)
3) Da alle anderen Spalten einen Double enthalten, wird die instanceof Integer Prüfung in der setValue() für diese Spalten niemals true, deshalb passiert da auch nix.

Also nochmal zum Verständnis: Was du bei getColumnClass() für eine Klasse zurückgibst, bestimmt von welchem Typ dann in der setValue() dein Objekt "aValue" ist. Jeweils für den Spaltenindex halt. Und es gilt: 1.Spalte in der Ansicht = Index 0, wie bei Arrays.
 

Scrimau

Mitglied
Klappt jetzt alles, danke, Leute.

Hier noch zum Abschluss der ganze Quelltext:
Java:
import javax.swing.table.DefaultTableModel;

public class Tabelle extends DefaultTableModel{

    Integer max;

    public void setmax(Integer wert)
    {
        this.max=wert;
    }

   public Integer getmax()
    {
        return this.max;
    }

    @Override
    public void setValueAt(Object aValue, int row, int col)
    {

        if (aValue instanceof Integer)
        {
            if ((Integer.valueOf(aValue.toString())>=0 && Integer.valueOf(aValue.toString())<max))
            {
                super.setValueAt(Integer.valueOf(aValue.toString()), row, col);
            }
        }
        else
            super.setValueAt(aValue, row, col);

    }

    @Override
    public Class getColumnClass(int col)
    {
        if (col==0 || col==1)
            return Integer.class;
        else
            return Double.class;
    }
}

/close
 

hdi

Top Contributor
Ich hab noch was zu bemängeln ;)
1) Attribut "max" private machen, sonst haben Getter und Setter keinen Sinn
2) Namenskonventionen bei Methoden: setMax, getMax
3) deine setValue()-Methode ist noch etwas umständlich. Besser zB so:
Java:
 @Override
    public void setValueAt(Object aValue, int row, int col)
    {
        // abort if value is out of bounds
        if (aValue instanceof Integer)
        {
          int value = ((Integer)aValue).intValue();
          if(value < 0 || value > max){
              return;
          }
        }
        // save okay here
        super.setValueAt(aValue, row, col);
    }
 

Scrimau

Mitglied
Nochmal danke

Final Version:

Java:
import javax.swing.table.DefaultTableModel;

public class TabelleVerb extends DefaultTableModel{

    private Integer max;

    public void setMax(Integer max)
    {
        this.max=max;
    }

    public Integer getMax()
    {
        return this.max;
    }

    @Override
    public void setValueAt(Object aValue, int row, int col)
    {
        // abort if value is out of bounds
        if (aValue instanceof Integer)
        {
          int value = ((Integer)aValue).intValue();
          if(value < 0 || value > max)
          {
              return;
          }
        }
        // save okay here
        super.setValueAt(aValue, row, col);
    }

    @Override
    public Class getColumnClass(int col)
    {
        if (col==0 || col==1)
        {
            return Integer.class;
        }
        else
        {
            return Double.class;
        }
    }
}
 
Zuletzt bearbeitet:

hdi

Top Contributor
nicht ganz final :D (Ich will dich nicht stressen, aber solange es noch was zu lernen gibt warum nicht).

Java:
if (col==0 || col==1)
            return Integer.class;
        else
            return Double.class;

sowas ist auch böse, kann leicht zu Fehlern führen. Immer einen Block nach if's oder else's machen, auch wenn nur eine einzige Anweisung folgt:
Java:
if (col==0 || col==1){
    return Integer.class;
}
else{
    return Double.class;
}

ein Setter nutzt üblicherweise als Parameternamen den Namen des zu ändernden Attributes:
Java:
public void setMax(Integer max) // statt "wert"
{
     this.max=max;
}
Jetzt macht nämlich auch das "this" Sinn ;)

...und zu guter letzt: Formatier den Code mal, damit alles schön sauber und gleichmässig eingerückt ist. Wenn du das alles getan hast ist das ne "officially professional class" :cool: ^^
 

HannsW

Bekanntes Mitglied
Java:
  @Override
    public void setValueAt(Object aValue, int row, int col)
    {
        // abort if value is out of bounds
        if (aValue instanceof Integer)
        {
          int value = ((Integer)aValue).intValue();
          if(value < 0 || value > max){
              return;
          }
        }
        // save okay here
        super.setValueAt(aValue, row, col);
    }
 
[/Java]

Mein Problem mit diesem Code :
Es wird garantiert, daß in "Integer-Spalten" nur ints geschriebene werden.
Was aber passiert, wenn ein "IntegerObject" in eine "Double-Spalte" geschrieben werden ?
Werden diese dann automatisch gewandelt?
 

hdi

Top Contributor
Ja genau, in diesem Fall wird wohl der Integer unboxed, dann wird ein double drausgemacht, und dieser wieder geboxed. Der Wertebereich von Fließkommazahlen enthält ja den von ganzen Zahlen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J JTable: Eingabe in Tabellenzelle korrigieren AWT, Swing, JavaFX & SWT 4
P JTable - bei Eingabe Selektion AWT, Swing, JavaFX & SWT 0
A JTable Cell Eingabe AWT, Swing, JavaFX & SWT 6
S JTable - Auf spezielle Eingabe nicht reagieren. AWT, Swing, JavaFX & SWT 5
N Filternde Combobox in JTable verliert Fokus nach erster Eingabe AWT, Swing, JavaFX & SWT 2
M Swing JTable cell leeren bei Eingabe AWT, Swing, JavaFX & SWT 6
eskimo328 JTable nächste Zelle nach Eingabe einer Ziffer AWT, Swing, JavaFX & SWT 5
G JTable - bei falscher Eingabe wird alter Wert genommen. AWT, Swing, JavaFX & SWT 2
M JTable: TableCellEditor nach Eingabe sofort beenden? AWT, Swing, JavaFX & SWT 3
H Eingabe von Zahlen in JTable und Fokusweitergabe AWT, Swing, JavaFX & SWT 4
R JTable, automatischer resize der Zellen nach einer Eingabe AWT, Swing, JavaFX & SWT 4
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
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
R Swing JTable und Spaltenausrichtung AWT, Swing, JavaFX & SWT 8
G JTable füllen AWT, Swing, JavaFX & SWT 1
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
M JTable.setDefaultRenderer(...) greift nicht AWT, Swing, JavaFX & SWT 0
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
S Jtable defaultRenderer wohin damit ? AWT, Swing, JavaFX & SWT 23
T Swing JTable / FocusListener AWT, Swing, JavaFX & SWT 0
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
J addRow bei JTable AWT, Swing, JavaFX & SWT 6
M Jtable gibt -1 wert bei selectedRow und Column AWT, Swing, JavaFX & SWT 3
Meeresgott Swing JTable AWT, Swing, JavaFX & SWT 4
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
Thallius JTable dynamisch Spaltenanzahl verändern AWT, Swing, JavaFX & SWT 2
Thallius JTable dynamisch laden? AWT, Swing, JavaFX & SWT 2
B Swing JTable sortieren AWT, Swing, JavaFX & SWT 2
T Swing JTable auslesen und befüllen AWT, Swing, JavaFX & SWT 8
B JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 1
J JTable und Suchlogik AWT, Swing, JavaFX & SWT 4
Viktim Swing JTable mit Tab verlassen AWT, Swing, JavaFX & SWT 1
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
Viktim Swing JTable Mit Tab druch Zeilen Wechseln AWT, Swing, JavaFX & SWT 5
Thallius Warum refrehsed mein JTable nicht? AWT, Swing, JavaFX & SWT 5
Ghostman1711 Hinzufügen ausgewählter Dateinen des Filechoosers zu einem JTable AWT, Swing, JavaFX & SWT 9
S Swing JTable - Einzelne Rows einfärben AWT, Swing, JavaFX & SWT 11
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
K JTable getValueAt() klappt nicht immer AWT, Swing, JavaFX & SWT 1
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
P Fokus auf Zelle in JTable AWT, Swing, JavaFX & SWT 1
S Swing Deselektion in JTable verhindern AWT, Swing, JavaFX & SWT 0
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
N Swing Print JTable mit AbstractTableModel AWT, Swing, JavaFX & SWT 1
Ananaskirsche Swing jTable Reihen zuviel eingefügt AWT, Swing, JavaFX & SWT 12
P im JTable die Schriftfarbe ändern AWT, Swing, JavaFX & SWT 19
T Swing JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Dreiecke in bestimmte Zellen einer JTable AWT, Swing, JavaFX & SWT 9
LexeB4F Zelle in JTable gezielt einfärben AWT, Swing, JavaFX & SWT 4
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
D Swing JTable Renderer Grafikfehler AWT, Swing, JavaFX & SWT 0
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
M Swing JTable GroupableHeader Background Color AWT, Swing, JavaFX & SWT 4
K Swing JTable updaten AWT, Swing, JavaFX & SWT 9
thet1983 Swing MySQL >> JTable AWT, Swing, JavaFX & SWT 5
J JTable bounds ändern durch resizing des Fensters AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen

Neue Themen


Oben