# JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich



## Kanissell (16. Jun 2016)

Hi Leute,

ich find den Fehler bei mir nicht und bitte euch um Hilfe.

ich hab eine JTable in einer extra Klasse getan, weil ich immer auf die zugreifen möchte von verschiedenen Gui´s

Hier erstmal der Code für die Tabelle :


```
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class Cart extends JTable {
  private final JTable table;
  private final Object[] columnNames = {"Auswahl", "Preis"};
  private final Object[][] rowDataInit = {{"Auswahl", "Preis"}};
  private DefaultTableModel model;

  public Cart() {
    table = new JTable();
    model = new DefaultTableModel(rowDataInit, columnNames);
    table.setModel(model);
  }

  public JTable getTable() {
    returnthis.table;
  }

  public DefaultTableModel getDefaultTableModel() {
    returnthis.model;
  }
}
```
Ich möchte nun in verschiedene Gui´s die Tabelle hinzufügen mit .add Funktion von einem JPanel.

(Die sind nicht in einer Klasse)
Das habe ich so gemacht :

```
east.add(new Cart());
```
im JPanel wird das erst gar nicht angezeigt ...
wenn ich nun eine Zeile hinzufügen möchte geht das auch nicht..

```
if (ae.getActionCommand().equals(Commandos.SMALL)) {
  Cart.getDefaultTableModel().addRow(rowData[0]);
  //...
```
da meckert er mir auch, weil eine statische referenz nicht auf eine nicht statische methode ginge..

kann mir jemand da helfen ?


----------



## JCODA (16. Jun 2016)

Du erbst einerseits von JTable, andererseits hast du eine Instanzvariable, die eine JTable ist. Du solltest dich für eines dieser beiden Konzepte entscheiden. 
Vermutlich möchtest du erben. Dann kannst du einfach setModel(model); aufrufen, anstatt auf deiner Instanzvariable.
*Zudem: Verwende die CodeTags ! Einfügen -> Code *


----------



## Kanissell (16. Jun 2016)

hi,

okay danke für den tipp.

eigentlich wollte ich eine instanzvariable nur haben, aber das problem war, damit konnte ich das nicht mit .add einfügen.

wenn ich nur erben würde, dann kann ich die tabelle nicht weiter verwenden von anderen gui´s oder hab ich da was falsch verstanden ?


----------



## JCODA (16. Jun 2016)

Doch, deine Cart-Klasse ist selbst ja dann ein JTable und erbt auch alle Funktionen.


----------



## Kanissell (16. Jun 2016)

ich habe das so jetzt geändert und möchte nun in einer anderen Klasse eine neue Zeile einfügen

Cart.getDefaultTableModel().addRow(rowData[0]);

geht immer noch nicht 

und ich will in allen gui´s die tabelle beibehalten und mit dem erben hab ich doch das problem, das ich nicht getTable() aufrufen kann 

oder hab ich da was falsch verstanden


----------



## JCODA (16. Jun 2016)

Du versuchst gerade mit Klassenname.Methodenname() auf eine Instanzmethode zuzugreifen. 
Allerdings möchtest du Instanzvariable.Methodenname();
versuchs mal so :

```
Cart cartObj = new Cart();
cartObj.getDefaultTableModel().addRow(rowData[0]);
```
und behandle cartObj als JTable, also etwa: east.add(cartObj);


----------



## Kanissell (16. Jun 2016)

Hi,

Danke erstmal. Was ist dann mit den anderen guis die die bestehende Tabelle auch aufrufen, da kann ich ja nicht nochmal mit New .. Ankommen, weil das wieder eine neue jtable erstellt und die alte nicht weiter behält ?

Sorry falls meine Fragen doof klingen


----------



## Kanissell (16. Jun 2016)

Deswegen dachte ich mit der Instanzvariable kann man mit dem Getter immer die gleiche Tabelle auf allen guis aufrufen


----------



## JCODA (16. Jun 2016)

richtig, dann musst du von der Cart-klasse eine Instanzvariable erstellen, sodass du immer noch Zugriff auf das Objekt hast.


----------



## Kanissell (16. Jun 2016)

Wie füge ich dann die Instanzvariable in einem JPanel hinzu ?


----------



## JCODA (16. Jun 2016)

Du deklarierst sie außerhalb von einer Methode. Solltest du diese Tabelle in verschiedenen Klassen benötigen, müsstest du die Tabelle gegebenenfalls dorthin übergeben, per Konstruktor oder einer Setter-Methode.


----------



## Kanissell (16. Jun 2016)

ich habe dieses Klasse Cart eigentlich nur wegen der Instanzvariable erstellt.

dann hab ich gemerkt, dass ich die nicht so hinzufügen kann.

es geht nicht irgendwie die instanzvariable zu behalten in der klasse und die dann zu nutzen oder ?


----------



## Kanissell (16. Jun 2016)

oder kannst du mir zeigen was du meinst ?

ich versteh das nicht so ganz.


----------



## JCODA (16. Jun 2016)

Falls du TeamSpeak und TeamViewer hast, kann ich's dir erklären ~ ich mag eigentlich nicht mehr so viel tippen, .... bin im Channel publ1c4 auf  188.40.2.152


----------



## Kanissell (16. Jun 2016)

kannst du mir vllt ein beispiel geben, ein link oder irgendetwas ?

bin gerade in der bibliothek :/


----------



## JCODA (16. Jun 2016)

was verstehst du unter "alle guis" wie viele hast du ? wie sind die getrennt?


----------



## Kanissell (16. Jun 2016)

habe in einem package 6 guis drin.

5 davon brauchen die table.

alle guis bestehen aus einem jpanel, mit verschiedenen komponenten drin.

alle werden dann in einem jframe gepackt.

also eine gui in einer klasse. alle guis in einem package


----------



## JCODA (16. Jun 2016)

könntest du nicht die JTable im JFrame(*) erstellen und dann an alle Komponenten im Konstruktor als Parameter übergeben ?

(*) oder dort, wo die einzelnen Guis erzeugt werden.


----------



## Kanissell (16. Jun 2016)

könnte ich probieren

dann brauch ich die klasse ja nicht mehr 

ich probierst mal, danke dir aufjedenfall


----------



## Kanissell (16. Jun 2016)

es ist zum verzweifeln..

jetzt beim : 

```
public void actionPerformed(ActionEvent ae) {
        if (ae.getActionCommand().equals(Commandos.SMALL)) {
            table.getModel().addRow(rowData[0]);
            //product.Order.setSize(Size.SMALL);
        }
        else if (ae.getActionCommand().equals(Commandos.MIDDLE)) {
            table.getModel().addRow(rowData[1]);
        }
        else if (ae.getActionCommand().equals(Commandos.BIG)) {
            table.getModel().addRow(rowData[2]);
        }

    }
```

kennt er table nicht, weil table ja nur im konstruktor übergeben wird...


----------



## JCODA (16. Jun 2016)

deswegen speicherst dir in jeder klasse die jtable als instanzvariable


----------



## Kanissell (16. Jun 2016)

dann ist doch die variable nicht überall gleich ?

dachte im Konstruktor einfach jtable übergeben und im JFrame erzeugen..

aber dann kennt das natürlich das olle actionperformed nicht -.-


----------



## JCODA (16. Jun 2016)

doch deswegen übergibst du die table, du hast dann 5 oder 6 variablen, die alle die gleiche Table referenzieren.


----------



## Kanissell (16. Jun 2016)

```
public StartGui() {
        this.setSize(800, 800);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JTabbedPane tabLeiste = new JTabbedPane();
        JTable table = new JTable();
        model = new DefaultTableModel(rowDataInit, columnNames);
        table.setModel(model);
        SizeGui size = new SizeGui(table);
        tabLeiste.addTab("Tab1", size);
        FlavourGui flavour = new FlavourGui(table);
        tabLeiste.addTab("Tab2", flavour);
        ToppingGui topping = new ToppingGui(table);
        tabLeiste.addTab("Tab3", topping);
        SummaryGui summary = new SummaryGui(table);
        tabLeiste.addTab("Tab4", summary);
        PaymentGui payment = new PaymentGui(table);
        tabLeiste.addTab("Tab5", payment);
        this.add(tabLeiste);
    }
```

im JFrame hab ich es erstellt.

jetzt soll ich in jeder Klasse wo die Gui drin ist eine Instanzvariable erstellen vom Typ JTable ?

sicher das alle dann das gleiche referenzieren ?

hier ein kleiner ausschnitt von einer Gui

```
public class SizeGui extends JPanel implements ActionListener {


privatestaticfinal Object[][] rowData = {{"small", "1,50€"}, {"middle", "2,00€"}, {"big", "2,50€"}};


//private JPanel panel = new JPanel();

//set size of panel and add all elements on the right place in layout

public SizeGui(JTable table) {

//north panel with back button

setSize(800, 600);

JPanel north = new JPanel();

JLabel title = new JLabel("Choose your size");

    JButton backButton = new JButton("Back");

this.setLayout(new BorderLayout());

north.setLayout(new BoxLayout(north, BoxLayout.X_AXIS));

north.add(backButton);

north.add(Box.createRigidArea(new Dimension(250,0)));

north.add(title);

this.add(north, BorderLayout.PAGE_START);

//east panel with table, cart, total price

JPanel east = new JPanel();

east.setLayout(new BoxLayout(east, BoxLayout.Y_AXIS));

    JLabel price = new JLabel("Total");

    JLabel cart = new JLabel("Cart");

    east.add(cart);

    east.add(table);

    east.add(price);
```


----------



## JCODA (16. Jun 2016)

Gut so bisher, jetzt noch ne JTable als Instanzattribut und dann die übergeben table merken. 
also etwa this.table = table; <-- innerhalb des Konstruktors.


----------



## Kanissell (16. Jun 2016)

okay ich danke dir aufjedenfall für deine hilfe, ohne dich hätt ich  noch stunden dran sitzen müssen 

hab da noch eine letzte frage :

und zwar eine zeile hinzufügen mit addRow

wie kann ich das machen ?

table.getModel().addRow() geht leider nicht :&


----------



## Kanissell (16. Jun 2016)

ich hab es hinbekommen.. das war eine geburt.

ohne dich wäre es nicht möglich gewesen, ich danke dir vielmals


----------

