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

Kanissell

Mitglied
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 :

Java:
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 :
Java:
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..
Java:
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 ?
 
Zuletzt bearbeitet von einem Moderator:
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
 
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 ?
 
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
 
Du versuchst gerade mit Klassenname.Methodenname() auf eine Instanzmethode zuzugreifen.
Allerdings möchtest du Instanzvariable.Methodenname();
versuchs mal so :
Java:
Cart cartObj = new Cart();
cartObj.getDefaultTableModel().addRow(rowData[0]);
und behandle cartObj als JTable, also etwa: east.add(cartObj);
 
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 🙂
 
richtig, dann musst du von der Cart-klasse eine Instanzvariable erstellen, sodass du immer noch Zugriff auf das Objekt hast.
 
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.
 
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 ?
 
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
 
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
 
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.
 
es ist zum verzweifeln..

jetzt beim :
Code:
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...
 
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 -.-
 
Code:
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
Code:
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);
 
Zuletzt bearbeitet:
Gut so bisher, jetzt noch ne JTable als Instanzattribut und dann die übergeben table merken.
also etwa this.table = table; <-- innerhalb des Konstruktors.
 
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 :&
 

Zurück
Oben