# getValueAt



## yuuz11 (5. Jul 2015)

Hallo liebe Leute, 

ich hänge momentan an einem Problem und komme nicht weiter, kann mir jemand sagen was ich hier falsch mache? 
[Java]public Object getValueAt(int rowIndex, int columnIndex) {
        return model.getValueAt(rowIndex, aolumnIndex);
        StringBuilder result = new StringBuilder( length );
        int[] row = new int[10];
        int[] column = new int[3];
          for(int i=0 ; i<row.length ;i++){
            for(int j=0 ; j<column.length ;j++){
              if(row_==column[j])
                return result.toString();[/code]_


----------



## DrZoidberg (5. Jul 2015)

Zum einen steht da "aolumnIndex" in deinem Code anstelle von "columnIndex".
Ausserdem macht es keinen Sinn die zwei Arrays "row" und "column" neu zu erstellen und dann zu vergleichen. Die Arrays enthalten dann nur Nullen.

Was genau soll die Methode denn machen? Es wäre hilfreich, wenn wir wüssten wie die dazugehörige Klasse aussieht.


----------



## yuuz11 (5. Jul 2015)

ich will die Werte aus Zeilen für die jeweilige Spalte durch if-Abfrage als String ausgeben. 

Vorgabe Spieler1 Spieler2       Ergebnis
1            1          0          spieler1 gewinnt
0            0          0            unentschieden
.             .          .                  .
.             .          .                  .

übrigens die zahlen lassen sich mit einem random generieren.

```
private static TableModel randomModel(){
            Object[] Bezeichnung = { "Vorgabe", "SpielerA", "SpielerB","Ergebniss" };
```


```
DefaultTableModel model = new DefaultTableModel( Bezeichnung, 0 ){
                @Override
                public Class getColumnClass( int column ) {
                    switch( column ){
                        case 0: return Integer.class;
                        case 1: return Integer.class;
                        case 2: return Integer.class;
                        case 3: return String.class;
                        default: return Object.class;
                    }
                }
            };
```


----------



## InfectedBytes (5. Jul 2015)

außerdem ist deine erste zeile direkt ein return, wodurch alles was dahinter steht niemals ausgeführt werden würde.


----------



## yuuz11 (5. Jul 2015)

Ich muss doch nachdem ich mein wert bestimmt habe anwenden oder nicht? 
Mit getvalueat will ich genau das machen und return soweit ich weiss die gleiche Aufgabe macht oder liege ich falsch? Ausserdem ich will durch if-Abfrage das in der letzten Spalte stringen. Was stimmt mit meinem Code also nicht.. Ich programmiere zum ersten mal mit jtable.


----------



## InfectedBytes (5. Jul 2015)

ein return gibt den Ausdruck direkt dahinter (Falls vorhanden) zurück und verlässt die Methode.

```
int test(int x) {
  return 42;
  if(x>0) ... 
}
```
Die Methode gibt immer 42 zurück. die if-Abfrage danach wird nie ausgeführt, da ein return eben die Methode verlässt. 
(Solch ein Fall würde erst gar nicht kompiliert werden)

Du solltest dir vielleicht mal die Grundlagen aneignen: javainsel

Außerdem erzeugst du einen StringBuilder, machst aber im Grunde gar nichts damit. Weiterhin gibst du an, dass die Methode ein Object zurückgibt, obwohl du immer einen String zurückgeben willst.

Und warum überhaupt die Schleife? Ich dachte die Methode soll einfach nur den Text innerhalb eines Feldes zurückgeben. Stattdessen durchläufst du alle Felder und returnst wenn column[j] == row_ ist. 

Wenn du wirklich nur den Inhalt der Zelle als String haben willst:


		Java:In die Zwischenablage kopieren


String getValueAt(int row, int column) {
  return model.getValueAt(row, column).toString();
}


Falls du doch irgendwas anderes haben willst, solltest du nochmal erklären, was genau du mit der Methode erreichen willst._


----------



## yuuz11 (5. Jul 2015)

InfectedBytes hat gesagt.:


> Und warum überhaupt die Schleife? Ich dachte die Methode soll einfach nur den Text innerhalb eines Feldes zurückgeben. Stattdessen durchläufst du alle Felder und returnst wenn column[j] == row_ ist._


_

Der Taxt, der augegeben sein soll bezieht sich auch die Werte der jeweligen Zeile. 
ich kann mal mit anderen Worten vielleicht versuchen zu erklären. Die Methode soll einfach ausgeben, dass wenn die Zahl aus der nte-Zeile,nte-Spalte und nte-Zeile,nte-Spalte+1 gleich sind -> return result.toString();_


----------



## InfectedBytes (5. Jul 2015)

du übergibst als parameter zeile/spalte und willst diese mit der darauffolgenden spalte vergleichen? 
warum gehst du dann alle Felder in der Schleife durch? 

```
if(model.getValueAt(row, column) == model.getValueAt(row, column + 1)) { ... }
```

Und immernoch die Frage was denn im result stehen soll? 
Bisher erzeugst du nen StringBuilder, schreibst gar nichts darein und gibst dann result.toString() zurück, was dann halt logischerweise der leere String ist.


----------



## yuuz11 (5. Jul 2015)

ich habe dein Tip gefolgt und habe sowas daraus gemacht aber es kommt die Fehlermeldung class expected

```
private static String randomString( Random random ){
        
        StringBuilder result = new StringBuilder(3 );
        for( int i = 0; i < 3; i++ )
           if(model.getValueAt(int row, int column) == model.getValueAt(row, column + 1)&&model.getValueAt(int row, int column) != model.getValueAt(row, column + 2))
           result.append("Spieler1 gewinnt");
        return result.toString();
    }
```
normalerweise müsste diesmal funktionieren


----------



## InfectedBytes (5. Jul 2015)

bitte, bitte schau dir ein tutorial an oder lies ein einsteigerbuch. Dir scheinen nämlich einige Grundlagen zu fehlen.

```
if(model.getValueAt(int row, int columnIndex)
```
Wenn man Parameter übergibt, darf man nicht noch den Datentyp davorschreiben
Der Datentyp eines Parameters wird nur in der Deklaration geschrieben.
Also z.b:

```
//Deklaration
public RückgabeTyp methodenName(ParameterTyp parameterName) {
...
}
```


```
//verwendung
methodenName(konkreterWert);
//also z.b.
methodenName(123);
// aber NICHT
methodenName(int wert);
```


----------



## yuuz11 (5. Jul 2015)

danke schön, ich hab mich schlau gemacht, mir ist einigermassen klar geworden, nun mein code sieht folgendermaßen aus:

```
private  String randomString( Random random ){
                   StringBuilder result = new StringBuilder(3 );
        
        for( int i = 0; i < 3; i++ )
           if(model.getValueAt(row, column) == model.getValueAt(row, column + 1)&&model.getValueAt( row, column) != model.getValueAt(row, column + 2))

           result.append("Spieler1 gewinnt");
        return result.toString();
    }
```

aber es kommt die Fehlermeldung: non-static methode randomStrin(java.util.random) cannot be referenced from a static context 
an dieser Stelle:   randomInt( random ),randomInt( random ),randomInt( random ),*randomString*( random ),


----------



## InfectedBytes (5. Jul 2015)

Variablen und Methoden die mit dem static Schlüsselwort versehen sind, existieren ohne eine Instanz und können direkt verwendet werden. Variablen und Methoden die nicht static sind, sind sogennante Instanzvaraiblen/Instanzmethoden und können nur auf einem Objekt des entsprechenden Typs aufgerufen werden.

Da deine randomString Methode eine Instanzmethode ist, kann sie nur auf einer Instanz der entsprechenden Klasse aufgerufen werden. => Grundlagen

Und dann natürlich noch die Frage warum du ein Random Objekt übergibst, wenn du doch gar nichts damit machst...und warum heißt deine Methode "randomString", wenn sie doch überhaupt nichts zufälliges macht.


----------



## yuuz11 (5. Jul 2015)

du hast Recht, ich hätte randomString gar nicht gebraucht aber es muss eine Spalte erzeugt werden, wo meine Ergebnisse gestringt werden. 
diesmal habe ich an meinem Code gearbeitet und soweit verändert, es kommt zum Glück keine Fehlermeldung mehr aber die Ergebnisse lassen sich nicht zeigen!!?? an dieser Stelle

```
for( int i = 0; i < 10; i++ ){
            Object[] row = {

                    randomInt( random ),randomInt( random ),randomInt( random ),"",

                };

            model.addRow( row );
```


```
public Object getValueAt(int row,int column){
        StringBuilder result = new StringBuilder(3 );

        for( int i = 0; i < 3; i++ )
            if(getValueAt(row, column) == getValueAt(row, column + i)&&getValueAt( row, column) != getValueAt(row, column + i))

                result.append("Spieler1 gewinnt");
        return result.toString();
    }
```


----------



## Harry Kane (5. Jul 2015)

Deine getValueAt-Methode scheint mir zu einem selbst geschriebenen TableModel zu gehören. Zumindest finden sich in deinen übrigen Codeschnipseln Hinweise darauf, und sowohl ame als auch Signatur wirken auf mich nicht so als hättest du dir das selbst ausgedacht.
Poste doch mal den kompletten Code deines TableModels. Deine bisherigen Codezeilen sind weitgehend aus dem Zusammenhang gerissen. Woher sollen wir wissen, zu welcher Klasse die Zeilen gehören, und wo und wie Instanzen dieser Klasse erzeugt werden?


----------



## yuuz11 (5. Jul 2015)

ja das stimmt teilweise schon, ich habe mir vorgenommen Jtable aus einem Beispiel zu lernen.
also kann keiner mir sagen was ich hier machen soll um es endlich gebacken zu bekommen?


----------



## Harry Kane (5. Jul 2015)

In deiner aktuellen Form ruft sich die getValueAt-Methode rekursiv auf. Ich sehe auf Anhieb keine Abbruchbedingung. Deshalb schätze ich, daß ein StackOverflowError geworfen wird, deswegen die Gui abschmiert  und du davon nix mitbekommst.
Wenn du Hilfe brauchst sehe ich zwei Möglichkeiten:
1. Zusammenhängenden Code posten, aus dem erkennbar ist, was zu welcher Klasse gehört und was wie aufgerufen wird. Google mal nach KSKB.
2. Warten auf jemanden mit hellseherischen Fähigkeiten und/oder viel Zeit und Geduld.


----------



## yuuz11 (5. Jul 2015)

ok ich hab mich dann für KSKB entschieden und poste deshalb  

```
import java.awt.*;
import java.util.Random;

import javax.swing.*;
import javax.swing.table.*;

public class MünzwurfSpiel{
    public static void main( String[] args ){

        TableModel model = randomModel();
        JTable table = new JTable( model );
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>();
        table.setRowSorter( sorter );

        sorter.setModel( model );
        JFrame frame = new JFrame( "Münzwurf" );
        frame.getContentPane().add( new JScrollPane( table ) );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.pack();
        frame.setVisible( true );
    }

    private static TableModel randomModel(){
        Object[] Bezeichnung = { "Vorgabe", "SpielerA", "SpielerB","Ergebniss" };

        DefaultTableModel model = new DefaultTableModel( Bezeichnung, 0 ){
                @Override
                public Class getColumnClass( int column ) {
                    switch( column ){
                        case 0: return Integer.class;
                        case 1: return Integer.class;
                        case 2: return Integer.class;
                        case 3: return String.class;
                        default: return Object.class;
                    }
                }
            };

        Random random = new Random();
        for( int i = 0; i < 10; i++ ){
            Object[] row = {

                    randomInt( random ),randomInt( random ),randomInt( random ),"",

                };

            model.addRow( row );

        
        }
        return model;

     
        // Generiert einen zufälligen String

        // Der Wert der Zelle (rowIndex, columnIndex)
        // Generiert einen zufälligen String

    
    }
      // Generiert einen zufälligen int
    private static int randomInt( Random random ){
        return random.nextInt( 2 ) ;
    }
    public Object getValueAt(int rowIndex,int columnIndex){
        StringBuilder result = new StringBuilder(3 );

        for( int i = 0; i < 3; i++ )
            if(getValueAt(rowIndex, columnIndex) == getValueAt(rowIndex, columnIndex + i)&&getValueAt( rowIndex, columnIndex) != getValueAt(rowIndex, columnIndex + i+1)){

                result.append("Spieler1 gewinnt");
        
    }
return result.toString();
}}
```
BM


----------



## Harry Kane (6. Jul 2015)

Deine getValueAt-Methode gehört nicht zu deiner TableModel-Klasse, sondern zu deiner MünzwurfSpiel-Klasse.
Wenn du ein System.out zu Beginn der Methode eingefügt hättest, wäre dir aufgefallen, dass sie nie aufgerufen wird.
Dieses Konstrukt ist ein Paradebeispiel dafür, dass zur Fehlerdiagnose nicht nur der Code einer Methode gepostet werden sollte, sondern die Klasse, zu der die Methode gehört.
Lösung: wenn du dein TableModel erzeugst und ihm 10 Zeilen hinzufügst, musst du nicht nur die Zahlenwerte für die ersten 3 Spalten berechnen, sondern auch das Ergebnis in der letzten Spalte. Bisher steht da ein "".
Das Ergebnis kann wie folgt berechnet werden:
1. Wenn der Zahlenwert für beide Spieler gleich ist, ist das Ergebnis unentschieden. Es spielt offenbar keine Rolle, ob beide den richtigen Wert haben oder beide den falschen.
2. Wenn 1. nicht zutrifft, kann geprüft werden, ob der Wert von Spieler 1 mit dem Vorgabewert übereinstimmt. Wenn ja, hat Spieler 1 gewonnen.
3. Wenn 2. auch nicht zutrifft, hat Spieler 2 gewonnen.


----------



## yuuz11 (6. Jul 2015)

Harry Kane hat gesagt.:


> Spalten berechnen, sondern auch das Ergebnis in der letzten Spalte. Bisher steht da ein "".


das ist mir klar und das ist genau was ich wissen wollte, die Werte unter 4 Spalte werden automatisch durchgeführt ohne Berücksichtigung der  Werte in der Spalten 1,2,3. ich will jetzt in der 4 Spalte Werte erzeugen lassen die die Bedingungen erfüllen,  und die du aufgelistet hast und die mir schon bekannt sind. soll ich vielleicht eine Spalte ausserhalb TabelModel erzeugen lassen oder würde sowas nicht funktionieren?


----------



## Harry Kane (6. Jul 2015)

Was meinst du mit "Spalte ausserhalb TabelModel erzeugen lassen"? Du kannst natürlich Instanzen von javax.swing.table.TableColumn nach Belieben erzeugen, aber "ausserhalb eines TableModels" bringen sie dir gar nix.
Wenn du in der 4. Spalte das Ergebnis der Berechungen anzeigen lassen willst, hast du 2 Möglichkeiten:
1. Wenn du eine neue Zeile erzeugst, berechnest du das Ergebnis in der 4. Zelle nach obiger Formel und verwendest es statt des Leerstrings. Nachteil: wenn du den Wert in den ersten 3 Spalten änderst, müsste sich eventuell auch der Wert in der 3. Spalte ändern.
2. Du speicherst das Ergebnis nicht im TableModel, sondern berechnest es bei jedem Aufruf von getValueAt neu. Dazu musst du in deiner TableModel-Klasse aber getValueAt überschreiben und nicht in deiner MünzwurfSpiel-Klasse implementieren.
Ganz grob würde der Aufbau der getValueAt-Methode ungefähr so aussehen:
1. Wenn columnIndex ungleich 4 ist, gebe den Wert aus DefaultTableModel zurück

```
return super.getValueAt(rowIndex, columnIndex
```
2. Hole für die entsprechende Zeile die Werte aus den ersten drei Spalten
int vorgabe = ((Number)super.getValueAt(rowIndex, 0)).intValue();
int spieler1 = ((Number)super.getValueAt(rowIndex, 1)).intValue();
int spieler2 = ((Number)super.getValueAt(rowIndex, 2)).intValue();
3. Berechne den Ergebnisstring nach der bekannten Formel und gebe ihn zurück.


----------



## yuuz11 (6. Jul 2015)

ich habe deinen Vorschlag gefolgt und habe sowas konstruiert: 

```
public Object getValueAt(int row,int column){

        if(column!=4){
            return super.getValueAt(row, column);

            int vorgabe = (super.getValueAt(row, 0)).intValue();
            int spieler1 = (super.getValueAt(row, 1)).intValue();
            int spieler2 = (super.getValueAt(row, 2)).intValue();
            StringBuilder result = new StringBuilder(3 );
            
                if(vorgabe == spieler1 && vorgabe != spieler2)
                    result.append("Spieler1 gewinnt" );
                else if(vorgabe != spieler1 && vorgabe == spieler2)
                    result.append("Spieler2 gewinnt" );
                else if(vorgabe != spieler1 && vorgabe != spieler2)
                    result.append("unentschieden" );

            return result.toString();
```
stimmt das so ? es kommt nämlich die fehlermeldung: cannot find symbol getValueAt, liegt das vielleucht daran, dass die Methode nicht richtig überschrieben wurde?


----------



## Harry Kane (6. Jul 2015)

Du hast die Methode wieder aus dem Klassenkontext gerissen. Woher soll ich wissen, in welcher Klasse die Methode steht?
Ich vermute aber, dass du die Methode wieder in der MünzwurfSpiel-Klasse implementiert hast. Da gehört sie aber nicht hin. Die getValueAt Methode gehört in eine TableModel-Klasse bzw. die  DefaultTableModel model Variable, die du in deiner statischen randomModel() Methode erzeugst.
Wieviel Zeit hast du bisher mit dem Studium von Grundlagen verbracht, und nach welchem Buch/Tutorial/etc. lernst du?


----------



## yuuz11 (6. Jul 2015)

oh sorry mein fehler 
hier bitte schön :

```
import java.awt.*;
import java.util.Random;

import javax.swing.*;
import javax.swing.table.*;

public class MünzwurfSpiel{
    public static void main( String[] args ){

        TableModel model = randomModel();
        JTable table = new JTable( model );
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>();
        table.setRowSorter( sorter );

        sorter.setModel( model );
        JFrame frame = new JFrame( "Münzwurf" );
        frame.getContentPane().add( new JScrollPane( table ) );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.pack();
        frame.setVisible( true );
    }

    private static TableModel randomModel(){
        Object[] Bezeichnung = { "Vorgabe", "SpielerA", "SpielerB","Ergebniss" };

        DefaultTableModel model = new DefaultTableModel( Bezeichnung, 0 ){
                @Override
                public Class getColumnClass( int column ) {
                    switch( column ){
                        case 0: return Integer.class;
                        case 1: return Integer.class;
                        case 2: return Integer.class;
                        case 3: return String.class;
                        default: return Object.class;
                    }
                }
            };

        Random random = new Random();
        for( int i = 0; i < 10; i++ ){
            Object[] row = {

                    randomInt( random ),randomInt( random ),randomInt( random ),"",

                };

            model.addRow( row );

        }
        return model;
    }

    // Generiert einen zufälligen String
    // Der Wert der Zelle (rowIndex, columnIndex)
    // Generiert einen zufälligen String

    public Object getValueAt(int row,int column){

        if(column!=4){
            return super.getValueAt(row, column);

            int vorgabe = (super.getValueAt(row, 0)).intValue();
            int spieler1 = (super.getValueAt(row, 1)).intValue();
            int spieler2 = (super.getValueAt(row, 2)).intValue();
            StringBuilder result = new StringBuilder(3 );
            for( int i = 0; i < 3; i++ )
                if(vorgabe == spieler1 && vorgabe != spieler2)
                    result.append("Spieler1 gewinnt" );
                else if(vorgabe != spieler1 && vorgabe == spieler2)
                    result.append("Spieler2 gewinnt" );
                else if(vorgabe != spieler1 && vorgabe != spieler2)
                    result.append("unentschieden" );

            return result.toString();}    
    }//Generiert einn zufällige
    private static int randomInt( Random random ){
        return random.nextInt( 2 ) ;
    }


}
```
ich bin sehr frisch in der Programmierwelt und will mich da durchkämpfen


----------



## Harry Kane (6. Jul 2015)

Kämpf dich lieber durch ein Einsteiger-Tutorial.
Deine getValueAt Methode gehört, wie vermutet, immer noch nicht zu deiner TableModel-Klasse, sondern zu deiner MünzwurfSpiel-Klasse, Wie oben schon gesagt: ändere das.
Ausserdem ist dein Code so nicht kompilierbar.


----------



## yuuz11 (6. Jul 2015)

Danke schöne für deine Mühe, sehr nett von dir. ich bleibe am Ball..


----------

