# Warum ist die Spalte weg?



## NochNixBlicker (9. Aug 2016)

Die Spalte 'Bezeichnung bzw. AK' wird nicht angezeigt, warum? Oder bin ich noch nicht wirklich wach?


```
public class TriBsp extends JPanel {

   /**
    *
    */
   private static final long serialVersionUID = -6671920676546497516L;

   public TriBsp() {
    String rowData[][] = { { "x-MAN", "3860", "0,8762", "0,153", "198", "Ironman-Langdistanz (DTU Langdistanz)" },
    { "x-MAN", "1900", "0,7858", "0,1446", "195", "Ironman-Half" },
    { "LM", "1500", "0,867", "0,1689", "99",
    "DTU-Junioren-Triathlon lang (18-19) - DTU-Elite-Triathlon (18-19) - DTU-AK20++ kurz (20-99) - ITU-Kurzdistanz (olympische Distanz) - Jedermann" },
    { "LM", "750", "0,9109", "0,1845", "27",
    "DTU-Jugend-Triathlon A (16-17) - DTU-Junioren-Triathlon kurz (18-19) - ITU-Sprintdistanz - Schnupper" },
    { "BL", "1500", "1,0593", "0,157", "50",
    "DTU-Junioren-Triathlon lang (18-19) - DTU-Elite-Triathlon (18-19) - DTU-AK20++ kurz (20-99) - ITU-Kurzdistanz (olympische Distanz) - Jedermann" },
    { "BL", "750", "0,984", "0,2327", "38",
    "DTU-Jugend-Triathlon A (16-17) - DTU-Junioren-Triathlon kurz (18-19) - ITU-Sprintdistanz - Schnupper" },
    { "BL", "400", "1,0057", "0,1889", "22",
    "DTU-Schüler-Triathlon A (12-13) - DTU-Jugend-Triathlon B (14-15) - DTU Fitness" },
    { "BL", "200", "0,6951", "0,0855", "4", "DTU-Schüler-Triathlon B (10-11)" },
    { "BL", "100", "0,4266", "0,0741", "4", "DTU-Schüler-Triathlon C (8-9)" },
    { "BL/LL", "1500", "2,7244", "0,1614", "11",
    "DTU-Junioren-Triathlon lang (18-19) - DTU-Elite-Triathlon (18-19) - DTU-AK20++ kurz (20-99) - ITU-Kurzdistanz (olympische Distanz) - Jedermann" },
    { "BL/LL", "750", "1,2424", "0,2117", "69",
    "DTU-Jugend-Triathlon A (16-17) - DTU-Junioren-Triathlon kurz (18-19) - ITU-Sprintdistanz - Schnupper" },
    { "BL/LL", "400", "1,0225", "0,1637", "77",
    "DTU-Schüler-Triathlon A (12-13) - DTU-Jugend-Triathlon B (14-15) - DTU Fitness" },
    { "BL/LL", "200", "0,5373", "0,0514", "40", "DTU-Schüler-Triathlon B (10-11)" },
    { "LL/KL/RL", "2000", "0,8676", "0,151", "755", "DTU-AK20++ mittel (20-99)" },
    { "LL/KL/RL", "1500", "0,8115", "0,172", "2079",
    "DTU-Junioren-Triathlon lang (18-19) - DTU-Elite-Triathlon (18-19) - DTU-AK20++ kurz (20-99) - ITU-Kurzdistanz (olympische Distanz) - Jedermann" },
    { "LL/KL/RL", "750", "0,7209", "0,1731", "1672",
    "DTU-Jugend-Triathlon A (16-17) - DTU-Junioren-Triathlon kurz (18-19) - ITU-Sprintdistanz - Schnupper" },
    { "LL/KL/RL", "400", "0,3002", "0,0455", "244",
    "DTU-Schüler-Triathlon A (12-13) - DTU-Jugend-Triathlon B (14-15) - DTU Fitness" },
    { "LL/KL/RL", "200", "0,8977", "0,1992", "39", "DTU-Schüler-Triathlon B (10-11)" } };
    String columnNames[] = { "Liga", "Strecke", "mue", "sigma", "n", "Bezeichnung bzw AK" };

    DefaultTableModel model = new DefaultTableModel(rowData, columnNames);
    JTable table = new JTable(model);
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

    DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer();
    rightRenderer.setHorizontalAlignment(JLabel.RIGHT);
    table.getColumnModel().getColumn(4).setCellRenderer(rightRenderer);

    final int INDEX_COLUMN1 = 0;
    TableColumn col = table.getColumnModel().getColumn(INDEX_COLUMN1);
    col.setPreferredWidth(150);

    final int INDEX_COLUMN2 = 1;
    TableColumn col2 = table.getColumnModel().getColumn(INDEX_COLUMN2);
    col2.setPreferredWidth(80);
    table.getColumnModel().getColumn(1).setCellRenderer(rightRenderer);

    final int INDEX_COLUMN3 = 2;
    TableColumn col3 = table.getColumnModel().getColumn(INDEX_COLUMN3);
    col3.setPreferredWidth(80);
    table.getColumnModel().getColumn(2).setCellRenderer(rightRenderer);

    final int INDEX_COLUMN4 = 3;
    TableColumn col4 = table.getColumnModel().getColumn(INDEX_COLUMN4);
    col4.setPreferredWidth(80);
    table.getColumnModel().getColumn(3).setCellRenderer(rightRenderer);

    final int INDEX_COLUMN5 = 4;
    TableColumn col5 = table.getColumnModel().getColumn(INDEX_COLUMN5);
    col5.setPreferredWidth(60);
    table.getColumnModel().getColumn(4).setCellRenderer(rightRenderer);

    final int INDEX_COLUMN6 = 5;
    TableColumn col6 = table.getColumnModel().getColumn(INDEX_COLUMN6);
    col6.setPreferredWidth(700);

    this.add(table);
     
     table.setBounds(5, 20, 900, 270);
     table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
     table.setColumnSelectionAllowed(false);
     table.setRowSelectionAllowed(true);

     table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
     
     JScrollPane scrollPane = new JScrollPane(table);
     scrollPane.setBounds(10, 10, 1038, 311);

     this.add(scrollPane);
     table.setFillsViewportHeight(true);
     scrollPane.setViewportView(table);
   }
```


----------



## Meniskusschaden (9. Aug 2016)

Bei mir wird es angezeigt. Vielleicht ist dein Frame zu klein, so dass du scrollen musst oder etwas Ähnliches.


----------



## Saheeda (9. Aug 2016)

@NochNixBlicker 

Kleiner Tipp: Wenn das mehr wird, als nur n bisschen Rumgespiele, solltest du überlegen, die Daten in einer Datenbank oder einer Datei abzulegen. Das macht beim Einrichten erstmal ein etwas mehr Arbeit, hilft aber auf Dauer, alles sauber und lesbar zu gestalten.


----------



## NochNixBlicker (9. Aug 2016)

Danke Saheeda, meine Progerfahrung habe ich autodidakt mit VBA erworben in MS Access.


----------



## Harry Kane (9. Aug 2016)

Noch'n paar weitere Kommentare:
1. Packe die Daten aus deinem String[][] array in Objekte. Die einzelnen Arrays scheinen so etwas wie Veranstaltungsdaten für Sportevents darzustellen. Aus dem String[][] würde dann z. B. ein SportEvent[].
2. Du setzt kein Layout in der TriBsp-Klasse. Deshalb müsste ein FlowLayout verwendet werden (der default LayoutManager eines JPanels). Und dann sind die Aufrude von setBounds() wirkungslos.
3. Du addest die table direkt dem JPanel und verwendest sie auch als viewport der JScrollPane, die dann auch dem TriBsp hinzugefügt wird. Dieses Vorgehen erschliesst sich mit überhaupt nicht.


----------



## NochNixBlicker (9. Aug 2016)

Geht dann auch SportEvent[][]? Mit verschiedenen Datentypen der Spalten, ich meine ja?
OK
Das Forum ist schuld ;-)


----------



## Saheeda (9. Aug 2016)

Dein Objekt wäre dann quasi die zweite Dimension. Du müsstest dir nicht mehr merken, in welchem Feld welche Eigenschaft steht, sonst könntest direkt auf dem Objekt so was wie sportevent.getTitle() aufrufen.
Und ja, in dem Objekt kannst du beliebig viele verschiedene Datentypen kapseln.


----------



## Harry Kane (9. Aug 2016)

NochNixBlicker hat gesagt.:


> Geht dann auch SportEvent[][]? Mit verschiedenen Datentypen der Spalten, ich meine ja?


Bei einem SportEvent[][] hast du keine verschiedenen Datentypen in den Spalten.
Saheeda und ich meinen so etwas:

```
public class PersonTableDemo {

  public static void main(String[] args) {
  JFrame frame = new JFrame("Person Table");
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  CustomerTableModel ctm = new CustomerTableModel();
  ctm.addCustomer(new Customer(48, "Irgend Jemand Reiches", true));
  ctm.addCustomer(new Customer(4, "Klein Fritzchen", false));
  ctm.addCustomer(new Customer(32, "Chef vom Dienst", true));
  ctm.addCustomer(new Customer(53, "Arme Socke", false));
  frame.getContentPane().add(new JScrollPane(new JTable(ctm)));
  frame.pack();
  frame.setVisible(true);

  }

  static class CustomerTableModel extends AbstractTableModel {

  private ArrayList<Customer> customers = new ArrayList<Customer>();

  private String[] columns = new String[]{"Name", "Alter", "Guter Kunde ?"};

  public void addCustomer(Customer c) {
  customers.add(c);
  super.fireTableDataChanged();
  }

  public int getRowCount() {
  return customers.size();
  }

  public int getColumnCount() {
  return columns.length;
  }

  public boolean isCellEditable(int row, int column) {
  return true;
  }

  public String getColumnName(int column) {
  return columns[column];
  }

  public Class getColumnClass(int column) {
  if (column == 2) {
  return Boolean.class;
  }
  return super.getColumnClass(column);
  }

  public Object getValueAt(int row, int column) {
  Customer c = customers.get(row);
  switch (column) {
  case 0:
  return c.getName();
  case 1:
  return c.getAge();
  case 2:
  return c.isGoodCustomer();
  default:
  return null;
  }
  }

  public void setValueAt(Object o, int row, int column) {
  Customer c = customers.get(row);
  switch (column) {
  case 0:
  c.setName(o.toString());
  break;
  case 1:
  int age = 0;
  if (o instanceof Number) {
  age = ((Number) o).intValue();
  } else {
  age = Integer.parseInt(o.toString());
  }
  c.setAge(age);
  break;
  case 2:
  boolean good = false;
  if (o instanceof Boolean) {
  good = ((Boolean) o).booleanValue();
  } else {
  good = Boolean.parseBoolean(o.toString());
  }
  c.setGoodCustomer(good);
  }
  }
  }

  static class Customer {

  private int age;
  private String name;
  private boolean goodCustomer;

  public Customer(int age, String name, boolean goodCustomer) {
  this.age = age;
  this.name = name;
  this.goodCustomer = goodCustomer;
  }

  public void setAge(int age) {
  System.out.println("Age changed to " + String.valueOf(age));
  this.age = age;
  }

  public int getAge() {
  return this.age;
  }

  public void setName(String name) {
  System.out.println("Name changed to " + name);
  this.name = name;
  }

  public String getName() {
  return this.name;
  }

  public void setGoodCustomer(boolean g) {
  System.out.println("Goodness changed to " + g);
  this.goodCustomer = g;
  }

  public boolean isGoodCustomer() {
  return this.goodCustomer;
  }

  }
}
```


----------



## NochNixBlicker (9. Aug 2016)

Danke für das Coden - muss ich Morgen früh gleich probieren - Gut N8!


----------



## NochNixBlicker (11. Aug 2016)

Hab es probiert, aber irgendwo ist ein Fehler drin?


```
package einsatz;

import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

public class TriSdwBsp {

   public static void main(String[] args) {
     JFrame frame = new JFrame("Richtwerte für sigma und mue");
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.setLocation(200,100);
     WettkampfTableModel wktm = new WettkampfTableModel();
     wktm.addWettkampf(new Wettkampf(1500, 48, "LL", "w35", 0.2569, 0.0257));
     wktm.addWettkampf(new Wettkampf(1500, 4, "LL", "m50", 0.0689, 6.4879));
     wktm.addWettkampf(new Wettkampf(3800, 32, "BL", "w30", 0.8931, 1.4863));
     wktm.addWettkampf(new Wettkampf(3800, 53, "BL", "m20", 0.4659, 0.0256));
     frame.getContentPane().add(new JScrollPane(new JTable(wktm)));
     frame.pack();
     frame.setVisible(true);

   }

   static class WettkampfTableModel extends AbstractTableModel {

     private ArrayList<Wettkampf> wettkaempfe = new ArrayList<Wettkampf>();

     private String[] columns = new String[] { "Strecke", "n", "Liga",  "Bezeichnung bzw AK", "mue", "sigma" };

     public void addWettkampf(Wettkampf c) {
       wettkaempfe.add(c);
       super.fireTableDataChanged();
     }

     public int getRowCount() {
       return wettkaempfe.size();
     }

     public int getColumnCount() {
       return columns.length;
     }

     public boolean isCellEditable(int row, int column) {
       return false;
     }

     public String getColumnName(int column) {
       return columns[column];
     }

     public Class getColumnClass(int column) {
       if (column == 2) {
         return Boolean.class;
       }
       return super.getColumnClass(column);
     }

     public Object getValueAt(int row, int column) {
       Wettkampf wk = wettkaempfe.get(row);
       switch (column) {
       case 1:
         return wk.getStrecke();
       case 2:
         return wk.getSigma();
       case 3:
         return wk.getMue();         
       default:
         return null;
       }
     }
   }

   static class Wettkampf {

     private int strecke,  n;
     private String liga, bezbzwak;
     private Double mue, sigma;

     public Wettkampf(int strecke, int n, String liga, String bezbzwak, Double mue, Double sigma) {
       this.strecke = strecke;
       this.liga = liga;
       this.mue = mue;
     }

     public int getStrecke() {
       return this.strecke;
     }


     public String getSigma() {
       return this.liga;
     }

     public Double getMue() {
       return this.mue;
     }

   }
}
```


----------



## Joose (11. Aug 2016)

NochNixBlicker hat gesagt.:


> ... aber irgendwo ist ein Fehler drin?


Fragst du uns ob ein Fehler drinnen ist? Oder willst du uns nur mitteilen das einer drinnen ist?
Was funktioniert denn nicht? Beschreibe den Fehler wenigstens.


----------



## NochNixBlicker (11. Aug 2016)

Entschuldige bitte, aber mein Mutter quält mich gerade mit so wichtigen Dingen, wie saugen. Von daher war ich nicht ganz bei der Sache:


```
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
   at javax.swing.JTable$BooleanRenderer.getTableCellRendererComponent(Unknown Source)
   at javax.swing.JTable.prepareRenderer(Unknown Source)
   at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
   at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
   at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
   at javax.swing.plaf.ComponentUI.update(Unknown Source)
   at javax.swing.JComponent.paintComponent(Unknown Source)
   at javax.swing.JComponent.paint(Unknown Source)
   at javax.swing.JComponent.paintChildren(Unknown Source)
   at javax.swing.JComponent.paint(Unknown Source)
   at javax.swing.JViewport.paint(Unknown Source)
   at javax.swing.JComponent.paintChildren(Unknown Source)
   at javax.swing.JComponent.paint(Unknown Source)
   at javax.swing.JComponent.paintChildren(Unknown Source)
   at javax.swing.JComponent.paint(Unknown Source)
   at javax.swing.JComponent.paintChildren(Unknown Source)
   at javax.swing.JComponent.paint(Unknown Source)
   at javax.swing.JLayeredPane.paint(Unknown Source)
   at javax.swing.JComponent.paintChildren(Unknown Source)
   at javax.swing.JComponent.paintToOffscreen(Unknown Source)
   at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
   at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
   at javax.swing.RepaintManager.paint(Unknown Source)
   at javax.swing.JComponent.paint(Unknown Source)
   at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)
   at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
   at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
   at java.awt.Container.paint(Unknown Source)
   at java.awt.Window.paint(Unknown Source)
   at javax.swing.RepaintManager$4.run(Unknown Source)
   at javax.swing.RepaintManager$4.run(Unknown Source)
   at java.security.AccessController.doPrivileged(Native Method)
   at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
   at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
   at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
   at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
   at javax.swing.RepaintManager.access$1200(Unknown Source)
   at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
   at java.awt.event.InvocationEvent.dispatch(Unknown Source)
   at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
   at java.awt.EventQueue.access$500(Unknown Source)
   at java.awt.EventQueue$3.run(Unknown Source)
   at java.awt.EventQueue$3.run(Unknown Source)
   at java.security.AccessController.doPrivileged(Native Method)
   at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
   at java.awt.EventQueue.dispatchEvent(Unknown Source)
   at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
   at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
   at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
   at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
   at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
   at java.awt.EventDispatchThread.run(Unknown Source)
```


----------



## Joose (11. Aug 2016)

Die Fehlermeldung sagt doch schon alles aus. Es wird versucht einen String in ein Boolean umzuwandeln, was aber nicht klappt.

In deinem Code hast du folgenden Code:

```
........
     WettkampfTableModel wktm = new WettkampfTableModel();
     wktm.addWettkampf(new Wettkampf(1500, 48, "LL", "w35", 0.2569, 0.0257));
     wktm.addWettkampf(new Wettkampf(1500, 4, "LL", "m50", 0.0689, 6.4879));
     wktm.addWettkampf(new Wettkampf(3800, 32, "BL", "w30", 0.8931, 1.4863));
     wktm.addWettkampf(new Wettkampf(3800, 53, "BL", "m20", 0.4659, 0.0256));

..........

     public Class getColumnClass(int column) {
       if (column == 2) {
         return Boolean.class;
       }
       return super.getColumnClass(column);
     }

..........
```
In der 2.Spalte sollen sich boolean Werte befinden -> sprich true oder false
Bei deinem Model oben sehen ich keine Daten welche einem Boolean entsprechen würden. Was soll deiner Meinung nach in ein Boolean umgewandelt werden?


----------



## NochNixBlicker (11. Aug 2016)

Jetzt wo du es sagst, fällt es mir wie Schuppen von den Augen. Harry hatte für mich ja ein Beispiel geproggt, da habe ich dann die Passage nicht gelöscht. Nich wirklich intelligent - reicht es einfach diese Klasse zu löschen?


----------



## NochNixBlicker (11. Aug 2016)

Danke - schon weg!


----------



## Joose (11. Aug 2016)

NochNixBlicker hat gesagt.:


> Harry hatte für mich ja ein Beispiel geproggt, da habe ich dann die Passage nicht gelöscht. Nich wirklich intelligent


Man sollte nie etwas einfach mit Copy&Paste übernehmen


----------



## NochNixBlicker (11. Aug 2016)

Hab jetz das aber warum wird mir n überall als 0, die Bezeichnung und sigma  gar nicht


```
package einsatz;

import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

public class TriSdwBsp {

   public static void main(String[] args) {
     JFrame frame = new JFrame("Richtwerte für sigma und mue");
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.setLocation(200,100);
     WettkampfTableModel wktm = new WettkampfTableModel();
     wktm.addWettkampf(new Wettkampf(1500, 48, "LL", "w35", 0.2569, 0.0257));
     wktm.addWettkampf(new Wettkampf(1500, 4, "LL", "m50", 0.0689, 6.4879));
     wktm.addWettkampf(new Wettkampf(3800, 32, "BL", "w30", 0.8931, 1.4863));
     wktm.addWettkampf(new Wettkampf(3800, 53, "BL", "m20", 0.4659, 0.0256));
     frame.getContentPane().add(new JScrollPane(new JTable(wktm)));
     frame.pack();
     frame.setVisible(true);

   }

   static class WettkampfTableModel extends AbstractTableModel {

     /**
      *
      */
     private static final long serialVersionUID = 1L;

     private ArrayList<Wettkampf> wettkaempfe = new ArrayList<Wettkampf>();

     private String[] columns = new String[] { "Strecke", "n", "Liga",  "Bezeichnung bzw AK", "mue", "sigma" };

     public void addWettkampf(Wettkampf c) {
       wettkaempfe.add(c);
       super.fireTableDataChanged();
     }

     public int getRowCount() {
       return wettkaempfe.size();
     }

     public int getColumnCount() {
       return columns.length;
     }

     public boolean isCellEditable(int row, int column) {
       return false;
     }

     public String getColumnName(int column) {
       return columns[column];
     }

     public Object getValueAt(int row, int column) {
       Wettkampf wk = wettkaempfe.get(row);
       switch (column) {
       case 0:
         return wk.getStrecke();
       case 1:
         return wk.n;
       case 2:
         return wk.getLiga();
       case 3:
         return wk.getBezbzwak();
       case 4:
         return wk.getMue();
       case 5:
         return wk.getSigma();
       default:
         return null;
       }
     }
   }

   static class Wettkampf {

     private int strecke,  n;
     private String liga, bezbzwak;
     private Double mue, sigma;

     public Wettkampf(int strecke, int n, String liga, String bezbzwak, Double mue, Double sigma) {
       this.strecke = strecke;
       this.liga = liga;
       this.mue = mue;
     }

     public int getStrecke() {
       return this.strecke;
     }

     public int getN(){
       return this.n;
     }

     public String getLiga(){
       return this.liga;
     }
     
     public String getBezbzwak(){
       return this.bezbzwak;
     }
     public Double getSigma() {
       return this.sigma;
     }

     public Double getMue() {
       return this.mue;
     }
   }
}
[]
```


----------



## Joose (11. Aug 2016)

NochNixBlicker hat gesagt.:


> Hab jetz das aber warum wird mir n überall als 0, die Bezeichnung und sigma  gar nicht


"gar nicht .." was? 

Weil du es so geschrieben bzw. zusammenkopiert hast

```
static class Wettkampf {

     private int strecke,  n;
     private String liga, bezbzwak;
     private Double mue, sigma;

     public Wettkampf(int strecke, int n, String liga, String bezbzwak, Double mue, Double sigma) {
       this.strecke = strecke;
       this.liga = liga;
       this.mue = mue;
     }
.....
```
Welchen Wert bekommt den das Instanzattribut "n" gesetzt?


----------



## NochNixBlicker (11. Aug 2016)

n soll die Anzahl sein, ist hier maximal zweistellig
Aber habe mittlerweile alles so wie ich es will. Danke - schönen Abend!


----------



## NochNixBlicker (11. Aug 2016)

Jetzt hab ich doch noch ne Frag, warum will Eclipse wenn ich die App laufen lassen, irgendwas mit Ameisen (ants)?


```
import java.awt.EventQueue;
import java.awt.event.*;
import javax.swing.*;
import einsatz.Tri;

public class GIzEH implements ActionListener {

   private JFrame frmGizeh;

   /**
    * Launch the application.
    */
   public static void main(String[] args) {
     EventQueue.invokeLater(new Runnable() {
       public void run() {
         try {
           GIzEH window = new GIzEH();
           window.frmGizeh.setVisible(true);
           // ClassLoader cl = this.getClass().getClassLoader();
         } catch (Exception e) {
           e.printStackTrace();
         }
       }
     });
   }

   /**
    * Create the application.
    */
   public GIzEH() {
     initComponents();
   }

   private void initComponents() // Creating and initializing components
   {
     frmGizeh = new JFrame();
     frmGizeh.setTitle("GIzEH 3.0");

     // frmGizeh.setIconImage(Toolkit.getDefaultToolkit().getImage(
     // CIzEH.class.getResource("/res/GIzEH.ico")));
     frmGizeh.setBounds(100, 100, 670, 368);
     frmGizeh.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

     JMenuBar menuBar = new JMenuBar();
     frmGizeh.setJMenuBar(menuBar);

     // Datei

     JMenu mndatei = new JMenu("Datei");
     menuBar.add(mndatei);

     JMenuItem mntmUpdateErzwingen = new JMenuItem("Update erzwingen");
     mndatei.add(mntmUpdateErzwingen);
     mntmUpdateErzwingen.addActionListener(this);

     JMenuItem mntmEinstellungen = new JMenuItem("Einstellungen");
     mndatei.add(mntmEinstellungen);
     mntmEinstellungen.addActionListener(this);

     JMenuItem mntmBenutzerwechsel = new JMenuItem("Benutzerwechsel");
     mndatei.add(mntmBenutzerwechsel);
     mntmBenutzerwechsel.addActionListener(this);

     mndatei.addSeparator();

     JMenuItem mntmBeenden = new JMenuItem("Beenden");
     mntmBeenden.addActionListener(this);
     mndatei.add(mntmBeenden);

     // Einsatz

     JMenu mnEinsatz = new JMenu("Einsatz");
     menuBar.add(mnEinsatz);

     // *############################################################*/
     JMenuItem mntmSichern = new JMenuItem("Sichern");
     mnEinsatz.add(mntmSichern);
     mntmSichern.addActionListener(this);
     mntmSichern.setActionCommand("Sichern");

     JMenuItem mntmRetten = new JMenuItem("Retten");
     mnEinsatz.add(mntmRetten);
     mntmRetten.addActionListener(this);
     mntmRetten.setActionCommand("Retten");

     // *############################################################*/

     JMenuItem mntmBergen = new JMenuItem("Bergen");
     mnEinsatz.add(mntmBergen);
     mntmBergen.addActionListener(this);

     // ?

     JMenu mn = new JMenu("?");
     menuBar.add(mn);

     JMenuItem mntmInhaltUndIndex = new JMenuItem("Inhalt und Index");
     mn.add(mntmInhaltUndIndex);
     mntmInhaltUndIndex.addActionListener(this);

     JMenuItem mntmVerursacher = new JMenuItem("Verursacher");
     mn.add(mntmVerursacher);
     mntmVerursacher.addActionListener(this);

     JPanel panel = new JPanel();

     panel.setLayout(null);
   }

   @Override
   public void actionPerformed(ActionEvent e) {
     if (e.getActionCommand().equals("Sichern")) {
       System.out.println("Sichern wurde gedrückt");
       Tri dialog = new Tri();
     } else if (e.getActionCommand().equals("Retten")) {
       System.out.println("Retten wurde gedrückt");
     } else if (e.getActionCommand().equals("Bergen")) {
       System.out.println("Bergen wurde gedrückt");
     } else if (e.getActionCommand().equals("Beenden")) {
       exit();
     }
   }

   public void exit() {
     int result = JOptionPane.showConfirmDialog(null, "Möchten Sie das Programm beenden?", "Programm beenden",
         JOptionPane.YES_NO_OPTION);
     switch (result) {
     case JOptionPane.YES_OPTION:
       System.exit(0); // Aktion(en) bei Klicken auf den "Ja-Button"
     }
   }
}
```


```
package einsatz;

import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

public class TriSdwBsp {

   public static void main(String[] args) {
     JFrame frame = new JFrame("Richtwerte für sigma und mue");
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.setLocation(200, 100);
     WettkampfTableModel wktm = new WettkampfTableModel();
     wktm.addWettkampf(new Wettkampf(1500, 48, "LL", "olympisch", 0.2569, 0.0257));
     wktm.addWettkampf(new Wettkampf(1500, 4, "LL", "olympisch", 0.0689, 6.4879));
     wktm.addWettkampf(new Wettkampf(3800, 32, "BL", "lang", 0.8931, 1.4863));
     wktm.addWettkampf(new Wettkampf(3800, 53, "BL", "lang", 0.4659, 0.0256));
     frame.getContentPane().add(new JScrollPane(new JTable(wktm)));
     frame.pack();
     frame.setVisible(true);

   }

   static class WettkampfTableModel extends AbstractTableModel {

     /**
      *
      */
     private static final long serialVersionUID = 1L;

     private ArrayList<Wettkampf> wettkaempfe = new ArrayList<Wettkampf>();

     private String[] columns = new String[] { "Strecke", "n", "Liga", "Bezeichnung", "mue", "sigma" };

     public void addWettkampf(Wettkampf c) {
       wettkaempfe.add(c);
       super.fireTableDataChanged();
     }

     public int getRowCount() {
       return wettkaempfe.size();
     }

     public int getColumnCount() {
       return columns.length;
     }

     public boolean isCellEditable(int row, int column) {
       return false;
     }

     public String getColumnName(int column) {
       return columns[column];
     }

     public Object getValueAt(int row, int column) {
       Wettkampf wk = wettkaempfe.get(row);
       switch (column) {
       case 0:
         return wk.getStrecke();
       case 1:
         return wk.n;
       case 2:
         return wk.getLiga();
       case 3:
         return wk.getBezbzwak();
       case 4:
         return wk.getMue();
       case 5:
         return wk.getSigma();
       default:
         return null;
       }
     }
   }

   static class Wettkampf {

     private int strecke, n;
     private String liga, bezbzwak;
     private Double mue, sigma;

     public Wettkampf(int strecke, int n, String liga, String bezbzwak, Double mue, Double sigma) {
       this.strecke = strecke;
       this.liga = liga;
       this.mue = mue;
       this.sigma = sigma;
       this.bezbzwak = bezbzwak;
       this.n = n;
     }

     public int getStrecke() {
       return this.strecke;
     }

     public int getN() {
       return this.n;
     }

     public String getLiga() {
       return this.liga;
     }

     public String getBezbzwak() {
       return this.bezbzwak;
     }

     public Double getSigma() {
       return this.sigma;
     }

     public Double getMue() {
       return this.mue;
     }
   }
}
```


----------



## Meniskusschaden (11. Aug 2016)

NochNixBlicker hat gesagt.:


> Jetzt hab ich doch noch ne Frag, warum will Eclipse wenn ich die App laufen lassen, irgendwas mit Ameisen (ants)?


Verstehe nicht, was du meinst. Was will Eclipse denn mit Ameisen? Vielleicht benutzt du das Build-Tool Ant. Hast du eine build.xml im Projekt und falls ja: warum?


----------



## NochNixBlicker (11. Aug 2016)

Meine ich ja, aber: Wie lösche ich das File?

Und sollte der tableRenderer nich automatisch erkennen, ob Zahlen in einem Feld sind oder nicht?


----------



## NochNixBlicker (11. Aug 2016)

Hat sich erledigt - danke!


----------



## NochNixBlicker (11. Aug 2016)

Wie steuere ich die Breite der Spalten?


----------



## Nuiton (11. Aug 2016)

Ich nehme an du meinst deinen JTable.

```
column.setPreferredWidth(...);
```


----------



## NochNixBlicker (11. Aug 2016)

Und wo packe ich das hier in der Code rein?
Und warum werden die Zahlen nicht einfach rechts ausgerichtet?


```
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

public class TriSdwBsp {

   public static void main(String[] args) {
     JFrame frame = new JFrame("Richtwerte für sigma und mue");
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.setLocation(200, 100);
     WettkampfTableModel wktm = new WettkampfTableModel();
     wktm.addWettkampf(new Wettkampf(1500, 48, "LL", "olympisch", 0.2569, 0.0257));
     wktm.addWettkampf(new Wettkampf(1500, 4, "LL", "olympisch", 0.0689, 6.4879));
     wktm.addWettkampf(new Wettkampf(3800, 32, "BL", "lang", 0.8931, 1.4863));
     wktm.addWettkampf(new Wettkampf(3800, 53, "BL", "lang", 0.4659, 0.0256));
     frame.getContentPane().add(new JScrollPane(new JTable(wktm)));
     frame.pack();
     frame.setVisible(true);
   }

   static class WettkampfTableModel extends AbstractTableModel {

     /**
      *
      */
     private static final long serialVersionUID = 1L;

     private ArrayList<Wettkampf> wettkaempfe = new ArrayList<Wettkampf>();

     private String[] columns = new String[] { "Strecke", "n", "Liga", "Bezeichnung", "mue", "sigma" };

     public void addWettkampf(Wettkampf wk) {
       wettkaempfe.add(wk);
       super.fireTableDataChanged();
     }

     public int getRowCount() {
       return wettkaempfe.size();
     }

     public int getColumnCount() {
       return columns.length;
     }

     public boolean isCellEditable(int row, int column) {
       return false;
     }

     public String getColumnName(int column) {
       return columns[column];
     }

     public Object getValueAt(int row, int column) {
       Wettkampf wk = wettkaempfe.get(row);
       switch (column) {
       case 0:
         return wk.getStrecke();
       case 1:
         return wk.n;
       case 2:
         return wk.getLiga();
       case 3:
         return wk.getBezbzwak();
       case 4:
         return wk.getMue();
       case 5:
         return wk.getSigma();
       default:
         return null;
       }
     }
   }

   static class Wettkampf {

     private int strecke, n;
     private String liga, bezbzwak;
     private Double mue, sigma;

     public Wettkampf(int strecke, int n, String liga, String bezbzwak, Double mue, Double sigma) {
       this.strecke = strecke;
       this.liga = liga;
       this.mue = mue;
       this.sigma = sigma;
       this.bezbzwak = bezbzwak;
       this.n = n;
     }

     public int getStrecke() {
       return this.strecke;
     }

     public int getN() {
       return this.n;
     }

     public String getLiga() {
       return this.liga;
     }

     public String getBezbzwak() {
       return this.bezbzwak;
     }

     public Double getSigma() {
       return this.sigma;
     }

     public Double getMue() {
       return this.mue;
     }
   }
}

[/]
```


----------



## Nuiton (11. Aug 2016)

Du sollst das mal versuchen alleine hinzubekommen. In deinem Code erstellst du direkt eine neue Tabelle ohne irgendeine Referenz zu der Tabelle zu haben - das ist schlechter Stil. Ich meine damit diese Line:

```
frame.getContentPane().add(newJScrollPane(new JTable(wktm)));
```
Wie du siehst, kann dein JTable kann ueberhaupt nicht erweitert werden, weil du direkt einen erstellst, i.e. new JTable(...).
Am besten legst du deine Tabelle so an, dass du auch immer wieder darauf zugreifen kannst, wie z.B.

```
JTable myTable = new JTable(wktm);
```
Das einzige, was du jetzt nocht benoetigst, ist jetzt die Breite deiner Spalten. Wenn du z.B. die erste Spalte (bzw. Spalte '0') in einer bestimmten Breite moechtest, wie z.B. 300 Pixel, schreibst du folgendes:

```
myTable.getColumnModel().getColumn(0).setPreferredWidth(300);
```
Den Rest musst du schon alleine hinbekommen.

Um den Text in deinen Spalten "rechts" anzuzeigen, benutzt du am besten einen TableCellRenderer.


----------



## NochNixBlicker (12. Aug 2016)

Ich dachte jetzt mit diesem Code erzeuge ich zuerst ein Fenster...

```
public static void main(String[] args) {
     JFrame frame = new JFrame("Richtwerte für sigma und mue");
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.setLocation(200, 100);
```
...dann werden die Daten gemäß TableModel geschrieben

```
WettkampfTableModel wktm = new WettkampfTableModel();
     wktm.addWettkampf(new Wettkampf(1500, 48, "LL", "olympisch", 0.2569, 0.0257));
     wktm.addWettkampf(new Wettkampf(1500, 4, "LL", "olympisch", 0.0689, 6.4879));
     wktm.addWettkampf(new Wettkampf(3800, 32, "BL", "lang", 0.8931, 1.4863));
     wktm.addWettkampf(new Wettkampf(3800, 53, "BL", "lang", 0.4659, 0.0256));
```
...und dann wird die Tabelle in ein ScrollPane gepackt und das Fenster wird sichtbar gemacht

```
frame.getContentPane().add(new JScrollPane(new JTable(wktm)));
     frame.pack();
     frame.setVisible(true);
   }
```

Lag ich da falsch?


----------



## Joose (12. Aug 2016)

Nein das passiert ja auch oder?

Das Problem du willst nun noch die Weite/Breite von Spalten usw. ändern ... dazu brauchst du aber Zugriff auf das JTable Objekt.
Welchen du aber nicht hast, da du die Referenz darauf in keiner Variable gespeichert hast. Mach es doch wie Nuiton schon gezeigt hat


----------



## NochNixBlicker (12. Aug 2016)

Nein, leider nicht! Hier mal der gesamte Code:

```
package einsatz;

import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;

public class TriSdwBsp {

   public static void main(String[] args) {
     JFrame frame = new JFrame("Richtwerte für sigma und mue");
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.setLocation(200, 100);
```
Ich dachte dass ich hier NUR das Modell für die Tabelle erstelle  und sie mit Daten fülle

```
WettkampfTableModel wktm = new WettkampfTableModel();
     wktm.addWettkampf(new Wettkampf(1500, 48, "LL", "olympisch", 0.2569, 0.0257));
     wktm.addWettkampf(new Wettkampf(1500, 4, "LL", "olympisch", 0.0689, 6.4879));
     wktm.addWettkampf(new Wettkampf(3800, 32, "BL", "lang", 0.8931, 1.4863));
     wktm.addWettkampf(new Wettkampf(3800, 53, "BL", "lang", 0.4659, 0.0256));
    
     frame.getContentPane().add(new JScrollPane(new JTable(wktm)));
```
Habe ich jetzt zwei Objekte namens wktm?

```
frame.pack();
     frame.setVisible(true);
   }

   static class WettkampfTableModel extends AbstractTableModel {

     /**
      *
      */
     private static final long serialVersionUID = 1L;

     private ArrayList<Wettkampf> wettkaempfe = new ArrayList<Wettkampf>();

     private String[] columns = new String[] { "Strecke", "n", "Liga", "Bezeichnung", "mue", "sigma" };

     public void addWettkampf(Wettkampf wk) {
       wettkaempfe.add(wk);
       super.fireTableDataChanged();
     }

     public int getRowCount() {
       return wettkaempfe.size();
     }

     public int getColumnCount() {
       return columns.length;
     }

     public boolean isCellEditable(int row, int column) {
       return false;
     }

     public String getColumnName(int column) {
       return columns[column];
     }

     public Object getValueAt(int row, int column) {
       Wettkampf wk = wettkaempfe.get(row);
       switch (column) {
       case 0:
         return wk.getStrecke();
       case 1:
         return wk.n;
       case 2:
         return wk.getLiga();
       case 3:
         return wk.getBezbzwak();
       case 4:
         return wk.getMue();
       case 5:
         return wk.getSigma();
       default:
         return null;
       }
     }
   }

   static class Wettkampf {

     private int strecke, n;
     private String liga, bezbzwak;
     private Double mue, sigma;

     public Wettkampf(int strecke, int n, String liga, String bezbzwak, Double mue, Double sigma) {
       this.strecke = strecke;
       this.liga = liga;
       this.mue = mue;
       this.sigma = sigma;
       this.bezbzwak = bezbzwak;
       this.n = n;
     }

     public int getStrecke() {
       return this.strecke;
     }

     public int getN() {
       return this.n;
     }

     public String getLiga() {
       return this.liga;
     }

     public String getBezbzwak() {
       return this.bezbzwak;
     }

     public Double getSigma() {
       return this.sigma;
     }

     public Double getMue() {
       return this.mue;
     }
   }
}
```


----------



## NochNixBlicker (12. Aug 2016)

Das ganze ist irgedwie verwirrend, warum brauch ich ein Referenz für die Tabelle und für das TableModel, also wie die Tabelle aussieht? Warum sind dann die Eigenschaften, wie Spaltenbreiten nicht abrufbar? Wo und wie muss ich das TableObjekt referenzieren?

Ich dachte dass ich in folgendem Abschnit mit wk.spaltenbreite darauf zugreifen könne

```
public Object getValueAt(int row, int column) {
       Wettkampf wk = wettkaempfe.get(row);
       switch (column) {
       case 0:
         return wk.getStrecke();
       case 1:
         return wk.n;
       case 2:
         return wk.getLiga();
       case 3:
         return wk.getBezbzwak();
       case 4:
         return wk.getMue();
       case 5:
         return wk.getSigma();
       default:
         return null;
       }
     }
```


----------



## Joose (12. Aug 2016)

NochNixBlicker hat gesagt.:


> warum brauch ich ein Referenz für die Tabelle und für das TableModel, also wie die Tabelle aussieht?


Das TableModel stellt dir die Daten bereit mehr nicht, das JTable Objekt ist für die Anzeige der Daten zuständig.



NochNixBlicker hat gesagt.:


> Warum sind dann die Eigenschaften, wie Spaltenbreiten nicht abrufbar? Wo und wie muss ich das TableObjekt referenzieren?


Das hat dir Nuiton oben schon gezeigt. Eine extra Variable dafür erstellen ....



NochNixBlicker hat gesagt.:


> Ich dachte dass ich in folgendem Abschnit mit wk.spaltenbreite darauf zugreifen könne
> 
> ```
> public Object getValueAt(int row, int column) {
> ...


Wettkampf ist doch nur die Modelklasse zum Daten halten und hat nichts mit der Anzeige zu tun!


----------



## Meniskusschaden (12. Aug 2016)

NochNixBlicker hat gesagt.:


> Habe ich jetzt zwei Objekte namens wktm?


Wie kommst du auf zwei? Wo glaubst du, das zweite wktm-Objekt zu erstellen? Ich sehe es nicht.



NochNixBlicker hat gesagt.:


> Das ganze ist irgedwie verwirrend, warum brauch ich ein Referenz für die Tabelle und für das TableModel, also wie die Tabelle aussieht?


Nein, das TableModel beschreibt gerade nicht, wie die Tabelle aussieht, sondern repräsentiert die Daten. Es geht gerade, Daten und Visualisierung voneinander zu trennen.



NochNixBlicker hat gesagt.:


> Ich dachte dass ich in folgendem Abschnit mit wk.spaltenbreite darauf zugreifen könne


wk ist ein Objekt vom Typ Wettkampf. Das weiß überhaupt nichts über Spalten.

Warum machst du es nicht einfach wie in deinem Eröffnungspost? Da wusstest du doch noch, wie man die Spaltenbreite setzt. Mit der Referenz auf die JTable kommst du an alles nötige ran.


----------



## NochNixBlicker (12. Aug 2016)

Ich wurde durch #3 und #5 dann völlig verwirrt, wahrscheinlich habe ich sie falsch interpretiert. Und der Grund fürs komplette ändern war dann #8. Jetzt peile ich gar nichts mehr und bin frustriert.


```
public class PersonTableDemo {

  public static void main(String[] args) {
  JFrame frame = new JFrame("Person Table");
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  CustomerTableModel ctm = new CustomerTableModel();
  ctm.addCustomer(new Customer(48, "Irgend Jemand Reiches", true));
  ctm.addCustomer(new Customer(4, "Klein Fritzchen", false));
  ctm.addCustomer(new Customer(32, "Chef vom Dienst", true));
  ctm.addCustomer(new Customer(53, "Arme Socke", false));
  frame.getContentPane().add(new JScrollPane(new JTable(ctm)));
  frame.pack();
  frame.setVisible(true);

  }

  static class CustomerTableModel extends AbstractTableModel {

  private ArrayList<Customer> customers = new ArrayList<Customer>();

  private String[] columns = new String[]{"Name", "Alter", "Guter Kunde ?"};

  public void addCustomer(Customer c) {
  customers.add(c);
  super.fireTableDataChanged();
  }

  public int getRowCount() {
  return customers.size();
  }

  public int getColumnCount() {
  return columns.length;
  }

  public boolean isCellEditable(int row, int column) {
  return true;
  }

  public String getColumnName(int column) {
  return columns[column];
  }

  public Class getColumnClass(int column) {
  if (column == 2) {
  return Boolean.class;
  }
  return super.getColumnClass(column);
  }

  public Object getValueAt(int row, int column) {
  Customer c = customers.get(row);
  switch (column) {
  case 0:
  return c.getName();
  case 1:
  return c.getAge();
  case 2:
  return c.isGoodCustomer();
  default:
  return null;
  }
  }

  public void setValueAt(Object o, int row, int column) {
  Customer c = customers.get(row);
  switch (column) {
  case 0:
  c.setName(o.toString());
  break;
  case 1:
  int age = 0;
  if (o instanceof Number) {
  age = ((Number) o).intValue();
  } else {
  age = Integer.parseInt(o.toString());
  }
  c.setAge(age);
  break;
  case 2:
  boolean good = false;
  if (o instanceof Boolean) {
  good = ((Boolean) o).booleanValue();
  } else {
  good = Boolean.parseBoolean(o.toString());
  }
  c.setGoodCustomer(good);
  }
  }
  }

  static class Customer {

  private int age;
  private String name;
  private boolean goodCustomer;

  public Customer(int age, String name, boolean goodCustomer) {
  this.age = age;
  this.name = name;
  this.goodCustomer = goodCustomer;
  }

  public void setAge(int age) {
  System.out.println("Age changed to " + String.valueOf(age));
  this.age = age;
  }

  public int getAge() {
  return this.age;
  }

  public void setName(String name) {
  System.out.println("Name changed to " + name);
  this.name = name;
  }

  public String getName() {
  return this.name;
  }

  public void setGoodCustomer(boolean g) {
  System.out.println("Goodness changed to " + g);
  this.goodCustomer = g;
  }

  public boolean isGoodCustomer() {
  return this.goodCustomer;
  }
}
```


----------



## Meniskusschaden (12. Aug 2016)

NochNixBlicker hat gesagt.:


> Ich wurde durch #3 und #5 dann völlig verwirrt, wahrscheinlich habe ich sie falsch interpretiert. Und der Grund fürs komplette ändern war dann #8. Jetzt peile ich gar nichts mehr und bin frustriert.


Das waren ja auch alles sinnvolle Hinweise. Du musst das doch nur noch zusammen bringen. Du hast bereits in Post #1 anhand einer JTable die Spaltenbreite vorgegeben, fragst nun aber, warum du eine Referenz auf die JTable benötigst. Dein Post #1 beantwortet das doch schon: Du benötigst sie, weil du Zugriff auf die Spaltenbreite haben willst. Für den Zugang dazu benötigst du die JTable.


----------



## NochNixBlicker (12. Aug 2016)

Das schätze ich ha auch nur ICH bringe das Irgendwie nicht zusammen. Weil einerseits will ich dass ich einzeln bequem auf die Daten (wie in #30) zugreifen andererseits Brauche ich die Referenz zu JTable. Wie und wo referenziere ich JTable in #30, weil da speichere ich ja Zahlen als solche und nicht als Strings?


----------



## Joose (12. Aug 2016)

NochNixBlicker hat gesagt.:


> Weil einerseits will ich dass ich einzeln bequem auf die Daten (wie in #30) zugreifen andererseits Brauche ich die Referenz zu JTable. Wie und wo referenziere ich JTable in #30?



In #30 hattest du folgenden Code:

```
frame.getContentPane().add(new JScrollPane(new JTable(wktm)));
```
Hier wird ein neues JTable Objekt erstellt und direkt übergeben, aber nirgends eine Referenz gespeichert
In #1 hattest du folgenden Code:

```
JTable table = new JTable(model);
```
Hier erzeugst du ein neues JTable Objekt und speicherst die Referenz zu diesem Objekt in der Variable "table".

Diese Zeile könntest du 1:1 im Code von Post#30 verwenden, aber dann musst du eben dem JScrollPane die Variable als Parameter übergeben und kein neues Objekt erstellen.


----------



## NochNixBlicker (12. Aug 2016)

Sorry, das Prinzip glaub ich beginn ich zu verstehen. Aber irgendwie sehe ich im Moment den Wald vor lauter Bäumen nicht. Vor meinen Augen verschwimmt alles zur Bleiwüste. Würdest du bitte das alles für mich zusammenPasten()?


----------



## Nuiton (12. Aug 2016)

Das Problem ist dass wenn einer von uns irgendetwas fuer dich raushaut, die Wahrscheinlichkeit besteht dass du nicht verstehst was ueberhaupt passiert ist und wie es funktioniert. Schau dir Objekte nochmal an, dann sollte  Post #27 z.B. viel mehr Sinn ergeben. 
Hier noch mal ein Rueckblick:
Entferne:

```
frame.getContentPane().add(newJScrollPane(new JTable(wktm)));
```
Schreib dann im gleichen Platz:

```
JTable myTable = new JTable(wktm);
```
Und dadrunter:

```
myTable.getColumnModel().getColumn(0).setPreferredWidth(300);
```


----------



## NochNixBlicker (12. Aug 2016)

Sobald ich die Zeile entferne, oder auskommentiere habe anstatt eines Fensterrahmens mit angzeigter Tabelle und Werten ein minimiertes Fenster mit nichts! Ist das richtig?


----------



## NochNixBlicker (12. Aug 2016)

Progge ich:


```
JTable table;
    frame.getContentPane().add(new JScrollPane(table = new JTable()));
  frame.pack();
  frame.setVisible(true);
```

Dann ist glaube ich wieder die eine Tabelle über der Anderen.


----------



## Nuiton (12. Aug 2016)

So wie du es gerade gemacht hast ist richtig - du hast ein Objekt namens "table" erstellt und kannst es jetzt immer wieder benutzen um Aenderungen an deiner Tabelle durchzufuehren. Das kannst du z.B. mit JScrollPane auch machen, oder JLabel, JButton, ... etc.

Jetzt wo es hoffentlich etwas besser verstanden wird, wie du Objekte erstellst usw., kannst du nun folgendes schreiben:


```
...

public class TriSdwBsp  {
   public static void main(String[] args) {
     JFrame frame = new JFrame("Richtwerte für sigma und mue");
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.setLocation(200, 100);
     WettkampfTableModel wktm = new WettkampfTableModel();
     wktm.addWettkampf(new Wettkampf(1500, 48, "LL", "olympisch", 0.2569, 0.0257));
     wktm.addWettkampf(new Wettkampf(1500, 4, "LL", "olympisch", 0.0689, 6.4879));
     wktm.addWettkampf(new Wettkampf(3800, 32, "BL", "lang", 0.8931, 1.4863));
     wktm.addWettkampf(new Wettkampf(3800, 53, "BL", "lang", 0.4659, 0.0256));
   
     // Aenderungen!
     JTable myTable = new JTable(wktm);
     JScrollPane scroll = new JScrollPane(myTable);
     // Spalte 1 (bzw. Spalte 0) = 300 Pixel in Breite
     myTable.getColumnModel().getColumn(0).setPreferredWidth(300);
   
     frame.getContentPane().add(scroll);
     frame.pack();
     frame.setVisible(true);
   }
}
...
```
Der Rest deines Codes bleibt gleich.


----------



## Meniskusschaden (12. Aug 2016)

NochNixBlicker hat gesagt.:


> Dann ist glaube ich wieder die eine Tabelle über der Anderen.


Mir ist nicht klar, was du meinst, aber mir fällt auf, dass du der Tabelle jetzt kein Modell mehr übergibst.


----------



## NochNixBlicker (13. Aug 2016)

Window mit Tabelle - so will ich es

```
package einsatz;


import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

public class TriSdwBsp  {
    public static void main(String[] args) {
    JFrame frame = new JFrame("Richtwerte für sigma und mue");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocation(200, 100);
    WettkampfTableModel wktm = new WettkampfTableModel();
    wktm.addWettkampf(new Wettkampf(1500, 48, "LL", "m30","olympisch", 0.2569, 0.0257));
    wktm.addWettkampf(new Wettkampf(1500, 4, "LL",  "m40", "olympisch", 0.0689, 6.4879));
    wktm.addWettkampf(new Wettkampf(3800, 32, "BL", "w30", "lang", 0.8931, 1.4863));
    wktm.addWettkampf(new Wettkampf(3800, 53, "BL", "w35", "lang", 0.4659, 0.0256));
     
    // Aenderungen!
    JTable myTable = new JTable(wktm);
    JScrollPane scroll = new JScrollPane(myTable);

    myTable.getColumnModel().getColumn(0).setPreferredWidth(50);
    myTable.getColumnModel().getColumn(1).setPreferredWidth(20);
     
    frame.getContentPane().add(scroll);
    frame.pack();
    frame.setVisible(true);
    }

  static class WettkampfTableModel extends AbstractTableModel {

  /**
  *
  */
  private static final long serialVersionUID = 1L;

  private ArrayList<Wettkampf> wettkaempfe = new ArrayList<Wettkampf>();

  private String[] columns = new String[] { "Strecke", "n", "Liga", "AK", "Bezeichnung", "mue", "sigma" };

  public void addWettkampf(Wettkampf wk) {
  wettkaempfe.add(wk);
  super.fireTableDataChanged();
  }

  public int getRowCount() {
  return wettkaempfe.size();
  }

  public int getColumnCount() {
  return columns.length;
  }

  public boolean isCellEditable(int row, int column) {
  return false;
  }

  public String getColumnName(int column) {
  return columns[column];
  }

  public Object getValueAt(int row, int column) {
  Wettkampf wk = wettkaempfe.get(row);
  switch (column) {
  case 0:
  return wk.getStrecke();
  case 1:
  return wk.n;
  case 2:
  return wk.getLiga();
  case 3:
  return wk.getBez();
  case 4:
      return wk.getAk();
  case 5:
  return wk.getMue();
  case 6:
  return wk.getSigma();
  default:
  return null;
  }
  }
  }

  static class Wettkampf {

  private int strecke, n;
  private String liga, bez, ak;
  private Double mue, sigma;

  public Wettkampf(int strecke, int n, String liga, String bez, String ak, Double mue, Double sigma) {
  this.strecke = strecke;
  this.liga = liga;
  this.mue = mue;
  this.sigma = sigma;
  this.bez = bez;
  this.ak = ak;
  this.n = n;
  }

  public int getStrecke() {
  return this.strecke;
  }

  public int getN() {
  return this.n;
  }

  public String getLiga() {
  return this.liga;
  }

  public String getBez() {
  return this.bez;
  }
   
  public String getAk() {
  return this.ak;
  }

  public Double getSigma() {
  return this.sigma;
  }

  public Double getMue() {
  return this.mue;
  }
  }
}
```

In diese Panel will ich die Tabelle reinhaben:

```
package einsatz;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

import einsatz.TriSdwBsp.Wettkampf;
import einsatz.TriSdwBsp.WettkampfTableModel;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;


public class TriBsp extends JPanel {

  /**
  *
  */
  private static final long serialVersionUID = -6671920676546497516L;

  public TriBsp() {
    WettkampfTableModel wktm = new WettkampfTableModel();
    wktm.addWettkampf(new Wettkampf(1500, 48, "LL", "m30","olympisch", 0.2569, 0.0257));
    wktm.addWettkampf(new Wettkampf(1500, 4, "LL",  "m40", "olympisch", 0.0689, 6.4879));
    wktm.addWettkampf(new Wettkampf(3800, 32, "BL", "w30", "lang", 0.8931, 1.4863));
    wktm.addWettkampf(new Wettkampf(3800, 53, "BL", "w35", "lang", 0.4659, 0.0256));
     
    // Aenderungen!
    JTable myTable = new JTable(wktm);
    JScrollPane scroll = new JScrollPane(myTable);

    myTable.getColumnModel().getColumn(0).setPreferredWidth(50);
    myTable.getColumnModel().getColumn(1).setPreferredWidth(20);
     
//    frame.getContentPane().add(scroll);
//    frame.pack();
//    frame.setVisible(true);
    }

 static class WettkampfTableModel extends AbstractTableModel {

  /**
  *
  */
  private static final long serialVersionUID = 1L;

  private ArrayList<Wettkampf> wettkaempfe = new ArrayList<Wettkampf>();

  private String[] columns = new String[] { "Strecke", "n", "Liga", "AK", "Bezeichnung", "mue", "sigma" };

  public void addWettkampf(Wettkampf wk) {
  wettkaempfe.add(wk);
  super.fireTableDataChanged();
  }

  public int getRowCount() {
  return wettkaempfe.size();
  }

  public int getColumnCount() {
  return columns.length;
  }

  public boolean isCellEditable(int row, int column) {
  return false;
  }

  public String getColumnName(int column) {
  return columns[column];
  }

  public Object getValueAt(int row, int column) {
  Wettkampf wk = wettkaempfe.get(row);
  switch (column) {
  case 0:
  return wk.getStrecke();
  case 1:
  return wk.n;
  case 2:
  return wk.getLiga();
  case 3:
  return wk.getBez();
  case 4:
      return wk.getAk();
  case 5:
  return wk.getMue();
  case 6:
  return wk.getSigma();
  default:
  return null;
  }
  }
 }

 static class Wettkampf {

  private int strecke, n;
  private String liga, bez, ak;
  private Double mue, sigma;

  public Wettkampf(int strecke, int n, String liga, String bez, String ak, Double mue, Double sigma) {
  this.strecke = strecke;
  this.liga = liga;
  this.mue = mue;
  this.sigma = sigma;
  this.bez = bez;
  this.ak = ak;
  this.n = n;
  }

  public int getStrecke() {
  return this.strecke;
  }

  public int getN() {
  return this.n;
  }

  public String getLiga() {
  return this.liga;
  }

  public String getBez() {
  return this.bez;
  }
   
  public String getAk() {
  return this.ak;
  }

  public Double getSigma() {
  return this.sigma;
  }

  public Double getMue() {
  return this.mue;
  }
 }}
```


----------



## Nuiton (13. Aug 2016)

Wie ich dir schon geschrieben habe, du erstellst ein JPanel-Objekt, fuegst deine JScrollPane zum JPanel hinzu, welches du wiederrum zu einem JFrame oder JDialog hinzufuegen kannst.


----------



## Meniskusschaden (13. Aug 2016)

Du hattest dasselbe Problem übrigens schon mal:
http://www.java-forum.org/thema/spaltenueberschriften.174124/#post-1098566


----------



## NochNixBlicker (13. Aug 2016)

upss


----------



## NochNixBlicker (13. Aug 2016)

Sorry ich meinte JTabbedPane, ich weiss das aber nicht mehr, wie ich das gemacht habe:

Hier der Code vom TabbedPane, der nicht so will wie ich:


```
package einsatz;

import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

import java.util.ArrayList;

public class TriBsp extends JPanel {

   /**
   *
   */
   private static final long serialVersionUID = -6671920676546497516L;

   public static void main(String[] args) {
//     JFrame frame = new JFrame("Richtwerte für sigma und mue");
//     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//     frame.setLocation(200, 100);
     WettkampfTableModel wktm = new WettkampfTableModel();
     wktm.addWettkampf(new Wettkampf(1500, 48, "LL", "m30", "olympisch", 0.2569, 0.0257));
     wktm.addWettkampf(new Wettkampf(1500, 4, "LL", "m40", "olympisch", 0.0689, 6.4879));
     wktm.addWettkampf(new Wettkampf(3800, 32, "BL", "w30", "lang", 0.8931, 1.4863));
     wktm.addWettkampf(new Wettkampf(3800, 53, "BL", "w35", "lang", 0.4659, 0.0256));

     // Aenderungen!
     JTable myTable = new JTable(wktm);
     JScrollPane scroll = new JScrollPane(myTable);

     myTable.getColumnModel().getColumn(0).setPreferredWidth(50);
     myTable.getColumnModel().getColumn(1).setPreferredWidth(20);

//     frame.getContentPane().add(scroll);
//     frame.pack();
//     frame.setVisible(true);
   }

   static class WettkampfTableModel extends AbstractTableModel {

     /**
      *
      */
     private static final long serialVersionUID = 1L;

     private ArrayList<Wettkampf> wettkaempfe = new ArrayList<Wettkampf>();

     private String[] columns = new String[] { "Strecke", "n", "Liga", "AK", "Bezeichnung", "mue", "sigma" };

     public void addWettkampf(Wettkampf wk) {
       wettkaempfe.add(wk);
       super.fireTableDataChanged();
     }

     public int getRowCount() {
       return wettkaempfe.size();
     }

     public int getColumnCount() {
       return columns.length;
     }

     public boolean isCellEditable(int row, int column) {
       return false;
     }

     public String getColumnName(int column) {
       return columns[column];
     }

     public Object getValueAt(int row, int column) {
       Wettkampf wk = wettkaempfe.get(row);
       switch (column) {
       case 0:
         return wk.getStrecke();
       case 1:
         return wk.n;
       case 2:
         return wk.getLiga();
       case 3:
         return wk.getBez();
       case 4:
         return wk.getAk();
       case 5:
         return wk.getMue();
       case 6:
         return wk.getSigma();
       default:
         return null;
       }
     }
   }

   static class Wettkampf {

     private int strecke, n;
     private String liga, bez, ak;
     private Double mue, sigma;

     public Wettkampf(int strecke, int n, String liga, String bez, String ak, Double mue, Double sigma) {
       this.strecke = strecke;
       this.liga = liga;
       this.mue = mue;
       this.sigma = sigma;
       this.bez = bez;
       this.ak = ak;
       this.n = n;
     }

     public int getStrecke() {
       return this.strecke;
     }

     public int getN() {
       return this.n;
     }

     public String getLiga() {
       return this.liga;
     }

     public String getBez() {
       return this.bez;
     }

     public String getAk() {
       return this.ak;
     }

     public Double getSigma() {
       return this.sigma;
     }

     public Double getMue() {
       return this.mue;
     }
   }}
```


----------



## Meniskusschaden (13. Aug 2016)

Sorry, aber ich kapiere nicht mehr, was du nun eigentlich willst. Jetzt hat TriBsp wieder eine Main-Methode, vorher hatte es keine. Ist das nun das Hauptprogramm oder soll es von einer anderen Klasse benutzt werden? Und ein JTabbedPane kommt in deinem Code überhaupt nicht vor. Drück dich doch mal deutlicher aus, was du jeweils erreichen willst und wie sich das Problem äußert.


----------



## NochNixBlicker (13. Aug 2016)

Upps ich daten jeder Code hätte eine Main-Methode. Aber ich gib euch hier mal die App:

Hauptframe der App

```
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JFrame;

import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import einsatz.Tri;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.RowSpec;
import com.jgoodies.forms.layout.FormSpecs;
  
public class GIzEH implements ActionListener {

   private JFrame mainFrame;

   /**
    * Launch the application.
    *
    * @param args
    */
   public GIzEH() {
     initComponents();
   }

   private void initComponents() // Creating and initializing components
   {
     mainFrame = new JFrame();
     mainFrame.setTitle("GIzEH 3.0");
     ImageIcon img = new ImageIcon("C:\\Users\\Erik\\workspace\\GIzEH\\src\\res\\GIzEH.png");
     try {

       mainFrame.setIconImage(img.getImage());
     } catch (Exception e) {
       e.printStackTrace();
     }
     mainFrame.setVisible(true);
     mainFrame.setBounds(100, 100, 670, 368);
     mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

     JMenuBar menuBar = new JMenuBar();
     mainFrame.setJMenuBar(menuBar);

     // Datei
     JMenu mndatei = new JMenu("Datei");
     menuBar.add(mndatei);

     JMenuItem mntmUpdateErzwingen = new JMenuItem("Update erzwingen");
     mndatei.add(mntmUpdateErzwingen);
     mntmUpdateErzwingen.addActionListener(this);

     JMenuItem mntmEinstellungen = new JMenuItem("Einstellungen");
     mndatei.add(mntmEinstellungen);
     mntmEinstellungen.addActionListener(this);

     JMenuItem mntmBenutzerwechsel = new JMenuItem("Benutzerwechsel");
     mndatei.add(mntmBenutzerwechsel);
     mntmBenutzerwechsel.addActionListener(this);

     mndatei.addSeparator();

     JMenuItem mntmBeenden = new JMenuItem("Beenden");
     mntmBeenden.addActionListener(this);
     mndatei.add(mntmBeenden);

     // Einsatz
     JMenu mnEinsatz = new JMenu("Einsatz");
     menuBar.add(mnEinsatz);

     // *############################################################*/
     JMenuItem mntmSichern = new JMenuItem("Sichern");
     mnEinsatz.add(mntmSichern);
     mntmSichern.addActionListener(this);
     mntmSichern.setActionCommand("Sichern");
    
     mnEinsatz.addSeparator();

     JMenuItem mntmRetten = new JMenuItem("Retten");
     mnEinsatz.add(mntmRetten);
     mntmRetten.addActionListener(this);
     mntmRetten.setActionCommand("Retten");

     mnEinsatz.addSeparator();
    
     // *############################################################*/
     JMenuItem mntmBergen = new JMenuItem("Bergen");
     mnEinsatz.add(mntmBergen);
     mntmBergen.addActionListener(this);

     // ?
     JMenu mn = new JMenu("?");
     menuBar.add(mn);

     JMenuItem mntmInhaltUndIndex = new JMenuItem("Inhalt und Index");
     mn.add(mntmInhaltUndIndex);
     mntmInhaltUndIndex.addActionListener(this);

     JMenuItem mntmVerursacher = new JMenuItem("Verursacher");
     mn.add(mntmVerursacher);
     mainFrame.getContentPane().setLayout(new FormLayout(new ColumnSpec[] {
         FormSpecs.RELATED_GAP_COLSPEC,
         FormSpecs.DEFAULT_COLSPEC,},
       new RowSpec[] {
         FormSpecs.RELATED_GAP_ROWSPEC,
         FormSpecs.DEFAULT_ROWSPEC,
         FormSpecs.RELATED_GAP_ROWSPEC,
         FormSpecs.DEFAULT_ROWSPEC,}));
     mntmVerursacher.addActionListener(this);

     JPanel panel = new JPanel();

     panel.setLayout(null);
   }

   @Override
   public void actionPerformed(ActionEvent e) {
     if (e.getActionCommand().equals("Sichern")) {
       Tri dialog = new Tri();
     } else if (e.getActionCommand().equals("Retten")) {
       System.out.println("Retten wurde gedrückt");
     } else if (e.getActionCommand().equals("Bergen")) {
       System.out.println("Bergen wurde gedrückt");
     } else if (e.getActionCommand().equals("Beenden")) {
       exit();
     }
   }

   public void exit() {
     int result = JOptionPane.showConfirmDialog(null, "Möchten Sie das Programm beenden?", "Programm beenden",
         JOptionPane.YES_NO_OPTION);
     switch (result) {
     case JOptionPane.YES_OPTION:
       System.exit(0); // Aktion(en) bei Klicken auf den "Ja-Button"
     }
   }

   public static void main(String[] args) {
     EventQueue.invokeLater(new Runnable() {
       public void run() {
         new GIzEH();
       }
     });
   }
}
```

Das Formular mit Panel

```
package einsatz;

import javax.swing.JDialog;
import javax.swing.JTabbedPane;
import java.awt.Toolkit;

public class Tri extends JDialog {

   /**
    *
    */
   private static final long serialVersionUID = 1L;

   /**
    * Launch the application.
    */
   /**
    * Create the dialog.
    */
   public Tri() {
     setIconImage(Toolkit.getDefaultToolkit().getImage(Tri.class.getResource("/res/GIzEH.ico")));
     setBounds(200, 200, 1080, 400);
     JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
     getContentPane().add(tabbedPane);
     this.setVisible(true);
     this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    
     TriSdw sdw = new TriSdw();
     tabbedPane.addTab("Stammdaten", null, sdw, null);

     TriBsp bsp = new TriBsp();
     tabbedPane.addTab("Beispielwerte", null, bsp, null);

     TriNvt nvt = new TriNvt();
     tabbedPane.addTab("Normalverteilung", null, nvt, null);

     TriZus zus = new TriZus();
     tabbedPane.addTab("Zeiten und Strecken", null, zus, null);

     TriBpl bpl = new TriBpl();
     tabbedPane.addTab("Bedarfsplanung", null, bpl, null);

   }
}
```

Besagtes Panel, in das die Tabelle reinsoll:

```
package einsatz;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

import einsatz.TriSdwBsp.Wettkampf;
import einsatz.TriSdwBsp.WettkampfTableModel;

import java.util.ArrayList;

public class TriBsp extends JPanel {

   /**
   *
   */
   private static final long serialVersionUID = -6671920676546497516L;

   public static void main(String[] args) {
     JFrame frame = new JFrame("Richtwerte für sigma und mue");
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.setLocation(200, 100);
     WettkampfTableModel wktm = new WettkampfTableModel();
     wktm.addWettkampf(new Wettkampf(1500, 48, "LL", "m30", "olympisch", 0.2569, 0.0257));
     wktm.addWettkampf(new Wettkampf(1500, 4, "LL", "m40", "olympisch", 0.0689, 6.4879));
     wktm.addWettkampf(new Wettkampf(3800, 32, "BL", "w30", "lang", 0.8931, 1.4863));
     wktm.addWettkampf(new Wettkampf(3800, 53, "BL", "w35", "lang", 0.4659, 0.0256));

     // Aenderungen!
     JTable myTable = new JTable(wktm);
     JScrollPane scroll = new JScrollPane(myTable);

     myTable.getColumnModel().getColumn(0).setPreferredWidth(50);
     myTable.getColumnModel().getColumn(1).setPreferredWidth(20);

     frame.getContentPane().add(scroll);
     frame.pack();
     frame.setVisible(true);
   }

   static class WettkampfTableModel extends AbstractTableModel {

     /**
      *
      */
     private static final long serialVersionUID = 1L;

     private ArrayList<Wettkampf> wettkaempfe = new ArrayList<Wettkampf>();

     private String[] columns = new String[] { "Strecke", "n", "Liga", "AK", "Bezeichnung", "mue", "sigma" };

     public void addWettkampf(Wettkampf wk) {
       wettkaempfe.add(wk);
       super.fireTableDataChanged();
     }

     public int getRowCount() {
       return wettkaempfe.size();
     }

     public int getColumnCount() {
       return columns.length;
     }

     public boolean isCellEditable(int row, int column) {
       return false;
     }

     public String getColumnName(int column) {
       return columns[column];
     }

     public Object getValueAt(int row, int column) {
       Wettkampf wk = wettkaempfe.get(row);
       switch (column) {
       case 0:
         return wk.getStrecke();
       case 1:
         return wk.n;
       case 2:
         return wk.getLiga();
       case 3:
         return wk.getBez();
       case 4:
         return wk.getAk();
       case 5:
         return wk.getMue();
       case 6:
         return wk.getSigma();
       default:
         return null;
       }
     }
   }

   static class Wettkampf {

     private int strecke, n;
     private String liga, bez, ak;
     private Double mue, sigma;

     public Wettkampf(int strecke, int n, String liga, String bez, String ak, Double mue, Double sigma) {
       this.strecke = strecke;
       this.liga = liga;
       this.mue = mue;
       this.sigma = sigma;
       this.bez = bez;
       this.ak = ak;
       this.n = n;
     }

     public int getStrecke() {
       return this.strecke;
     }

     public int getN() {
       return this.n;
     }

     public String getLiga() {
       return this.liga;
     }

     public String getBez() {
       return this.bez;
     }

     public String getAk() {
       return this.ak;
     }

     public Double getSigma() {
       return this.sigma;
     }

     public Double getMue() {
       return this.mue;
     }
   }
}
```


----------



## NochNixBlicker (13. Aug 2016)

Warumgeht das nicht?


```
this.add(scroll);
```


----------



## NochNixBlicker (13. Aug 2016)

Könnt ihr das bitte zusammenpasten, weil ich habe wirklich keinen Schimmer mehr, wie ich das Gemacht habe!


----------



## Meniskusschaden (13. Aug 2016)

NochNixBlicker hat gesagt.:


> Aber ich gib euch hier mal die App:


Das kann nicht alles sein, denn so ist das Programm nicht kompilierbar, weil zumindest ein paar Tri*-Klassen und vor allem die Klassen ColumnSpec, RowSpec und FormSpecs fehlen.


NochNixBlicker hat gesagt.:


> Upps ich daten jeder Code hätte eine Main-Methode. Aber ich gib euch hier mal die App:


Normalerweise braucht nur die Klasse eine main-Methode, über die die Anwendung gestartet wird. Bei dir wird das wohl GIzEH sein.


NochNixBlicker hat gesagt.:


> Warumgeht das nicht?
> 
> 
> 
> ...


Warum sollte das nicht gehen? Wo hast du es denn eingebaut? Wie äußert sich der Fehler?


NochNixBlicker hat gesagt.:


> Könnt ihr das bitte zusammenpasten, weil ich habe wirklich keinen Schimmer mehr, wie ich das Gemacht habe!


Das bringt nichts. Die Lösung ist viel einfacher: ein paar Schritte zurück gehen und die Grundlagen lernen. Andernfalls wird es nur noch schlimmer und frustrierender.


----------



## Thallius (13. Aug 2016)

Immer wieder lustig wenn die Leute versuchen UI's zu programmieren aber nicht einmal wissen was der Unterschied zwischen Klasse und Instanz, geschweige denn Klassenvariable und Instanzvariable ist...


----------



## Nuiton (13. Aug 2016)

Tut mir leid, ich habe versucht dir zu helfen, aber es sieht leider immer wieder so aus als ob du anderen Leuten das coden ueberlassen moechtest, anstatt es selber zu versuchen. Du hast Buecher, du hast das Internet, du hast auch dieses Forum. Glaub' mir, egal welche Frage du hast, irgendwo wurde sie schon irgendwann mal gefragt.


----------



## NochNixBlicker (15. Aug 2016)

Das Problem das ich habe, bedeutet aber wenn ich mal was kapiert habe, heißt es nicht das dieses Wissen mir zur Verfügung steht. Es wenn ich mich mit was anderem beschäftige kann das wissen erneut nicht vorhanden sein. 
Oder um auf eine Parallele aus der IT zurückzugreifen es ist wie wenn du eine Datei schreibst, und immer wieder die FAT entweder fehlerhaft st oder dir der Zugriff verweigert wird (direkt nach dem Unfall). Also wenn du so willst musste ich die FAT neu schreiben und bin immer noch dabei.
Und das was @Thallius im Post #54 sagt, stimmt nicht. Es ist ÜBERHAUPT NICHT LUSTIG. Vor allem da mir der Unfall mein gesamtes VBA-Wissen geraubt hat, mit dem ich während meiner Mittelstufe (8-10) eine Netzwerkanwendung geschrieben habe. Ausserdem darf ich @Thallius an seine Wotze erinnern: "2 Stunden Try&Error ersparen 5min Handbuch lesen"


----------



## Meniskusschaden (15. Aug 2016)

Ich kann natürlich nicht beurteilen, wie problematisch es für dich ist, die Grundlagen zu lernen, aber ohne Grundlagenkenntnisse wird es nicht funktionieren. Ich glaube aber, dass es am Anfang nicht ungewöhnlich ist, dass man durch die Verwendung von nicht vollkommen verstandenem Beispielcode zunächst schnell scheinbare Anfangserfolge erzielt und nicht sofort merkt, dass man eigentlich schon den Faden verloren hat. Das zeigt sich erst, sobald ein Problem auftritt. Dann ertrinkt man in dem ganzen Zeug und kann es überhaupt nicht eingrenzen.

Ein paar Schritte zurück zu gehen muß nicht unbedingt heissen, dass man wieder bei "Hallo Welt" anfängt (falls man es übersprungen hat, sollte man aber dort anfangen). Du mußt dein Projekt ja auch nicht unbedingt aufgeben, sondern kannst es einfach noch einmal von vorne beginnen. Den alten Code musst du nicht wegschmeissen, sondern kannst Teile davon in das neue Projekt kopieren. Dabei finde ich es aber sehr wichtig, nur Codeteile zu verwenden, deren Funktion du wirklich verstanden hast. Die Teile, die man nicht verstanden hat, aber zu benötigen glaubt, muss man dann eben genauer untersuchen, zum Beispiel indem man in einem reduzierten Mini-Programm verschiedene Dinge damit ausprobiert und experimentiert.

Für die Fragen hier im Forum bietet sich ein ähnliches Vorgehen an. Ich würde nicht das komplette Programm hier posten, sondern den wesentlichen Teil, der mir Probleme bereitet, isolieren, indem ich ein möglichst abgespecktes aber kompilierbares Beispiel aufbaue, mit dem man es nachvollziehen kann. Das hat den Vorteil, dass es vermutlich mehr Leute lesen, so dass es mehr Antworten gibt. Ausserdem gibt es weniger Antworten, die sich auf den irrelevanten Teil des Codes beziehen und vielleicht die Verwirrung steigern. Aber vor allem trägt der Aufbau des Beispiels oft zum besseren Verständnis des eigenen Codes bei und oft erkennt man dabei bereits selbst das Problem oder man erkennt, dass der fragliche Teil bereits funktioniert und die Ursache an anderer Stelle liegt. Zu den Erkenntnissen, die man so gewinnt, hat man einen viel intensiveren Zugang und dauerhafteren Nutzen, als zu den Dingen, die man nur gelesen oder auf andere Weise passiv konsumiert hat.


----------



## AndiE (16. Aug 2016)

Ich glaube, dass es hier auch darum geht, Erkenntnisse zu gewinnen und zu speichern. Zum Thema "Daten in eiiner Tabelle anzeigen" könnte ich mir vorstellen. Eine Edit-Feld mit einer leeren Tabelle und einem Button zu erzeugen. Jedesmal wenn der Nutzer auf den Button klickt, soll der im Editfeld eingegebene Text in die Tabelle eingefügt werden. Wenn du das selbst erstellst, kannst du viel über dieses verfahren lernen, das du später auch bei großen Anwendungen anwenden kannst. Zum zweiten Punkt halte ich es so, dass ich neben meinem Programmiergerät immer einen Zettel und einen Stift liegen habe. Ich finde, dass es nicht nur schwar auf weiß da steht, sondern ja schon einmal bedacht wurde. Schaut man sich seine Notizen an, kommt dann die Erinnerung. ich mag es, das Zusammenspiel der Elemente und den Programmablauf grafisch darzustellen, und nutze dazu eine "eigene Version" von UML. Ich denke, dass solche Notizen dir auch helfen würden.


----------



## NochNixBlicker (16. Aug 2016)

Es ist nur verdammt schwer sich das selber einzugestehen, wieder auf x-6 zurückgehen zu müssen. Und irgendwie habe ich Angst davor bzw ich weigere mich immer noch die unbestreitbare Tatsache anzuerkennen, dass ich den Unfall hatte.

Ich gebe mal zum besten was ich zum Thema Klasse verstanden habe: Sie beschreibt mindestens eine, aber meist mehrere Entitäten (Dinge) mit ihren Eigenschaften und ihrem Verhalten.

Und UML wird benutzt um dieses Ganze visuell darzustellen. Auch die Beziehungen unter den Entitäten, also so ähnlich wie ein ERM?


----------



## Nuiton (17. Aug 2016)

Ja, eine Klasse beschreibt das Verhalten mehrerer Dinge, bzw. in der Form von Methoden.
Zum Beispiel laesst sich eine Klasse "Auto.java" schreiben lassen, in der man das Verhalten eines Autos beschreiben wuerde.
Beispiel:

```
public class Auto 
{

    private double horsePower;
    private int numWheels;
    private String brand;
   
    public Auto(String brand, double horsePower, int numWheels)
    {
        this.horsePower = horsePower;
        this.numWheels = numWheels;
        this.brand = brand;
    }
   
    // Getters
    public double getHorsepower()
    {
        return horsePower;
    }
   
    public int getNumWheels()
    {
        return numWheels;
    }
   
    public String getBrand()
    {
        return brand;
    }
   
    // Setters
    public double setHorsepower(double horsePower)
    {
        this.horsePower = horsePower;
       
        return horsePower;
    }
   
    public int setNumWheels(int numWheels)
    {
        this.numWheels = numWheels;
       
        return numWheels;
    }
   
    public String setBrand(String brand)
    {
        this.brand = brand;
       
        return brand;
    }
   
    // Main
   
    public static void main(String args[])
    {
        Auto a = new Auto("Merzedes-Benz", 350, 4);
        Auto b = new Auto("Opel", 50, 4);
       
        // Display
        System.out.println("Marke: "+ a.getBrand());
        System.out.println("Raederanzahl: "+ a.getNumWheels());
        System.out.println("Pferdestaerken: "+ a.getHorsepower());
        System.out.println("... gute Fahrt!\n");
       
        System.out.println("Marke: "+ b.getBrand());
        System.out.println("Raederanzahl: "+ b.getNumWheels());
        System.out.println("Pferdestaerken: "+ b.getHorsepower());
        System.out.println("... gute Fahrt!\n");
       
       
    }
}
```
Output:

```
Marke: Merzedes-Benz
Raederanzahl: 4
Pferdestaerken: 350.0
... gute Fahrt!

Marke: Opel
Raederanzahl: 4
Pferdestaerken: 50.0
... gute Fahrt!
```

Wie du siehst, kannst du mehrere "Objekte", bzw. "a", "b", "c", ... erstellen, ohne viel mehr Code zu schreiben. Du kannst Klassen auch erweitern, ein Interface erstellen, und und und.


----------



## Nuiton (17. Aug 2016)

Um noch etwas zu erwaehnen: Setters schreibt man eigl. mit void Typen. Da in diesem Beispiel jedoch auch nur Text veraendert wird, hatte ich nicht vor get-Methoden zu wiederholen.


----------



## NochNixBlicker (17. Aug 2016)

Danke!


----------

