# Zeilenweise Excel-Datei mit Strings befüllen



## Tinga (8. Apr 2014)

Guten Tag liebe Experten,


mein Ziel besteht darin, eine GUI in Java zu programmieren. Beim Klicken eines Buttons sollen Strings, die zuvor in Textfeldern /ComboBoxen eingegeben worden sind, in bestimmte Zellen einer Excel-Datei übernommen werden, die als ganz einfache „Datenbank“ dient. Pro Button-Click soll eine ZEILE der Excel-Datei (konkret: die Spalten B, C, D) mit 3 Werten gefüllt werden. Bei erneutem Klicken sollen die entsprechenden Strings in der nächsten (also darunterliegenden) ZEILE (wieder die Spalten B, C, D) gespeichert werden.  Ich verwende dafür die POI von Apache.
 Alles klappt auch wunderbar, bis auf das Einfügen der Strings in die Excel-Datei. Prinzipiell funktioniert das Einfügen schon, allerdings befülle ich nicht die von mir gewünschten Zellen.  
Das ist mein Code dazu:

[JAVA=42]
detailsPanel.addDetailListener(new DetailListener() {
            public void detailEventOccurred(DetailEvent event) {
                String bezeichnung = event.getText();
                String art = event.getText();
                String material = event.getText();

                //textArea.append(name);

                try {
            		FileInputStream myInput = new FileInputStream("C:/Users/max/Desktop/Max/Studium/Master/00_Hiwi/20140307_Eclipse/140405_ActionListener/Excel.xls");
            	    POIFSFileSystem fileSystem = new POIFSFileSystem(myInput);
            	    HSSFWorkbook workbook = new HSSFWorkbook(fileSystem);
            	    HSSFSheet sheet = workbook.getSheetAt(0);




            		    System.out.println(sheet.getPhysicalNumberOfRows()); //return anzahl gefüllte Reihen
            		    int rows = sheet.getPhysicalNumberOfRows();
            		    HSSFRow row = sheet.createRow(rows);
            		    HSSFCell cell = row.createCell(1); //soll Zelle in Spalte 1 erstellen
            		    cell.setCellValue(bezeichnung); //Wert der gesetzt werden soll.
            		    //HSSFCell cell1 = row.createCell(2); //soll Zelle in Spalte 2 erstellen
            		    //cell1.setCellValue(art); //Wert der gesetzt werden soll.
            		    //HSSFCell cell2 = row.createCell(3); //soll Zelle in Spalte 1 erstellen
            		    //cell2.setCellValue(material); //Wert der gesetzt werden soll.


            		    FileOutputStream myOutput = new FileOutputStream(new File("C:/Users/max/Desktop/Max/Studium/Master/00_Hiwi/20140307_Eclipse/140405_ActionListener/Excel.xls"));  
            		    workbook.write(myOutput);
            		    myOutput.close();
            		} catch (Exception ex) {

            		};
[/code]
Diese Stelle ist glaube ich auch noch wichtig:

[JAVA=42]
JButton addBtn = new JButton("Hinzufügen");

        addBtn.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                final String bezeichnung = bezeichnungField.getText();
                final String art = artField.getText();
                final String selectedItem = (String)materialAuswahl.getSelectedItem();

                String text = bezeichnung + ";  " + art + "\n";

                fireDetailEvent(new DetailEvent(this, bezeichnung));
                fireDetailEvent(new DetailEvent(this, art));
                fireDetailEvent(new DetailEvent(this, selectedItem));
[/code]

Falls es Euch hilft:
Ausgegangen bin ich dabei von diesem Code, den ich im Netz gefunden habe: Java Swing: Events (Video Tutorial Part 5) | Cave of Programming

Konkret stellt sich das beim Ausführen bei mir folgendermaßen dar:
Eingabe:

bezeichnung: Blechverschnitt
art: V(erschnitt)
selectedItem: DC01

Nach Klicken des „Hinzufügen“-Buttons sieht die Excel so aus:

Blechverschnitt
V(erschnitt)
DC01
(die Werte werden untereinander in Spalte B geschrieben)

Ich möchte aber, dass er die Strings in folgende Zellen schreibt :

Blechverschnitt              V(erschnitt)                DC01 
(sprich, in die erste leere Zeile und dort in die Zellen B bis D)


Hoffe, das Problem ist verständlich beschrieben.

Es ist an und für sich ein recht kleiner Fehler, ich sitze allerdings schon 4 Tage davor und bekomme es einfach nicht hin. Ich krieg die Krise.

Ich muss dazu sagen, dass ich blutiger Anfänger bin. Wenn ihr helfen wollt/könnt, antwortet bitte möglichst ausführlich, damit ich folgen kann.


Vielen, vielen Dank schonmal.
Tinga


----------



## FetterOtter (8. Apr 2014)

Hallo Tinga,

dein Problem ist hier nicht POI, sondern die Art, wie du DetailEvent aufrufst: Nämlich dreimal hintereinander mit den unterschiedlichen Feldern. Dadurch müsste in "bezeichnung", "art" und "material" eigentlich immer das gleiche stehen.
Als du das Erstellen und Rausschreiben von cell1 und cell2 noch nicht auskommentiert hattest, sah deine Ausgabe da so aus:

Blechverschnitt   Blechverschnitt   Blechverschnitt
V(erschnitt)        V(erschnitt)       V(erschnitt)
DC01                 DC01                 DC01

??

Wenn ja, wäre das mein Änderungsvorschlag:


```
JButton addBtn = new JButton("Hinzufügen");
    
 addBtn.addActionListener(new ActionListener() {
         
   public void actionPerformed(ActionEvent e) {
     final String bezeichnung = bezeichnungField.getText();
     final String art = artField.getText();
     final String selectedItem = (String)materialAuswahl.getSelectedItem();

     String text = bezeichnung + ";  " + art + "\n";
     String eventText = bezeichnung + ";" + art + ";" + selectedItem;   // Enthält jetzt alle Informationen
             
     fireDetailEvent(new DetailEvent(this, eventText));   // Nur noch ein Aufruf
//   fireDetailEvent(new DetailEvent(this, bezeichnung));
//   fireDetailEvent(new DetailEvent(this, art));
//   fireDetailEvent(new DetailEvent(this, selectedItem));
```


```
detailsPanel.addDetailListener(new DetailListener() {
   public void detailEventOccurred(DetailEvent event) {
     String[] eventText = event.getText().split(";");   // Den zusammengesetzten Text wieder aufteilen
     String bezeichnung = eventText[0];
     String art = eventText[1];
     String material = eventText[2];
//   String bezeichnung = event.getText();
//   String art = event.getText();
//   String material = event.getText();
```

Und dann natürlich die Zeilen 23 - 26 wieder aktivieren.


----------



## Tinga (8. Apr 2014)

Hallo FetterOtter,


zuerst mal: Du bist mein Held! Es funktioniert alles so wie Du es gesagt hast.

Du hattest auch recht mit Deiner Vermutung, dass mein Output dem entspricht, was Du in Deinem Post angeben hast, wenn ich cell1 und cell2 nicht auskommentiere. 

Einfach genial. Vielen, vielen Dank.


Ich lasse die Frage noch offen, weil sicher noch weitere Fragen in diese Richtung von mir kommen werden. Ich bemühe mich aber wie immer selbst und wenn ich wirklich nicht weiterkomme, melde ich mich nochmal. Du musst Dich aber nicht dazu verpflichtet fühlen, mir weiterzuhelfen. Du hast mir schon genug geholfen. 

Ich saß seit vergangenen Freitag vor dem Rätsel, die Strings in die richtigen Zellen zu bekommen. Das mit dem Array ist eigentlich logisch, ich hätte es aber nie so hinbekommen. Der Trick, den String am Semikolon auseinander zu brechen ist klasse. Solche Befehle kenne ich als Anfänger natürlich nicht. Ich habe zwar anhand von meinem Output erkannt, wo mein Hauptfehler liegt, nämlich an dem falschen Gebrauch von fireEvent. Eigentlich dachte ich aber, dass ich cell den String bezeichnung eindeutig zugeordnet hätte (Zeile 22 in Post  #1). 

Naja, mir bleibt nichts anderes übrig als mich nochmal ganz herzlich bei Dir zu bedanken.


----------



## FetterOtter (8. Apr 2014)

Gern geschehen. Ich helfe dir auch sehr gerne weiterhin, aber sei mir nicht böse, wenn meine Antworten mal etwas auf sich warten lassen. Ich kann nur von der Arbeit aus posten, bin aber als Teilzeitkraft nicht sooooo viel im Büro...

Viel Spaß weiterhin!


----------



## Tinga (9. Apr 2014)

Und da bin ich wieder. Ich habe diesmal gleich zwei Fragen.

Zum einen möchte ich eventText um eine Zählvariable erweitern. Zusätzlich zu den 3 Strings, die in die Spalten B bis D geschrieben werden soll nun also ein Index / eine fortlaufende Nummer in Spalte A geschrieben werden. Bei jedem Klicken des Buttons (also wenn in eine neue Zeile geschrieben wird) soll sich der Index um 1 erhöhen. Also so:
A	B			C		D
1	Klotz			Produkt	DC01
2	Blechverschnitt		Verschnitt	DD51X

Prinzipiell würde das mit einer Schleife recht einfach gehen. Im Kontext der Excel-Anwendung bin ich diesbezüglich aber eingeschränkt. Mir ist klar, dass meine Lösung sinnbefreit ist weil ich keinen Versuch unternehme die 1 zu erhöhen. Daher sieht mein Output momentan so aus:

1	Klotz			Produkt	DC01
1	Blechverschnitt		Verschnitt	DD51X

[JAVA=42]
JButton addBtn = new JButton("Hinzufügen");

        final int counter = 0;

        addBtn.addActionListener(new ActionListener() {


            public void actionPerformed(ActionEvent e) {
            	//counter++;
            	final int i =1;           	
                final String bezeichnung = bezeichnungField.getText();
                final String selectedItem1 = (String)artAuswahl.getSelectedItem();
                final String selectedItem2 = (String)materialAuswahl.getSelectedItem();

                //String text = bezeichnung + ";  " + art + "\n";
                String eventText = i + ";" + bezeichnung + ";" + selectedItem1 + ";" + selectedItem2;

                fireDetailEvent(new DetailEvent(this, eventText));
[/code]

[JAVA=42]
detailsPanel.addDetailListener(new DetailListener() {
            public void detailEventOccurred(DetailEvent event) {
            	String [] eventText = event.getText().split(";");// Den zusammengesetzten Text wieder aufteilen
            	String i = eventText[0];
            	String bezeichnung = eventText[1];
                String art = eventText[2];
                String material = eventText[3];
                //String bezeichnung = event.getText();
                //String art = event.getText();
                //String material = event.getText();

                //textArea.append(name);

                try {
            		FileInputStream myInput = new FileInputStream("C:/Users/max/Desktop/Max/Studium/Master/00_Hiwi/20140307_Eclipse/140405_ActionListener/Excel.xls");
            	    POIFSFileSystem fileSystem = new POIFSFileSystem(myInput);
            	    HSSFWorkbook workbook = new HSSFWorkbook(fileSystem);
            	    HSSFSheet sheet = workbook.getSheetAt(0);




            		    System.out.println(sheet.getPhysicalNumberOfRows()); //return anzahl gefüllte Reihen
            		    int rows = sheet.getPhysicalNumberOfRows();
            		    HSSFRow row = sheet.createRow(rows);

            		    HSSFCell cellIndex = row.createCell(0); //soll Zelle in Spalte 1 erstellen
            		    cellIndex.setCellValue(i); //Wert der gesetzt werden soll.           		    
            		    HSSFCell cell = row.createCell(1); //soll Zelle in Spalte 1 erstellen
            		    cell.setCellValue(bezeichnung); //Wert der gesetzt werden soll.
[/code]

Mir kam die Idee, das über einen Click-Counter zu realisieren. Allerdings habe ich schnell gemerkt, dass das aufgrund des Zwangs von final nicht funktioniert. (The final local variable counter cannot be assigned, since it is defined in an enclosing typ). Auf der Suche, das Problem zu umgehen bin ich auf das hier gestoßen: 
http://www.java-forum.org/java-basi...not-assigned-since-defined-enclosing-typ.html
Ich bin aber nicht in der Lage das zum Laufen zu bringen, da ich a) nicht weiß, wo ich den Code einbinden soll und b) ich keine Ahnung hab, ob das so im Kontext der Excel Anwendung überhaupt funktioniert.


Meine zweite Frage ist vielmehr eine Verständnisfrage. Da ich erst seit zwei Wochen so richtig mit Java arbeite, habe ich zu Beginn für jedes Panel eine eigene Klasse erstellt. Bisher war der Button mit dem ActionListenerer immer in dem jeweiligen Panel (also derselben Klasse). Ich musste also viermal (für jedes Panel separat) den „Hinzufügen“-Button drücken. Zwecks Praktikabilität möchte ich durch einen einzigen Button in Panel 5 (Klasse 5) sämtliche Benutzereingaben in den Panels 1-4 in die Excel-Datei schreiben. Leider habe ich direkt feststellen müssen, dass ich auf bezeichnungField (Klasse 1) nicht zugreifen kann. Eigentlich sollte ich doch auf Objekte anderer Klassen zugreifen können, da bezeichnungField in der anderen Klasse (Panel 1) eine Klassenvariable darstellt. Gefunden hab ich zu diesem Thema vieles aber nichts, was ich verstanden habe.

Das ist der Code aus Klasse 5:

[JAVA=42]
JButton bestätigenBtn = new JButton("Eingaben bestätigen");        
        JButton verwerfenBtn = new JButton("Eingaben verwerfen");


        bestätigenBtn.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                final String bezeichnung = bezeichnungField.getText();
                final String selectedItem1 = (String)artAuswahl.getSelectedItem();
                final String selectedItem2 = (String)materialAuswahl.getSelectedItem();

                //String text = bezeichnung + ";  " + art + "\n";
                String eventText = bezeichnung + ";" + selectedItem1 + ";" + selectedItem2;

                fireDetailEvent(new DetailEvent(this, eventText));
[/code]

Der relevanten Codeausschnitt in Klasse 1:

[JAVA=42]
public class DetailsPanel extends JPanel {
	public DetailsPanel() {
        Dimension size = getPreferredSize();
        size.width = 500;
        size.height = 600;
        setPreferredSize(size);

        setBorder(BorderFactory.createTitledBorder("Basisdaten"));

        JLabel bezeichnungLabel = new JLabel("Bezeichung: ");
        JLabel artLabel = new JLabel("Art: ");
        JLabel artLabel2 = new JLabel("<html><body>(Geben Sie V für Verschnitt<br>oder P für Produkt ein.)</body></html>");
        JLabel materialLabel = new JLabel("Material: ");

        final JTextField bezeichnungField = new JTextField(8);       

        // Array für unsere JComboBox
        String comboBoxListe1[] = {"-","V","P",};

        //JComboBox mit Material-Einträgen wird erstellt
        final JComboBox artAuswahl = new JComboBox(comboBoxListe1);

        // Array für unsere JComboBox
        String comboBoxListe2[] = {"-","DC01", "DC03","DC04", "DC05", "DC06", "DC07", "DD11", "DD12", "DD13", "DD14", "DX51D", "DX52D", "DX53D", "DX54D", "DX55D", "DX56D", "DX57D", "DX58D",};

        //JComboBox mit Material-Einträgen wird erstellt
        final JComboBox materialAuswahl = new JComboBox(comboBoxListe2);
[/code]

Die Fehlermeldung lautet bezeichnungFieled cannot be resolved.



Vielen Dank im Voraus an jeden, der sich erbarmt und mir hilft.


----------



## FetterOtter (10. Apr 2014)

Hallo Tinga,

zuerst einmal das Problem mit dem Counter:
Dein Ansatz war gar nicht so verkehrt. Als erstes musst du bei der Deklaration von "counter" das "final" weglassen. "counter++" kommentierst du wieder ein, die Deklaration von "i" schmeißt du weg. Und

```
String eventText = i + ";" + bezeichnung + ";" + selectedItem1 + ";" + selectedItem2;
```
änderst du ab in

```
String eventText = String.valueOf(counter) + ";" + bezeichnung + ";" + selectedItem1 + ";" + selectedItem2;
```
Probier mal aus, ob das so funktioniert.

Den Rest muss ich mir in einer freien Minute mal genauer ansehen, oder einer der Cracks hier erbarmt sich...


----------



## FetterOtter (10. Apr 2014)

So, nun zu deinem zweiten Problem:

In den Klassen 1 - 4 sollten die Panel-Komponenten ruhig "private" sein und bleiben. Aber der Klasse 5 kannst du sie per Getter-Methode zur Verfügung stellen:

```
public JComboBox getArtAuswahl()
  {
    return artAuswahl;
  }
```
Und Klasse 5 könnte dann über diesen Getter auf die Variable zugreifen:

```
String selectedItem1 = (String)??.getArtAuswahl().getSelectedItem();
```
Wie du siehst, hat die Sache noch einen Haken: Die Fragezeichen musst du ersetzen durch den Namen der Instanz der Klasse 1.
Anhand deiner Codeschnipsel kann ich leider nicht sehen, wie die 4 Klassen miteinander "kommunizieren"... Aber Klasse 5 müsste irgendwie Instanzen der Klassen 1 - 4 vorhalten.


----------



## Tinga (10. Apr 2014)

Hallo FetterOtter,


ich glaube, dass ich noch einen Fehler in meinem Code entdeckt habe. Die Deklaration von „counter“ habe ich in die Methode „actionPerformed“ gepackt, sonst beschwert er sich über „cannot refer to a non-final variable inside an inner class defined in a different method“, wenn ich das „final“ bei der Deklaration von „counter“ weglasse. Den Rest habe ich so geändert wie von Dir vorgeschlagen.

Der Counter zählt allerdings nur ein einziges Mal hoch (von 0 auf 1, danach werden nur noch 1er ausgegeben; analog von 3 nach 4 und dann nur noch 4er). Ich habe auf meiner Suche das hier gefunden, weiß aber nicht inwieweit das hier anwendbar ist:

http://www.java-forum.org/java-basics-anfaenger-themen/158987-zaehler-funktioniert-android-app.html


----------



## FetterOtter (10. Apr 2014)

Urks, das mit der inneren Klasse habe ich übersehen...
Dadurch ist auch alles, was ich zu dem 2. Problem geschrieben habe, hinfällig. Ich fürchte, hier stoße ich an meine Grenzen, denn ich arbeite fast nie mit inneren Klassen...

Hoffe, in dem Thema ist jemand anderes fitter als ich !!


----------



## Tinga (10. Apr 2014)

Das ist natürlich ein herber Rückschlag für mich.

Ich versuche ohnehin schon, den Code zu vereinfachen damit ich mich leichter tue.

Sollte das Programm je nochmal in vereinfachter funktionsfähig sein, melde ich mich nochmal.

Trotzdem nochmal vielen, vielen Dank für Deine Mühe und die zahlreichen Hilfestellungen.


Tinga


----------



## FetterOtter (10. Apr 2014)

Bist du denn auf das Verwenden der inneren Klassen angewiesen? Ich kann ja sonst mal versuchen, dir in kurzen Worten zu beschreiben, wie ich die Listener verwende...

Also, meine Klasse5 würde den ActionListener implementieren.

```
public class Klasse5 implements ActionListener
```
Und den Button würde ich quasi "an mich selbst" hängen:

```
addBtn.addActionListener(this);
```
So, da Klasse5 den ActionListener implementiert, bin ich gezwungen, auch die actionPerformed-Methode zu implementieren, was bei mir etwa so aussähe:

```
public void actionPerformed(final ActionEvent e)
  {
    Object source = e.getSource();

    if (source == addBtn)
    {
      ...
    }
```
Und bei den Pünktchen machst du nun genau das, was deine innere Klasse bisher gemacht hätte.
Der Vorteil in meinen Augen ist, dass du nun auf alle Instanzvariablen der Klasse5 Zugriff hast.
Und über die Abfrage der Source, die dieses ActionEvent ausgelöst hat, könntest du in dieser actionPerformed-Methode auch weitere Komponenten des Panels unterbringen.
Ups, ich hoffe, das war halbwegs verständlich...


----------



## Tinga (10. Apr 2014)

Auf den ersten Blick bin ich ziemlich überfordert damit. Ich schaue es mir nachher genauer an, ansonsten muss ich mir etwas anderes überlegen. Vielen Dank auch dafür.


----------



## FetterOtter (10. Apr 2014)

Klasse 1:

```
public class DetailsPanel extends JPanel
{
  JLabel bezeichnungLabel = new JLabel("Bezeichung: ");
  JLabel artLabel = new JLabel("Art: ");
  JLabel artLabel2 = new JLabel("<html><body>(Geben Sie V für Verschnitt<br>oder P für Produkt ein.)</body></html>");
  JLabel materialLabel = new JLabel("Material: ");
  JTextField bezeichnungField = new JTextField(8);       
  // Array für unsere JComboBox
  String comboBoxListe1[] = {"-","V","P",};
  //JComboBox mit Material-Einträgen wird erstellt
  JComboBox artAuswahl = new JComboBox(comboBoxListe1);
  // Array für unsere JComboBox
  String comboBoxListe2[] = {"-","DC01", "DC03","DC04", "DC05", "DC06", "DC07", "DD11", "DD12", "DD13", "DD14", "DX51D", "DX52D", "DX53D", "DX54D", "DX55D", "DX56D", "DX57D", "DX58D",};
  //JComboBox mit Material-Einträgen wird erstellt
  JComboBox materialAuswahl = new JComboBox(comboBoxListe2);
   
  public DetailsPanel()
  {
    Dimension size = getPreferredSize();
    size.width = 500;
    size.height = 600;
    setPreferredSize(size);
    setBorder(BorderFactory.createTitledBorder("Basisdaten"));
  }
  public JTextField getBezeichnungField()
  {
    return bezeichnungField;
  }
  public JComboBox getArtAuswahl()
  {
    return artAuswahl;
  }
  public JComboBox getMaterialAuswahl()
  {
    return materialAuswahl;
  }
}
```
Und Klasse 5:

```
public class Klasse5 implements ActionListener
{
  JButton bestätigenBtn = new JButton("Eingaben bestätigen");        
  JButton verwerfenBtn = new JButton("Eingaben verwerfen");
  DetailsPanel dp;
  
  public Klasse5()
  {
    dp = new DetailsPanel();
    
    bestätigenBtn.addActionListener(this);
    verwerfenBtn.addActionListener(this);
  }
  public void actionPerformed(final ActionEvent e)
  {
    Object source = e.getSource();
    
    if (source == bestätigenBtn)
    {
      String bezeichnung = dp.getBezeichnungField().getText();
      String selectedItem1 = (String)dp.getArtAuswahl().getSelectedItem();
      String selectedItem2 = (String)dp.getMaterialAuswahl().getSelectedItem();
      String eventText = bezeichnung + ";" + selectedItem1 + ";" + selectedItem2;
      
      fireDetailEvent(new DetailEvent(this, eventText));
    }
    if (source == verwerfenBtn)
    {
      // Hier machst du das, was der der Button bewirken soll
    }
  }
}
```
Vielleicht ist da ja was zum Abkupfern dabei.
Schönes Wochenende, bin erst Montag wieder im Lande !!


----------



## Tinga (14. Apr 2014)

Hallo FetterOtter,



Dein letzter Post hat mich ein ganzes Stück weiter gebracht. Ich habe fast alles übernehmen können. Allerdings gibt es dabei noch ein Problem. Und zwar führt der Bestätigen-Button dazu, dass die Texteingabe im Bezeichnungs-Feld gar nicht und in den Combo-Boxen jeweils der oberste Wert in die Excel-Datei geschrieben wird unabhängig davon, was letztendlich ausgewählt wurde. Ich vermute, dass ich da von der Reihenfolge der Befehle irgendwas falsch mache und daher die vorselektierten Werte in die Excel geschrieben werden bevor die Eingabe/Auswahl erfolgt. Der Rest klappt allerdings einwandfrei (es wird in die richtigen Zellen geschrieben und anschließend wird in eine neue Zeile gewechselt). 

Ich bin mir an der Stelle nicht mehr wirklich sicher: Hast Du das „DetailsPanel“-Objekt in Deiner Klasse 5 „dp“ genannt, weil Du wegen den vielen Code-Schnipseln nicht wusstest, wie das Objekt der Klasse 1 bei mir heißt oder muss es anders heißen als das Objekt in Klasse 1. Ich habe das Objekt umbenannt und zwar genauso wie das erste Objekt („detailsPanel“). Beide Male (einmal mit „detailsPanel“ und einmal mit „dp“ in Klasse 5) wurde dasselbe Ergebnis generiert. Das sieht so aus:

Bezeichnung	Art	Material
                       -	       -
                       -	       -

Zur Info:
Ich bin nicht auf das Verwenden der inneren Klasse angewiesen. Ich habe sie aber in Klasse 1 („detailsPanel“) stehen gelassen. Die „action performed“-Methode dort bezieht sich ja ohnehin auf den Button dort und sollte daher nicht beeinflussen, was in Klasse 5 geschieht. Oder muss ich diesen Teil erst löschen?



Dazu habe ich noch ein recht kleines weiteres Problem: Und zwar betrifft es ca. Zeile 80 in der Klasse „MainFrame“. In Abhängigkeit von der ausgewählten Material-Art sollen in weiteren Spalten Materialkennwerte hinterlegt werden (z. B. Härte, Festigkeit etc.) Ich habe 2 Versuche unternommen. Der nicht auskommentierte Weg ist für mein Dafürhalten leichter umzusetzen, weil ich mir da programmiertechnisch weniger Gedanken machen muss. Solche if-Bedingungen bekomme ich dann schon noch hin. Überraschenderweise schreibt er nach Auswahl von „DC01“ in der ComboBox trotzdem 70 und 80 in die Zellen. 

Ich glaube nicht, dass RichStringCellValue an der Stelle etwas bringt. Vielmehr liegt es wohl daran, dass die if-Bedingung in der „action performed“-Methode mit drin steht. Von der Logik wäre es m. E. besser diese Bedingung danach zu prüfen. Dort sind die Zellen aber nicht mehr greifbar, weil die Variablen nur innerhalb des try-catch Blocks gültig sind. Habe noch nie ein Programm geschrieben, das über 20 bis 30 Zeilen hinausgeht, von daher verliere ich hier gelegentlich die Übersicht und muss sogar solche Fragen stellen. 

Den Weg über die „bedingte Formatierung“ mittels WENN-Bedingung wie in Excel habe ich nicht weiterverfolgt, da es mir nach ausführlicher Suche und Lektüre von Problembeschreibungen zu kompliziert erschien.



Hoffe, Du kannst mir auch hier weitehelfen. Vielen Dank schonmal für Deine Hilfe.


Ich hänge hier noch zur Sicherheit mal die vollständigen Klassen an.



DetailsPanel5 (das ist Klasse 5)

[JAVA=42]
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;


public class DetailsPanel5 extends JPanel implements ActionListener {


	private static final long serialVersionUID = -1542367018761084314L;

	JLabel rückmeldungLabel = new JLabel("Rückmeldung an den Benutzer: ");

    final JTextArea fehlerAusgabeArea = new JTextArea(15,20);
    //fehlerAusgabeArea.setVisible(true);

    JButton bestätigenBtn = new JButton("Eingaben bestätigen");        
    JButton verwerfenBtn = new JButton("Eingaben verwerfen");
    DetailsPanel detailsPanel;

	public DetailsPanel5 () {
		Dimension size = getPreferredSize();
        size.width = 1000;
        size.height = 100;
        setPreferredSize(size);

        setBorder(BorderFactory.createTitledBorder("Eingaben bestätigen / verwerfen"));

        detailsPanel = new DetailsPanel();

        bestätigenBtn.addActionListener(this);
        verwerfenBtn.addActionListener(this);





        /**
        bestätigenBtn.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                final String bezeichnung = bezeichnungField.getText();
                final String selectedItem1 = (String)artAuswahl.getSelectedItem();
                final String selectedItem2 = (String)materialAuswahl.getSelectedItem();

                //String text = bezeichnung + ";  " + art + "\n";
                String eventText = bezeichnung + ";" + selectedItem1 + ";" + selectedItem2;

                fireDetailEvent(new DetailEvent(this, eventText));
                //fireDetailEvent(new DetailEvent(this, bezeichnung));
                //fireDetailEvent(new DetailEvent(this, art));
                //fireDetailEvent(new DetailEvent(this, selectedItem));        
            }
        });
        **/

        setLayout(new GridBagLayout());

		GridBagConstraints gc = new GridBagConstraints();

		//Es gibt nur eine Spalte 

		gc.anchor = GridBagConstraints.LINE_START;
        gc.weightx = 0.5;
        gc.weighty = 0.5;

        gc.gridx = 0;
        gc.gridy = 1;
        add(rückmeldungLabel, gc);

        gc.gridx = 0;
        gc.gridy = 2;
        add(fehlerAusgabeArea, gc);

        // Final row
        gc.weighty = 10;

        gc.gridx = 0;
        gc.gridy = 3;
        add(bestätigenBtn, gc);

        gc.anchor = GridBagConstraints.FIRST_LINE_START;
        gc.gridx = 0;
        gc.gridy = 4;
        add(verwerfenBtn, gc);       

	}

	public void actionPerformed(ActionEvent e) {

		Object source = e.getSource();

	    if (source == bestätigenBtn)
	    {
	      String bezeichnung = detailsPanel.getBezeichnungField().getText();
	      String selectedItem1 = (String)detailsPanel.getArtAuswahl().getSelectedItem();
	      String selectedItem2 = (String)detailsPanel.getMaterialAuswahl().getSelectedItem();
	      String eventText = bezeichnung + ";" + selectedItem1 + ";" + selectedItem2;

	      fireDetailEvent(new DetailEvent(this, eventText));
	    }
	    if (source == verwerfenBtn)
	    {
	      detailsPanel.getBezeichnungField().setText("");
	    }
	}



	public void fireDetailEvent(DetailEvent event) {
        Object[] listeners = listenerList.getListenerList();

        for(int i=0; i < listeners.length; i += 2) {
            if(listeners_ == DetailListener.class) {
                ((DetailListener)listeners[i+1]).detailEventOccurred(event);
            }
        }
    }

    public void addDetailListener(DetailListener listener) {
        listenerList.add(DetailListener.class, listener);
    }

    public void removeDetailListener(DetailListener listener) {
        listenerList.remove(DetailListener.class, listener);
    }
}
[/code]



DetailsPanel (bisher Klasse 1 genannt)
[JAVA=42]
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class DetailsPanel extends JPanel {

	JLabel bezeichnungLabel = new JLabel("Bezeichung: ");
    JLabel artLabel = new JLabel("Art: ");
    JLabel artLabel2 = new JLabel("<html><body>(Geben Sie V für Verschnitt<br>oder P für Produkt ein.)</body></html>");
    JLabel materialLabel = new JLabel("Material: ");

    final JTextField bezeichnungField = new JTextField(8);       

    // Array für unsere JComboBox
    String comboBoxListe1[] = {"-","V","P",};

    //JComboBox mit Material-Einträgen wird erstellt
    final JComboBox artAuswahl = new JComboBox(comboBoxListe1);


    // Array für unsere JComboBox
    String comboBoxListe2[] = {"-", "DC01", "DC03","DC04", "DC05", "DC06", "DC07", "DD11", "DD12", "DD13", "DD14", "DX51D", "DX52D", "DX53D", "DX54D", "DX55D", "DX56D", "DX57D", "DX58D",};

    //JComboBox mit Material-Einträgen wird erstellt
    final JComboBox materialAuswahl = new JComboBox(comboBoxListe2);

	public DetailsPanel() {
        Dimension size = getPreferredSize();
        size.width = 500;
        size.height = 600;
        setPreferredSize(size);

        setBorder(BorderFactory.createTitledBorder("Basisdaten"));





        JButton addBtn = new JButton("Hinzufügen");



        addBtn.addActionListener(new ActionListener() {


            public void actionPerformed(ActionEvent e) {
            	//int counter = 3;
            	//counter++;
            	//String eventText = String.valueOf(counter) +...          	
                final String bezeichnung = bezeichnungField.getText();
                final String selectedItem1 = (String)artAuswahl.getSelectedItem();
                final String selectedItem2 = (String)materialAuswahl.getSelectedItem();

                //String text = bezeichnung + ";  " + art + "\n";
                String eventText = bezeichnung + ";" + selectedItem1 + ";" + selectedItem2;

                fireDetailEvent(new DetailEvent(this, eventText));
                //fireDetailEvent(new DetailEvent(this, bezeichnung));
                //fireDetailEvent(new DetailEvent(this, art));
                //fireDetailEvent(new DetailEvent(this, selectedItem));


            }
        });



        setLayout(new GridBagLayout());

        GridBagConstraints gc = new GridBagConstraints();

        //// First column /////////////////////////

        gc.anchor = GridBagConstraints.LINE_END;
        gc.weightx = 0.5;
        gc.weighty = 0.5;

        gc.gridx = 0;
        gc.gridy = 0;
        add(bezeichnungLabel, gc);

        gc.gridx = 0;
        gc.gridy = 1;
        add(artLabel, gc);

        gc.gridx = 0;
        gc.gridy = 3;
        add(materialLabel, gc);

        //// Second column
        gc.anchor = GridBagConstraints.LINE_START;

        gc.gridx = 1;
        gc.gridy = 0;
        add(bezeichnungField, gc);

        gc.gridx = 1;
        gc.gridy = 1;
        add(artAuswahl, gc);

        gc.gridx = 1;
        gc.gridy = 2;
        add(artLabel2, gc);

        gc.gridx = 1;
        gc.gridy = 3;
        add(materialAuswahl, gc);

        // Final row
        gc.weighty = 10;

        gc.anchor = GridBagConstraints.FIRST_LINE_START;
        gc.gridx = 1;
        gc.gridy = 4;
        add(addBtn, gc);     
    }

	public JTextField getBezeichnungField()
	  {
	    return bezeichnungField;
	  }
	public JComboBox getArtAuswahl()
	  {
	    return artAuswahl;
	  }
	  public JComboBox getMaterialAuswahl()
	  {
	    return materialAuswahl;
	  }



	public void fireDetailEvent(DetailEvent event) {
        Object[] listeners = listenerList.getListenerList();

        for(int i=0; i < listeners.length; i += 2) {
            if(listeners == DetailListener.class) {
                ((DetailListener)listeners[i+1]).detailEventOccurred(event);
            }
        }
    }

    public void addDetailListener(DetailListener listener) {
        listenerList.add(DetailListener.class, listener);
    }

    public void removeDetailListener(DetailListener listener) {
        listenerList.remove(DetailListener.class, listener);
    }

}
[/code]_


----------



## Tinga (14. Apr 2014)

MainFrame (das ist so ein bisschen die zentrale Klasse)
[JAVA=42]
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;


public class MainFrame extends JFrame {

	private DetailsPanel detailsPanel;
	private DetailsPanel2 detailsPanel2;
	private DetailsPanel3 detailsPanel3;
	private DetailsPanel4 detailsPanel4;
	private DetailsPanel5 detailsPanel5;


	public MainFrame(String title) {
        super(title);

        // Set layout manager
        setLayout(new GridLayout(1,4));

        // Create Swing component
        final JTextArea textArea = new JTextArea();
        JButton button = new JButton("Click me!");

        detailsPanel = new DetailsPanel();

        detailsPanel.addDetailListener(new DetailListener() {
            public void detailEventOccurred(DetailEvent event) {
            	String [] eventText = event.getText().split(";");// Den zusammengesetzten Text wieder aufteilen
            	//String index = eventText[0];
            	String bezeichnung = eventText[0];
                String art = eventText[1];
                String material = eventText[2];
                //String bezeichnung = event.getText();
                //String art = event.getText();
                //String material = event.getText();

                //textArea.append(name);

                try {
            		FileInputStream myInput = new FileInputStream("C:/Users/max/Desktop/Max/Studium/Master/00_Hiwi/20140307_Eclipse/140405_ActionListener/Excel.xls");
            	    POIFSFileSystem fileSystem = new POIFSFileSystem(myInput);
            	    HSSFWorkbook workbook = new HSSFWorkbook(fileSystem);
            	    HSSFSheet sheet = workbook.getSheetAt(0);




            		    System.out.println(sheet.getPhysicalNumberOfRows()); //return anzahl gefüllte Reihen
            		    int rows = sheet.getPhysicalNumberOfRows();
            		    HSSFRow row = sheet.createRow(rows);

            		    HSSFCell cellIndex = row.createCell(0); //soll Zelle in Spalte 0 erstellen
            		    //cellIndex.setCellValue(index); //Wert der gesetzt werden soll.           		    
            		    HSSFCell cell = row.createCell(1); //soll Zelle in Spalte 1 erstellen
            		    cell.setCellValue(bezeichnung); //Wert der gesetzt werden soll.
            		    HSSFCell cell1 = row.createCell(2); //soll Zelle in Spalte 2 erstellen
            		    cell1.setCellValue(art); //Wert der gesetzt werden soll.
            		    final HSSFCell cell2 = row.createCell(3); //soll Zelle in Spalte 3 erstellen
            		    cell2.setCellValue(material); //Wert der gesetzt werden soll.
            		    final HSSFCell cell3 = row.createCell(13); //soll Zelle in Spalte 13 erstellen
            		    final HSSFCell cell4 = row.createCell(14); //soll Zelle in Spalte 14 erstellen




            		    if (cell2.getStringCellValue() == "DC01") {
            		    	cell3.setCellValue("50");
            		    	cell4.setCellValue("60");
            		    } else {
            		    	cell3.setCellValue("70");
            		    	cell4.setCellValue("80");
            		    }


            		    //cell3.setCellFormula("=WENN($D5="DC01";1;WENN($D5="DC02";2;0))");

            		    FileOutputStream myOutput = new FileOutputStream(new File("C:/Users/max/Desktop/Max/Studium/Master/00_Hiwi/20140307_Eclipse/140405_ActionListener/Excel.xls"));  
            		    workbook.write(myOutput);
            		    myOutput.close();
            		} catch (Exception ex) {

            		};


            }
        });

        detailsPanel2 = new DetailsPanel2();


		detailsPanel2.addDetailListener(new DetailListener() {
            public void detailEventOccurred(DetailEvent event) {
            	String [] eventText2 = event.getText().split(";");   // Den zusammengesetzten Text wieder aufteilen
                String länge = eventText2[0];
                String breite = eventText2[1];
                String höhe = eventText2[2];
                String fläche = eventText2[3];
                String volumen = eventText2[4];

                //String bezeichnung = event.getText();
                //String art = event.getText();
                //String material = event.getText();

                //textArea.append(name);

                try {
            		FileInputStream myInput = new FileInputStream("C:/Users/max/Desktop/Max/Studium/Master/00_Hiwi/20140307_Eclipse/140405_ActionListener/Excel.xls");
            	    POIFSFileSystem fileSystem = new POIFSFileSystem(myInput);
            	    HSSFWorkbook workbook = new HSSFWorkbook(fileSystem);
            	    HSSFSheet sheet = workbook.getSheetAt(0);




            		    System.out.println(sheet.getPhysicalNumberOfRows()); //return anzahl gefüllte Reihen
            		    int rows = sheet.getPhysicalNumberOfRows();
            		    HSSFRow row = sheet.createRow(rows);
            		    HSSFCell cell = row.createCell(4); //soll Zelle in Spalte 4 erstellen
            		    cell.setCellValue(länge); //Wert der gesetzt werden soll.
            		    HSSFCell cell1 = row.createCell(5); //soll Zelle in Spalte 5 erstellen
            		    HSSFCell cell2 = row.createCell(6); //soll Zelle in Spalte 6 erstellen
            		    cell2.setCellValue(breite); //Wert der gesetzt werden soll.
            		    HSSFCell cell3 = row.createCell(7); //soll Zelle in Spalte 7 erstellen
            		    HSSFCell cell4 = row.createCell(8); //soll Zelle in Spalte 8 erstellen
            		    cell4.setCellValue(höhe); //Wert der gesetzt werden soll.
            		    HSSFCell cell5 = row.createCell(9); //soll Zelle in Spalte 9 erstellen
            		    HSSFCell cell6 = row.createCell(10); //soll Zelle in Spalte 10 erstellen
            		    cell6.setCellValue(fläche); //Wert der gesetzt werden soll.
            		    HSSFCell cell7 = row.createCell(11); //soll Zelle in Spalte 11 erstellen
            		    cell7.setCellValue(volumen); //Wert der gesetzt werden soll.


            		    FileOutputStream myOutput = new FileOutputStream(new File("C:/Users/max/Desktop/Max/Studium/Master/00_Hiwi/20140307_Eclipse/140405_ActionListener/Excel.xls"));  
            		    workbook.write(myOutput);
            		    myOutput.close();
            		} catch (Exception ex) {

            		};
            }
        });


		detailsPanel3 = new DetailsPanel3();

		detailsPanel3.addDetailListener(new DetailListener() {
            public void detailEventOccurred(DetailEvent event) {
            	String [] eventText3 = event.getText().split(";");   // Den zusammengesetzten Text wieder aufteilen
                String beschichtung = eventText3[0];
                String verunreinigung = eventText3[1];

                //String bezeichnung = event.getText();
                //String art = event.getText();
                //String material = event.getText();

                //textArea.append(name);

                try {
            		FileInputStream myInput = new FileInputStream("C:/Users/max/Desktop/Max/Studium/Master/00_Hiwi/20140307_Eclipse/140405_ActionListener/Excel.xls");
            	    POIFSFileSystem fileSystem = new POIFSFileSystem(myInput);
            	    HSSFWorkbook workbook = new HSSFWorkbook(fileSystem);
            	    HSSFSheet sheet = workbook.getSheetAt(0);




            		    System.out.println(sheet.getPhysicalNumberOfRows()); //return anzahl gefüllte Reihen
            		    int rows = sheet.getPhysicalNumberOfRows();
            		    HSSFRow row = sheet.createRow(rows);

            		    HSSFCell cell1 = row.createCell(13); //soll Zelle in Spalte 13 erstellen
            		    HSSFCell cell2 = row.createCell(14); //soll Zelle in Spalte 14 erstellen
            		    HSSFCell cell3 = row.createCell(15); //soll Zelle in Spalte 15 erstellen
            		    HSSFCell cell4 = row.createCell(16); //soll Zelle in Spalte 16 erstellen
            		    HSSFCell cell5 = row.createCell(17); //soll Zelle in Spalte 17 erstellen
            		    HSSFCell cell6 = row.createCell(18); //soll Zelle in Spalte 18 erstellen
            		    HSSFCell cell7 = row.createCell(19); //soll Zelle in Spalte 19 erstellen
            		    HSSFCell cell8 = row.createCell(20); //soll Zelle in Spalte 20 erstellen
            		    HSSFCell cell9 = row.createCell(21); //soll Zelle in Spalte 21 erstellen
            		    HSSFCell cell10 = row.createCell(22); //soll Zelle in Spalte 22 erstellen
            		    HSSFCell cell11 = row.createCell(23); //soll Zelle in Spalte 23 erstellen
            		    HSSFCell cell12 = row.createCell(23); //soll Zelle in Spalte 24 erstellen
            		    HSSFCell cell13 = row.createCell(25); //soll Zelle in Spalte 25 erstellen
            		    HSSFCell cell14 = row.createCell(26); //soll Zelle in Spalte 26 erstellen
            		    HSSFCell cell15 = row.createCell(27); //soll Zelle in Spalte 27 erstellen
            		    HSSFCell cell16 = row.createCell(28); //soll Zelle in Spalte 28 erstellen
            		    HSSFCell cell17 = row.createCell(29); //soll Zelle in Spalte 29 erstellen
            		    HSSFCell cell18 = row.createCell(30); //soll Zelle in Spalte 30 erstellen
            		    HSSFCell cell19 = row.createCell(31); //soll Zelle in Spalte 31 erstellen
            		    HSSFCell cell20 = row.createCell(32); //soll Zelle in Spalte 32 erstellen
            		    HSSFCell cell21 = row.createCell(33); //soll Zelle in Spalte 33 erstellen
            		    HSSFCell cell22 = row.createCell(34); //soll Zelle in Spalte 34 erstellen
            		    HSSFCell cell23 = row.createCell(35); //soll Zelle in Spalte 35 erstellen
            		    HSSFCell cell24 = row.createCell(36); //soll Zelle in Spalte 36 erstellen
            		    HSSFCell cell25 = row.createCell(37); //soll Zelle in Spalte 37 erstellen
            		    HSSFCell cell26 = row.createCell(38); //soll Zelle in Spalte 38 erstellen
            		    HSSFCell cell27 = row.createCell(39); //soll Zelle in Spalte 39 erstellen
            		    HSSFCell cell28 = row.createCell(40); //soll Zelle in Spalte 40 erstellen
            		    HSSFCell cell29 = row.createCell(41); //soll Zelle in Spalte 41 erstellen
            		    HSSFCell cell30 = row.createCell(42); //soll Zelle in Spalte 42 erstellen
            		    HSSFCell cell31 = row.createCell(43); //soll Zelle in Spalte 43 erstellen
            		    HSSFCell cell32 = row.createCell(44); //soll Zelle in Spalte 44 erstellen
            		    cell32.setCellValue(beschichtung); //Wert der gesetzt werden soll.
            		    HSSFCell cell33 = row.createCell(45); //soll Zelle in Spalte 45 erstellen
            		    HSSFCell cell34 = row.createCell(46); //soll Zelle in Spalte 46 erstellen
            		    HSSFCell cell35 = row.createCell(47); //soll Zelle in Spalte 47 erstellen
            		    HSSFCell cell36 = row.createCell(48); //soll Zelle in Spalte 48 erstellen   
            		    cell36.setCellValue(verunreinigung); //Wert der gesetzt werden soll.



            		    FileOutputStream myOutput = new FileOutputStream(new File("C:/Users/max/Desktop/Max/Studium/Master/00_Hiwi/20140307_Eclipse/140405_ActionListener/Excel.xls"));  
            		    workbook.write(myOutput);
            		    myOutput.close();
            		} catch (Exception ex) {

            		};


            }
        });


		detailsPanel4 = new DetailsPanel4();

		detailsPanel4.addDetailListener(new DetailListener() {
            public void detailEventOccurred(DetailEvent event) {


            	String [] eventText4 = event.getText().split(";");   // Den zusammengesetzten Text wieder aufteilen
                final String hersteller = eventText4[0];
                final String straße = eventText4[1];
                final String hausnummer = eventText4[2];
                final String plz = eventText4[3];
                final String stadt = eventText4[4];
                final String ansprechpartner = eventText4[5];
                final String telefon = eventText4[6];
                final String email = eventText4[7];
                final String gültigkeit1 = eventText4[8];
                final String gültigkeit2 = eventText4[9];

                //String bezeichnung = event.getText();
                //String art = event.getText();
                //String material = event.getText();

                //textArea.append(name);


                try {
            		FileInputStream myInput = new FileInputStream("C:/Users/max/Desktop/Max/Studium/Master/00_Hiwi/20140307_Eclipse/140405_ActionListener/Excel.xls");
            	    POIFSFileSystem fileSystem = new POIFSFileSystem(myInput);
            	    HSSFWorkbook workbook = new HSSFWorkbook(fileSystem);
            	    HSSFSheet sheet = workbook.getSheetAt(0);




            		    System.out.println(sheet.getPhysicalNumberOfRows()); //return anzahl gefüllte Reihen
            		    int rows = sheet.getPhysicalNumberOfRows();
            		    HSSFRow row = sheet.createRow(rows);
            		    HSSFCell cell = row.createCell(49); //soll Zelle in Spalte 49 erstellen
            		    HSSFCell cell1 = row.createCell(50); //soll Zelle in Spalte 50 erstellen
            		    cell1.setCellValue(hersteller); //Wert der gesetzt werden soll.
            		    HSSFCell cell2 = row.createCell(51); //soll Zelle in Spalte 51 erstellen
            		    cell2.setCellValue(straße); //Wert der gesetzt werden soll.
            		    HSSFCell cell3 = row.createCell(52); //soll Zelle in Spalte 52 erstellen
            		    cell3.setCellValue(hausnummer); //Wert der gesetzt werden soll.
            		    HSSFCell cell4 = row.createCell(53); //soll Zelle in Spalte 53 erstellen
            		    cell4.setCellValue(plz); //Wert der gesetzt werden soll.
            		    HSSFCell cell5 = row.createCell(54); //soll Zelle in Spalte 54 erstellen
            		    cell5.setCellValue(stadt); //Wert der gesetzt werden soll.
            		    HSSFCell cell6 = row.createCell(55); //soll Zelle in Spalte 55 erstellen
            		    cell6.setCellValue(ansprechpartner); //Wert der gesetzt werden soll.
            		    HSSFCell cell7 = row.createCell(56); //soll Zelle in Spalte 56 erstellen
            		    cell7.setCellValue(telefon); //Wert der gesetzt werden soll.
            		    HSSFCell cell8 = row.createCell(57); //soll Zelle in Spalte 57 erstellen
            		    HSSFCell cell9 = row.createCell(58); //soll Zelle in Spalte 58 erstellen
            		    cell9.setCellValue(email); //Wert der gesetzt werden soll.
            		    HSSFCell cell10 = row.createCell(59); //soll Zelle in Spalte 59 erstellen
            		    HSSFCell cell11 = row.createCell(60); //soll Zelle in Spalte 60 erstellen
            		    HSSFCell cell12 = row.createCell(61); //soll Zelle in Spalte 61 erstellen
            		    HSSFCell cell13 = row.createCell(62); //soll Zelle in Spalte 62 erstellen
            		    HSSFCell cell14 = row.createCell(63); //soll Zelle in Spalte 63 erstellen
            		    HSSFCell cell15 = row.createCell(64); //soll Zelle in Spalte 64 erstellen
            		    HSSFCell cell16 = row.createCell(65); //soll Zelle in Spalte 65 erstellen
            		    cell16.setCellValue(gültigkeit1); //Wert der gesetzt werden soll.
            		    HSSFCell cell17 = row.createCell(66); //soll Zelle in Spalte 66 erstellen
            		    HSSFCell cell18 = row.createCell(67); //soll Zelle in Spalte 67 erstellen
            		    cell18.setCellValue(gültigkeit2); //Wert der gesetzt werden soll.




            		    FileOutputStream myOutput = new FileOutputStream(new File("C:/Users/max/Desktop/Max/Studium/Master/00_Hiwi/20140307_Eclipse/140405_ActionListener/Excel.xls"));  
            		    workbook.write(myOutput);
            		    myOutput.close();
            		} catch (Exception ex) {

            		};


            }
        });

		detailsPanel5 = new DetailsPanel5();
		detailsPanel5.setBackground(Color.LIGHT_GRAY);

		detailsPanel5.addDetailListener(new DetailListener() {
            public void detailEventOccurred(DetailEvent event) {
            	String [] eventText = event.getText().split(";");// Den zusammengesetzten Text wieder aufteilen
            	//String index = eventText[0];
            	String bezeichnung = eventText[0];
                String art = eventText[1];
                String material = eventText[2];
                //String bezeichnung = event.getText();
                //String art = event.getText();
                //String material = event.getText();

                //textArea.append(name);

                try {
            		FileInputStream myInput = new FileInputStream("C:/Users/max/Desktop/Max/Studium/Master/00_Hiwi/20140307_Eclipse/140405_ActionListener/Excel.xls");
            	    POIFSFileSystem fileSystem = new POIFSFileSystem(myInput);
            	    HSSFWorkbook workbook = new HSSFWorkbook(fileSystem);
            	    HSSFSheet sheet = workbook.getSheetAt(0);




            		    System.out.println(sheet.getPhysicalNumberOfRows()); //return anzahl gefüllte Reihen
            		    int rows = sheet.getPhysicalNumberOfRows();
            		    HSSFRow row = sheet.createRow(rows);

            		    HSSFCell cellIndex = row.createCell(0); //soll Zelle in Spalte 0 erstellen           		              		    
            		    HSSFCell cell = row.createCell(1); //soll Zelle in Spalte 1 erstellen
            		    cell.setCellValue(bezeichnung); //Wert der gesetzt werden soll.
            		    HSSFCell cell1 = row.createCell(2); //soll Zelle in Spalte 2 erstellen
            		    cell1.setCellValue(art); //Wert der gesetzt werden soll.
            		    HSSFCell cell2 = row.createCell(3); //soll Zelle in Spalte 3 erstellen
            		    cell2.setCellValue(material); //Wert der gesetzt werden soll.


            		    FileOutputStream myOutput = new FileOutputStream(new File("C:/Users/max/Desktop/Max/Studium/Master/00_Hiwi/20140307_Eclipse/140405_ActionListener/Excel.xls"));  
            		    workbook.write(myOutput);
            		    myOutput.close();
            		} catch (Exception ex) {

            		};


            }
        });
		//detailsPanel5.setLayout(BorderLayout.SOUTH);

		//final JTextArea fehlerAusgabeArea = new JTextArea(1,4);
		//detailsPanel5.add(fehlerAusgabeArea);

        // Add Swing components to content pane
        Container c = getContentPane();

        c.add(detailsPanel, BorderLayout.WEST);
		c.add(detailsPanel2, BorderLayout.CENTER);
		//setLayout (new BorderLayout());
		c.add(detailsPanel3, BorderLayout.EAST);
		c.add(detailsPanel4, BorderLayout.EAST);
		c.add(detailsPanel5, BorderLayout.PAGE_END);



        // Add behaviour
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                //textArea.append("Hello\n");

            }

        });
    }
}
[/code]


Mir ist bewusst, dass das alles recht schlampig ausschaut. Liegt aber nicht an meinem Willen, anständig zu programmieren sondern vielmehr an meinem Unvermögen. Eigentlich bin ich sehr ordentlich in allem, was ich mache aber hier bin ich schon so oft nicht weitergekommen und habe dann einfach solange rumprobiert, bis es läuft und dann sieht es eben so aus.


----------



## FetterOtter (14. Apr 2014)

Moin Tinga,

oha, ich glaube, ich muss das Feld noch einmal von ganz vorne aufrollen...
Für mich zum Verständnis:
- Du hast das MainFrame. Dieses soll 5 Panels und einen Bestätigungs-Button beinhalten.
- In allen Panels soll man auswählen, schreiben etc. können.
- Ist man mit allem fertig, klickt man auf den Bestätigungs-Button, und alles soll in der Excel-Tabelle gespeichert werden.

Oder soll jedes Panel einen Button haben, und pro Panel wird in eine unterschiedliche Datei geschrieben?
Da mir ein paar Klassen fehlen, kann ich das bei mir leider nicht starten...

Jedenfalls hast du deinen Panels die DetailListener wieder als innere Klassen angehängt, weshalb du immer die Startwerte ausgibst...


----------



## Tinga (14. Apr 2014)

Hallo FetterOtter,



sorry, dass ich den Kontext nicht besser umrissen habe. Ich poste im Anschluss noch die fehlenden Klassen, damit Du es Dir selbst ansehen kannst.

Es gibt das MainFrame, das die 5 Panels enthält. Ursprünglich waren es nur 4 Panels. In diesen 4 Panels können Eingaben vorgenommen werden. Momentan besitzt jedes Panel auch noch einen eigenen separaten Button mit dem die Werte in verschiedene Spalten der Excel-Datei geschrieben werden. Die erste Klasse („detailsPanel“) von der wir immer gesprochen haben füllt beispielsweise die Spalten B bis D mit „Bezeichnung“, „Art“ und „Material“. Klasse 2 („detailsPanel2“) dann die Spalten E bis M etc. .

Da ich im Endeffekt aber nicht 4 Buttons betätigen möchte, sondern nur einen einzigen, gibt es die Klasse 5. Darin können keine Eingaben vorgenommen werden. Es soll dort nur einen einzigen Bestätigen-Button geben, der die anderen 4 ersetzt und die Eingaben aus den ersten 4 Panels auf einmal in eine Zeile der Excel-Datei schreibt.

Die Buttons in den ersten 4 Klassen dienen nur noch der Sicherheit. Ich will damit nachprüfen können, dass ich das Programm bei fehlerhaften Änderungen nicht vollständig zerschieße. Wenn der Button in Klasse 5 funktioniert, möchte ich die Buttons in Klasse 1 bis 4 und damit verbunden auch die inneren ActionListener löschen.

Zum Thema „DetailListener“ als innere Klasse angehängt: Den „DetailListener“ brauche ich eigentlich nur noch in Klasse 5 wenn ich die Buttons 1 bis 4 lösche und dort dachte ich, dass ich Deine Idee aus Post #11 und #13 umgesetzt habe. Außerdem gibt es auch noch eine eigenständige Klasse „DetailListener“, die ich Dir noch nicht gezeigt habe. Ich hoffe, es wird klarer, wenn ich den ganzen Code poste. Die Syntax dazu stammt nicht von mir, die habe ich aus einem Youtube-Tutorial: 

Advanced Java: Swing (GUI) Programming Part 1 -- A Basic Swing Application - YouTube 

Damit habe ich mich dem Thema GUI so ein bisschen genähert. Verständnis dafür, warum das gerade so gelöst wurde, habe ich nicht. Ich habe erst im Nachhinein als Du mich auf das Thema aufmerksam gemacht hast, gemerkt, dass der ActionListener häufig anders und zwar wie von Dir vorgeschlagen verwendet wird.


----------



## Tinga (14. Apr 2014)

Klasse 2 = DetailsPanel2
[JAVA=42]
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.text.AbstractDocument;


public class DetailsPanel2 extends JPanel {
	public DetailsPanel2 () {
		Dimension size = getPreferredSize();
		size.width = 500;
		size.height = 600;
		setPreferredSize(size);

		setBorder(BorderFactory.createTitledBorder("Geometrie"));

		JLabel längeLabel = new JLabel("Länge [in m]: ");
		JLabel breiteLabel = new JLabel("Breite [in m]: ");
		JLabel höheLabel = new JLabel("Höhe [in m]: ");
		JLabel flächeLabel = new JLabel("Fläche [in m²]: ");
		JLabel volumenLabel = new JLabel("Volumen [in m³]: ");

		final JTextField längeField = new JTextField(8);
		( ( AbstractDocument ) längeField.getDocument()).setDocumentFilter( new DocumentSizeFilter( 6, DocumentSizeFilter.DECIMAL_PATTERN ) );
		final JTextField breiteField = new JTextField(8);
		( ( AbstractDocument ) breiteField.getDocument()).setDocumentFilter( new DocumentSizeFilter( 6, DocumentSizeFilter.DECIMAL_PATTERN ) );
		final JTextField höheField = new JTextField(8);
		( ( AbstractDocument ) höheField.getDocument()).setDocumentFilter( new DocumentSizeFilter( 6, DocumentSizeFilter.DECIMAL_PATTERN ) );
		final JTextField flächeField = new JTextField(8);
		( ( AbstractDocument ) flächeField.getDocument()).setDocumentFilter( new DocumentSizeFilter( 6, DocumentSizeFilter.DECIMAL_PATTERN ) );
		final JTextField volumenField = new JTextField(8);
		( ( AbstractDocument ) volumenField.getDocument()).setDocumentFilter( new DocumentSizeFilter( 6, DocumentSizeFilter.DECIMAL_PATTERN ) );


		JButton cadBtn = new JButton("CAD-Datei auswählen");
		JButton addBtn = new JButton("Hinzufügen");

		cadBtn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JFileChooser fc = new JFileChooser();
				fc.showSaveDialog(null);
				File file =fc.getSelectedFile();
				System.out.println(file.getPath());



				try {
					FileOutputStream fout = new FileOutputStream(new File("C:/Users/max/Desktop/Max/Studium/Master/00_Hiwi/20140307_Eclipse/140405_ActionListener/CAD-Modelle/Klotz.prt"));
				} catch (FileNotFoundException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}

				//file.write(fout);
				//file.close();
						/**
						file.createNewFile();
						//file.write(fout);
						//fout.close();
						**/



			}
		});



		addBtn.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                final String länge = längeField.getText();
                final String breite = breiteField.getText();
                final String höhe = höheField.getText();
                final String fläche = flächeField.getText();
                final String volumen = volumenField.getText();

                //String text = bezeichnung + ";  " + art + "\n";
                String eventText2 = länge + ";" + breite + ";" + höhe + ";" + fläche + ";" + volumen;

                fireDetailEvent(new DetailEvent(this, eventText2));
                //fireDetailEvent(new DetailEvent(this, bezeichnung));
                //fireDetailEvent(new DetailEvent(this, art));
                //fireDetailEvent(new DetailEvent(this, selectedItem));


            }
        });

		setLayout(new GridBagLayout());

		GridBagConstraints gc = new GridBagConstraints();


		////// Erste Spalte ///////////////////////////////////

		gc.anchor = GridBagConstraints.LINE_END;
		gc.weightx = 0.5;
		gc.weighty = 0.5;


		gc.gridx = 0;
		gc.gridy = 0;
		add(längeLabel, gc);

		gc.gridx = 0;
		gc.gridy = 1;
		add(breiteLabel, gc);

		gc.gridx = 0;
		gc.gridy = 2;
		add(höheLabel, gc);

		gc.gridx = 0;
		gc.gridy = 3;
		add(flächeLabel, gc);

		gc.gridx = 0;
		gc.gridy = 4;
		add(volumenLabel, gc);

		////// Zweite Spalte ////////////////////////////////////

		gc.anchor = GridBagConstraints.LINE_START;
		gc.gridx = 1;
		gc.gridy = 0;
		add(längeField, gc);

		gc.gridx = 1;
		gc.gridy = 1;
		add(breiteField, gc);

		gc.gridx = 1;
		gc.gridy = 2;
		add(höheField, gc);

		gc.gridx = 1;
		gc.gridy = 3;
		add(flächeField, gc);

		gc.gridx = 1;
		gc.gridy = 4;
		add(volumenField, gc);

		///// Letzte Reihe ////////////////////////////////////////

		gc.gridx = 1;
		gc.gridy = 5;
		add(cadBtn, gc);

		gc.weighty = 10;

		gc.anchor = GridBagConstraints.FIRST_LINE_START;

		gc.gridx = 1;
		gc.gridy = 6;
		add(addBtn, gc);
	}

		public void fireDetailEvent(DetailEvent event) {
	        Object[] listeners = listenerList.getListenerList();

	        for(int i=0; i < listeners.length; i += 2) {
	            if(listeners_ == DetailListener.class) {
	                ((DetailListener)listeners[i+1]).detailEventOccurred(event);
	            }
	        }
	    }

	    public void addDetailListener(DetailListener listener) {
	        listenerList.add(DetailListener.class, listener);
	    }

	    public void removeDetailListener(DetailListener listener) {
	        listenerList.remove(DetailListener.class, listener);
	    }

}

[/code]


Klasse 3 = DetailsPanel3
[JAVA=42]
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class DetailsPanel3 extends JPanel {
	public DetailsPanel3 () {
		Dimension size = getPreferredSize();
		size.width = 500;
		size.height = 1000;
		setPreferredSize(size);

		setBorder(BorderFactory.createTitledBorder("Oberfläche"));

		JLabel beschichtungLabel = new JLabel("Beschichtung: ");
		JLabel verunreinigungLabel = new JLabel("<html><body>verunreinigt<br>mit: ");

		//<html><body>(Geben Sie V für Verschnitt<br>oder P für Produkt ein.)</body></html>

		// Array für unsere JComboBox
        String comboBoxListe[] = {"-","/UC-Unbeschichtet", "ZE/EG-Elektrolyt. verzinkt","Z/Gl-Feuerverzinkt", "ZF/GA-Galvanisiert", "ZM-ZM EcoProtect", "AS-Feueraluminiert",};

        //JComboBox mit Material-Einträgen wird erstellt
        final JComboBox beschichtungAuswahl = new JComboBox(comboBoxListe);

		final JTextField verunreinigungField = new JTextField(8);

		JButton addBtn = new JButton("Hinzufügen");

		addBtn.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {               
                final String selectedItem = (String)beschichtungAuswahl.getSelectedItem();
                final String verunreinigung = verunreinigungField.getText();

                //String text = bezeichnung + ";  " + art + "\n";
                String eventText3 = selectedItem + ";" + verunreinigung;

                fireDetailEvent(new DetailEvent(this, eventText3));
                //fireDetailEvent(new DetailEvent(this, bezeichnung));
                //fireDetailEvent(new DetailEvent(this, art));
                //fireDetailEvent(new DetailEvent(this, selectedItem));


            }
        });

		setLayout(new GridBagLayout());

		GridBagConstraints gc = new GridBagConstraints();


		////// Erste Spalte ///////////////////////////////////

		gc.anchor = GridBagConstraints.LINE_END;
		gc.weightx = 0.5;
		gc.weighty = 0.5;


		gc.gridx = 0;
		gc.gridy = 0;
		add(beschichtungLabel, gc);

		gc.anchor = GridBagConstraints.LINE_START;

		gc.gridx = 0;
		gc.gridy = 1;
		add(verunreinigungLabel, gc);

		////// Zweite Spalte ////////////////////////////////////

		gc.anchor = GridBagConstraints.LINE_START;
		gc.gridx = 1;
		gc.gridy = 0;
		add(beschichtungAuswahl, gc);

		gc.anchor = GridBagConstraints.LINE_START;
		gc.gridx = 1;
		gc.gridy = 1;
		add(verunreinigungField, gc);

		///// Letzte Reihe ////////////////////////////////////////

		gc.weighty = 10;

		gc.anchor = GridBagConstraints.FIRST_LINE_START;
		gc.gridx = 1;
		gc.gridy = 2;
		add(addBtn, gc);

	}

	public void fireDetailEvent(DetailEvent event) {
        Object[] listeners = listenerList.getListenerList();

        for(int i=0; i < listeners.length; i += 2) {
            if(listeners == DetailListener.class) {
                ((DetailListener)listeners[i+1]).detailEventOccurred(event);
            }
        }
    }

    public void addDetailListener(DetailListener listener) {
        listenerList.add(DetailListener.class, listener);
    }

    public void removeDetailListener(DetailListener listener) {
        listenerList.remove(DetailListener.class, listener);
    }
}

[/code]


Klasse 4 = DetailsPanel 4
[JAVA=42]
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.util.Locale;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.AbstractDocument;
import javax.swing.text.DateFormatter;
import javax.swing.text.Document;


public class DetailsPanel4 extends JPanel {
	public DetailsPanel4 () {
		Dimension size = getPreferredSize();
		size.width = 500;
		size.height = 1000;
		setPreferredSize(size);

		setBorder(BorderFactory.createTitledBorder("Administrative Daten"));

		JLabel herstellerLabel = new JLabel("Hersteller: ");
		JLabel straßeLabel = new JLabel("Straße: ");
		JLabel hausnummerLabel = new JLabel("Hausnummer: ");
		JLabel plzLabel = new JLabel("PLZ: ");
		JLabel stadtLabel = new JLabel("Stadt: ");
		JLabel ansprechpartnerLabel = new JLabel("Ansprechpartner: ");
		JLabel telefonLabel = new JLabel("Telefonummer: ");
		JLabel emailLabel = new JLabel("E-Mail Adresse: ");
		JLabel gültigkeitLabel = new JLabel("Gültigkeit des Angebots: ");
		JLabel gültigkeit1Label = new JLabel("von Datum: ");
		JLabel gültigkeit2Label = new JLabel("bis Datum: ");

		final JTextField herstellerField = new JTextField(8);
		final JTextField straßeField = new JTextField(8);
		final JTextField hausnummerField = new JTextField(8);
		( ( AbstractDocument ) hausnummerField.getDocument()).setDocumentFilter( new DocumentSizeFilter( 3, DocumentSizeFilter.NUMBER_PATTERN ) );
		final JTextField plzField = new JTextField(8);
		plzField.setDocument(new LimitedInteger(5));		

		final JTextField stadtField = new JTextField(8);
		final JTextField ansprechpartnerField = new JTextField(8);
		final JTextField telefonField = new JTextField(8);
		( ( AbstractDocument ) telefonField.getDocument()).setDocumentFilter( new DocumentSizeFilter( 20, DocumentSizeFilter.TELEFON_PATTERN ) );
		final JTextField emailField = new JTextField(8);
		JLabel gültigkeit_Label = new JLabel("-----------------------------");


		//final JTextField gültigkeit1Field = new JTextField(8);		
		final JFormattedTextField gültigkeit1Field = new JFormattedTextField(

        		new DateFormatter(
        		         DateFormat.getDateInstance (DateFormat.SHORT, 
        		                                     Locale.GERMAN)));
        gültigkeit1Field.setColumns(8);

		//final JTextField gültigkeit2Field = new JTextField(8);
        final JFormattedTextField gültigkeit2Field = new JFormattedTextField(

        		new DateFormatter(
        		         DateFormat.getDateInstance (DateFormat.SHORT, 
        		                                     Locale.GERMAN)));
        gültigkeit2Field.setColumns(8);

		JButton addBtn = new JButton("Hinzufügen");

		addBtn.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                final String hersteller = herstellerField.getText();
                final String straße = straßeField.getText();
                final String hausnummer = hausnummerField.getText();
                final String plz = plzField.getText();
                final String stadt = stadtField.getText();
                final String ansprechpartner = ansprechpartnerField.getText();
                final String telefon = telefonField.getText();
                final String email = emailField.getText();
                final String gültigkeit1 = gültigkeit1Field.getText();
                final String gültigkeit2 = gültigkeit2Field.getText();


                String eventText4 = hersteller + ";" + straße + ";" + hausnummer + ";" + plz + ";" + stadt + ";" + ansprechpartner + ";" + telefon + ";" + email + ";" + gültigkeit1 + ";" + gültigkeit2;

                fireDetailEvent(new DetailEvent(this, eventText4));
                //fireDetailEvent(new DetailEvent(this, bezeichnung));
                //fireDetailEvent(new DetailEvent(this, art));
                //fireDetailEvent(new DetailEvent(this, selectedItem));


            }
        });

		setLayout(new GridBagLayout());

		GridBagConstraints gc = new GridBagConstraints();


		////// Erste Spalte ///////////////////////////////////

		gc.anchor = GridBagConstraints.LINE_END;
		gc.weightx = 0.5;
		gc.weighty = 0.5;


		gc.gridx = 0;
		gc.gridy = 0;
		add(herstellerLabel, gc);

		gc.gridx = 0;
		gc.gridy = 1;
		add(straßeLabel, gc);

		gc.gridx = 0;
		gc.gridy = 2;
		add(hausnummerLabel, gc);

		gc.gridx = 0;
		gc.gridy = 3;
		add(plzLabel, gc);

		gc.gridx = 0;
		gc.gridy = 4;
		add(stadtLabel, gc);

		gc.gridx = 0;
		gc.gridy = 5;
		add(ansprechpartnerLabel, gc);

		gc.gridx = 0;
		gc.gridy = 6;
		add(telefonLabel, gc);

		gc.gridx = 0;
		gc.gridy = 7;
		add(emailLabel, gc);

		gc.gridx = 0;
		gc.gridy = 8;
		add(gültigkeitLabel, gc);

		gc.gridx = 0;
		gc.gridy = 9;
		add(gültigkeit1Label, gc);

		gc.gridx = 0;
		gc.gridy = 10;
		add(gültigkeit2Label, gc);

		////// Zweite Spalte ////////////////////////////////////

		gc.anchor = GridBagConstraints.LINE_START;
		gc.gridx = 1;
		gc.gridy = 0;
		add(herstellerField, gc);

		gc.gridx = 1;
		gc.gridy = 1;
		add(straßeField, gc);

		gc.gridx = 1;
		gc.gridy = 2;
		add(hausnummerField, gc);

		gc.gridx = 1;
		gc.gridy = 3;
		add(plzField, gc);

		gc.gridx = 1;
		gc.gridy = 4;
		add(stadtField, gc);

		gc.gridx = 1;
		gc.gridy = 5;
		add(ansprechpartnerField, gc);

		gc.gridx = 1;
		gc.gridy = 6;
		add(telefonField, gc);

		gc.gridx = 1;
		gc.gridy = 7;
		add(emailField, gc);

		gc.gridx = 1;
		gc.gridy = 8;
		add(gültigkeit_Label, gc);

		gc.gridx = 1;
		gc.gridy = 9;
		add(gültigkeit1Field, gc);

		gc.gridx = 1;
		gc.gridy = 10;
		add(gültigkeit2Field, gc);

		///// Letzte Reihe ////////////////////////////////////////

		gc.weighty = 10;

		gc.anchor = GridBagConstraints.FIRST_LINE_START;
		gc.gridx = 1;
		gc.gridy = 11;
		add(addBtn, gc);

	}

	public void fireDetailEvent(DetailEvent event) {
        Object[] listeners = listenerList.getListenerList();

        for(int i=0; i < listeners.length; i += 20) {
            if(listeners == DetailListener.class) {
                ((DetailListener)listeners[i+1]).detailEventOccurred(event);
            }
        }
    }

    public void addDetailListener(DetailListener listener) {
        listenerList.add(DetailListener.class, listener);
    }

    public void removeDetailListener(DetailListener listener) {
        listenerList.remove(DetailListener.class, listener);
    }
}

[/code]_


----------



## Tinga (14. Apr 2014)

App mit Mainmethode
[JAVA=42]
import javax.swing.JFrame;
import javax.swing.SwingUtilities;


public class App {
	public static void main(String[] args) {


        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new MainFrame("Verschnittbörse");
                frame.setSize(1350, 500);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
    }

}
[/code]


DetailEvent
[JAVA=42]
import java.util.EventObject;


public class DetailEvent extends EventObject {
	private String text;

    public DetailEvent(Object source, String text) {
        super(source);

        this.text = text;
    }

    public String getText() {
        return text;
    }
}
[/code]

DetailListener (ist nur ein Interface - weiß nicht, inwieweit meine Aussagen von oben dann noch zutreffen)
[JAVA=42]
import java.util.EventListener;


public interface DetailListener extends EventListener {
	public void detailEventOccurred(DetailEvent event);

}
[/code]

DocumenteSizeFilter (begrenzt die Eingabe in manche Felder)
[JAVA=42]
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;


public class DocumentSizeFilter extends DocumentFilter {
	// Pattern nur für Buchstaben
    public static final String TEXT_PATTERN = "[A-Za-z]+";

    // Pattern nur für Ziffern
    public static final String NUMBER_PATTERN = "[0-9]+";

    // Pattern für Dezimalzahlen mit Komma (oder Punkt)  
    public static final String DECIMAL_PATTERN = "[0-9,]+";

 // Pattern für Telefonnummern
    public static final String TELEFON_PATTERN = "[0-9/+ ]+";

    private final int maxCharacters;
    private final String pattern;


    public DocumentSizeFilter( final int maxChars, final String pattern ) {
        maxCharacters = maxChars;
        this.pattern = pattern;
    }


    @Override
    public void replace( FilterBypass fb, int offs, int length, String str, AttributeSet a )
            throws BadLocationException {

        if ( str.matches( pattern ) && ( fb.getDocument().getLength() + str.length() - length ) <= maxCharacters || str.isEmpty() ) {
            super.replace( fb, offs, length, str, a );
        }

    }
}
[/code]

LimitedInteger - für Eingabe von PLZ verwendet
[JAVA=42]
import java.awt.Toolkit;

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;


public class LimitedInteger extends PlainDocument {
	private int maxCharacters;
    public LimitedInteger(int maxChars) {maxCharacters = maxChars;}
    public void insertString(int offs, String str, AttributeSet a)
    throws BadLocationException {
        int len = getLength() + str.length();
        if(len <= maxCharacters && str.matches("[\\d]*"))
            super.insertString(offs, str, a);
        else Toolkit.getDefaultToolkit().beep();
    }
}
[/code]


----------



## FetterOtter (15. Apr 2014)

Hallo Tinga,

ich habe deine Klassen mal ein wenig überarbeitet. Damit ich besser testen konnte, habe ich "meinen" Klassen immer ein "My" vorgehängt, nicht wundern. Etliche Klassen brauchte ich nun nicht mehr, da die Boardmittel nun ausreichten. Vielleicht kannst du ja etwas damit anfangen. Bei mir läuft es tadellos, incl. Schreiben aller Daten in die Excel-Tabelle.
Der Aufbau deiner Panels hat sich etwas verschoben, da ich die überflüssigen Buttons ausgebaut habe. Da müsstest du noch einmal ein bisschen überarbeiten.
Außerdem solltest du überall deine Umlaute und "ß" ersetzen. Obendrein habe ich eine String-Abfrage von "==" auf equals geändert.
Ach ja, und den Namen der Excel-Tabelle musst du zurückdrehen...

Wenn du noch Fragen hast, musst du dich beeilen. Ab 14:00 Uhr habe ich Urlaub...   

Hier Klasse "App":


```
public class MyApp
{
  public static void main(String[] args)
  {
    new MyMainFrame();
  }
}
```

Hier Klasse "MainFrame":


```
public class MyMainFrame extends JFrame implements ActionListener
{
  private static final long serialVersionUID = 1L;
  
  private MyDetailsPanel  detailsPanel  = new MyDetailsPanel();;
  private MyDetailsPanel2 detailsPanel2 = new MyDetailsPanel2();
  private MyDetailsPanel3 detailsPanel3 = new MyDetailsPanel3();
  private MyDetailsPanel4 detailsPanel4 = new MyDetailsPanel4();
  private MyDetailsPanel5 detailsPanel5 = new MyDetailsPanel5();

  public MyMainFrame()
  {
    super("Verschnittbörse");
    setSize(1350, 500);
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    setLayout(new GridLayout(1,4));

    Container c = getContentPane();

    c.add(detailsPanel,  BorderLayout.WEST);
    c.add(detailsPanel2, BorderLayout.CENTER);
    c.add(detailsPanel3, BorderLayout.EAST);
    c.add(detailsPanel4, BorderLayout.EAST);
    c.add(detailsPanel5, BorderLayout.PAGE_END);

    setVisible(true);

    addListener();
  }
  private void addListener()
  {
    detailsPanel2.getCadBtn().addActionListener(this);
    detailsPanel5.getBestätigenButton().addActionListener(this);
    detailsPanel5.getVerwerfenButton().addActionListener(this);
  }
  public void actionPerformed(ActionEvent e)
  {
    Object source = e.getSource();
      
    if (source == detailsPanel2.getCadBtn())
    {
      JFileChooser fc = new JFileChooser();
      fc.showSaveDialog(null);
      File file =fc.getSelectedFile();
      System.out.println(file.getPath());
      try
      {
        FileOutputStream fout = new FileOutputStream(new File("C:/Users/max/Desktop/Max/Studium/Master/00_Hiwi/20140307_Eclipse/140405_ActionListener/CAD-Modelle/Klotz.prt"));
      }
      catch (FileNotFoundException e1) {
        e1.printStackTrace();
      }
    }
    if (source == detailsPanel5.getBestätigenButton())
    {
      fillExcelSheet();
    }
    if (source == detailsPanel5.getVerwerfenButton())
    {
    }
  }
  private void fillExcelSheet()
  {
    try
    {
      FileInputStream myInput = new FileInputStream("Y:/Eigene Dateien/Test.xls");
      POIFSFileSystem fileSystem = new POIFSFileSystem(myInput);
      HSSFWorkbook workbook = new HSSFWorkbook(fileSystem);
      HSSFSheet sheet = workbook.getSheetAt(0);
      int rows = sheet.getPhysicalNumberOfRows();
      HSSFRow row = sheet.createRow(rows);
      
      // Setzen der Inhalte aus detailsPanel
      
      String bezeichnung = detailsPanel.getBezeichnungField().getText();
      String art         = (String)detailsPanel.getArtAuswahl().getSelectedItem();
      String material    = (String)detailsPanel.getMaterialAuswahl().getSelectedItem();
                  
      HSSFCell cellIndex = row.createCell(0); //soll Zelle in Spalte 0 erstellen
      cellIndex.setCellValue(rows + 1); //Wert der gesetzt werden soll.                    
      HSSFCell cell1 = row.createCell(1); //soll Zelle in Spalte 1 erstellen
      cell1.setCellValue(bezeichnung); //Wert der gesetzt werden soll.
      HSSFCell cell2 = row.createCell(2); //soll Zelle in Spalte 2 erstellen
      cell2.setCellValue(art); //Wert der gesetzt werden soll.
      HSSFCell cell3 = row.createCell(3); //soll Zelle in Spalte 3 erstellen
      cell3.setCellValue(material); //Wert der gesetzt werden soll.
      HSSFCell cell13 = row.createCell(13); //soll Zelle in Spalte 13 erstellen
      HSSFCell cell14 = row.createCell(14); //soll Zelle in Spalte 14 erstellen
                  
      if (cell2.getStringCellValue().equals("DC01"))
      {
        cell13.setCellValue("50");
        cell14.setCellValue("60");
      } 
      else
      {
        cell3.setCellValue("70");
        cell14.setCellValue("80");
      }

      // Setzen der Inhalte aus detailsPanel2

      String länge = detailsPanel2.getLängeField().getText();
      String breite = detailsPanel2.getBreiteField().getText();
      String höhe = detailsPanel2.getHöheField().getText();
      String fläche = detailsPanel2.getFlächeField().getText();
      String volumen = detailsPanel2.getVolumenField().getText();

      HSSFCell cell4 = row.createCell(4); //soll Zelle in Spalte 4 erstellen
      cell4.setCellValue(länge); //Wert der gesetzt werden soll.
      HSSFCell cell6 = row.createCell(6); //soll Zelle in Spalte 6 erstellen
      cell6.setCellValue(breite); //Wert der gesetzt werden soll.
      HSSFCell cell8 = row.createCell(8); //soll Zelle in Spalte 8 erstellen
      cell8.setCellValue(höhe); //Wert der gesetzt werden soll.
      HSSFCell cell10 = row.createCell(10); //soll Zelle in Spalte 10 erstellen
      cell10.setCellValue(fläche); //Wert der gesetzt werden soll.
      HSSFCell cell11 = row.createCell(11); //soll Zelle in Spalte 11 erstellen
      cell11.setCellValue(volumen); //Wert der gesetzt werden soll.

      // Setzen der Inhalte aus detailsPanel3

      String beschichtung = (String)detailsPanel3.getBeschichtungAuswahl().getSelectedItem();
      String verunreinigung = detailsPanel3.getVerunreinigungField().getText();

      HSSFCell cell44 = row.createCell(44); //soll Zelle in Spalte 44 erstellen
      cell44.setCellValue(beschichtung); //Wert der gesetzt werden soll.
      HSSFCell cell48 = row.createCell(48); //soll Zelle in Spalte 48 erstellen   
      cell48.setCellValue(verunreinigung); //Wert der gesetzt werden soll.

      // Setzen der Inhalte aus detailsPanel4

      String hersteller = detailsPanel4.getHerstellerField().getText();
      String straße = detailsPanel4.getStraßeField().getText();
      String hausnummer = detailsPanel4.getHausnummerField().getText();
      String plz = detailsPanel4.getPlzField().getText();
      String stadt = detailsPanel4.getStadtField().getText();
      String ansprechpartner = detailsPanel4.getAnsprechpartnerField().getText();
      String telefon = detailsPanel4.getTelefonField().getText();
      String email = detailsPanel4.getEmailField().getText();
      String gültigkeit1 = detailsPanel4.getGültigkeit1Field().getText();
      String gültigkeit2 = detailsPanel4.getGültigkeit2Field().getText();

      HSSFCell cell50 = row.createCell(50); //soll Zelle in Spalte 50 erstellen
      cell50.setCellValue(hersteller); //Wert der gesetzt werden soll.
      HSSFCell cell51 = row.createCell(51); //soll Zelle in Spalte 51 erstellen
      cell51.setCellValue(straße); //Wert der gesetzt werden soll.
      HSSFCell cell52 = row.createCell(52); //soll Zelle in Spalte 52 erstellen
      cell52.setCellValue(hausnummer); //Wert der gesetzt werden soll.
      HSSFCell cell53 = row.createCell(53); //soll Zelle in Spalte 53 erstellen
      cell53.setCellValue(plz); //Wert der gesetzt werden soll.
      HSSFCell cell54 = row.createCell(54); //soll Zelle in Spalte 54 erstellen
      cell54.setCellValue(stadt); //Wert der gesetzt werden soll.
      HSSFCell cell55 = row.createCell(55); //soll Zelle in Spalte 55 erstellen
      cell55.setCellValue(ansprechpartner); //Wert der gesetzt werden soll.
      HSSFCell cell56 = row.createCell(56); //soll Zelle in Spalte 56 erstellen
      cell56.setCellValue(telefon); //Wert der gesetzt werden soll.
      HSSFCell cell58 = row.createCell(58); //soll Zelle in Spalte 58 erstellen
      cell58.setCellValue(email); //Wert der gesetzt werden soll.
      HSSFCell cell65 = row.createCell(65); //soll Zelle in Spalte 65 erstellen
      cell65.setCellValue(gültigkeit1); //Wert der gesetzt werden soll.
      HSSFCell cell67 = row.createCell(67); //soll Zelle in Spalte 67 erstellen
      cell67.setCellValue(gültigkeit2); //Wert der gesetzt werden soll.

      FileOutputStream myOutput = new FileOutputStream(new File("Y:/Eigene Dateien/Test.xls"));  
      workbook.write(myOutput);
      myOutput.close();
    } 
    catch (Exception ex) 
    {
      ex.printStackTrace();
    }
  }
}
```

Hier Klasse "DetailsPanel":


```
public class MyDetailsPanel extends JPanel
{
  private static final long serialVersionUID = 1L;

  private JLabel bezeichnungLabel = new JLabel("Bezeichung: ");
  private JLabel artLabel         = new JLabel("Art: ");
  private JLabel artLabel2        = new JLabel("<html><body>(Geben Sie V für Verschnitt<br>oder P für Produkt ein.)</body></html>");
  private JLabel materialLabel    = new JLabel("Material: ");
  private JTextField bezeichnungField = new JTextField(8);       

  // Array für unsere JComboBox
  private String comboBoxListe1[] = {"-","V","P",};
  //JComboBox mit Material-Einträgen wird erstellt
  private JComboBox<String> artAuswahl = new JComboBox<String>(comboBoxListe1);
  // Array für unsere JComboBox
  private String comboBoxListe2[] = {"-", "DC01", "DC03","DC04", "DC05", "DC06", "DC07", "DD11", "DD12", "DD13", "DD14", "DX51D", "DX52D", "DX53D", "DX54D", "DX55D", "DX56D", "DX57D", "DX58D",};
  //JComboBox mit Material-Einträgen wird erstellt
  private JComboBox<String> materialAuswahl = new JComboBox<String>(comboBoxListe2);

  public MyDetailsPanel()
  {
    Dimension size = getPreferredSize();
    size.width = 500;
    size.height = 600;
    setPreferredSize(size);
    setBorder(BorderFactory.createTitledBorder("Basisdaten"));
    setLayout(new GridBagLayout());

    GridBagConstraints gc = new GridBagConstraints();

    //// First column /////////////////////////

    gc.anchor = GridBagConstraints.LINE_END;
    gc.weightx = 0.5;
    gc.weighty = 0.5;

    gc.gridx = 0;
    gc.gridy = 0;
    add(bezeichnungLabel, gc);

    gc.gridx = 0;
    gc.gridy = 1;
    add(artLabel, gc);

    gc.gridx = 0;
    gc.gridy = 3;
    add(materialLabel, gc);

    //// Second column
    gc.anchor = GridBagConstraints.LINE_START;

    gc.gridx = 1;
    gc.gridy = 0;
    add(bezeichnungField, gc);

    gc.gridx = 1;
    gc.gridy = 1;
    add(artAuswahl, gc);

    gc.gridx = 1;
    gc.gridy = 2;
    add(artLabel2, gc);

    gc.gridx = 1;
    gc.gridy = 3;
    add(materialAuswahl, gc);
  }

  public JTextField getBezeichnungField()
  {
    return bezeichnungField;
  }
  public JComboBox<String> getArtAuswahl()
  {
    return artAuswahl;
  }
  public JComboBox<String> getMaterialAuswahl()
  {
    return materialAuswahl;
  }
}
```

Hier Klasse "DetailsPanel2":


```
public class MyDetailsPanel2 extends JPanel
{
  private static final long serialVersionUID = 1L;
  
  private JLabel längeLabel = new JLabel("Länge [in m]: ");
  private JLabel breiteLabel = new JLabel("Breite [in m]: ");
  private JLabel höheLabel = new JLabel("Höhe [in m]: ");
  private JLabel flächeLabel = new JLabel("Fläche [in m²]: ");
  private JLabel volumenLabel = new JLabel("Volumen [in m³]: ");
  private JTextField längeField = new JTextField(8);
  private JTextField breiteField = new JTextField(8);
  private JTextField höheField = new JTextField(8);
  private JTextField flächeField = new JTextField(8);
  private JTextField volumenField = new JTextField(8);
  private JButton cadBtn = new JButton("CAD-Datei auswählen");

  public MyDetailsPanel2 ()
  {
    Dimension size = getPreferredSize();
    size.width = 500;
    size.height = 600;
    setPreferredSize(size);
    setBorder(BorderFactory.createTitledBorder("Geometrie"));
    setLayout(new GridBagLayout());

    GridBagConstraints gc = new GridBagConstraints();

    ////// Erste Spalte ///////////////////////////////////

    gc.anchor = GridBagConstraints.LINE_END;
    gc.weightx = 0.5;
    gc.weighty = 0.5;

    gc.gridx = 0;
    gc.gridy = 0;
    add(längeLabel, gc);

    gc.gridx = 0;
    gc.gridy = 1;
    add(breiteLabel, gc);

    gc.gridx = 0;
    gc.gridy = 2;
    add(höheLabel, gc);

    gc.gridx = 0;
    gc.gridy = 3;
    add(flächeLabel, gc);

    gc.gridx = 0;
    gc.gridy = 4;
    add(volumenLabel, gc);

    ////// Zweite Spalte ////////////////////////////////////

    gc.anchor = GridBagConstraints.LINE_START;
    gc.gridx = 1;
    gc.gridy = 0;
    add(längeField, gc);

    gc.gridx = 1;
    gc.gridy = 1;
    add(breiteField, gc);

    gc.gridx = 1;
    gc.gridy = 2;
    add(höheField, gc);

    gc.gridx = 1;
    gc.gridy = 3;
    add(flächeField, gc);

    gc.gridx = 1;
    gc.gridy = 4;
    add(volumenField, gc);

    ///// Letzte Reihe ////////////////////////////////////////
    gc.gridx = 1;
    gc.gridy = 5;
    add(cadBtn, gc);

    ((AbstractDocument) längeField.getDocument()).setDocumentFilter(new DocumentSizeFilter(6, DocumentSizeFilter.DECIMAL_PATTERN));
    ((AbstractDocument) breiteField.getDocument()).setDocumentFilter(new DocumentSizeFilter(6, DocumentSizeFilter.DECIMAL_PATTERN));
    ((AbstractDocument) höheField.getDocument()).setDocumentFilter(new DocumentSizeFilter(6, DocumentSizeFilter.DECIMAL_PATTERN));
    ((AbstractDocument) flächeField.getDocument()).setDocumentFilter(new DocumentSizeFilter(6, DocumentSizeFilter.DECIMAL_PATTERN));
    ((AbstractDocument) volumenField.getDocument()).setDocumentFilter(new DocumentSizeFilter(6, DocumentSizeFilter.DECIMAL_PATTERN));
  }
  public JTextField getLängeField()
  {
    return längeField;
  }
  public JTextField getBreiteField()
  {
    return breiteField;
  }
  public JTextField getHöheField()
  {
    return höheField;
  }
  public JTextField getFlächeField()
  {
    return flächeField;
  }
  public JTextField getVolumenField()
  {
    return volumenField;
  }
  public JButton getCadBtn()
  {
    return cadBtn;
  }
}
```

Hier Klasse "DetailsPanel3":


```
public class MyDetailsPanel3 extends JPanel {

  private static final long serialVersionUID = 1L;

  private JLabel beschichtungLabel = new JLabel("Beschichtung: ");
  private JLabel verunreinigungLabel = new JLabel("<html><body>verunreinigt<br>mit: ");

  // Array für unsere JComboBox
  private String comboBoxListe[] = {"-","/UC-Unbeschichtet", "ZE/EG-Elektrolyt. verzinkt","Z/Gl-Feuerverzinkt", "ZF/GA-Galvanisiert", "ZM-ZM EcoProtect", "AS-Feueraluminiert",};

  //JComboBox mit Material-Einträgen wird erstellt
  private JComboBox<String> beschichtungAuswahl = new JComboBox<String>(comboBoxListe);

  private JTextField verunreinigungField = new JTextField(8);

  public MyDetailsPanel3 ()
  {
    Dimension size = getPreferredSize();
    size.width = 500;
    size.height = 1000;
    setPreferredSize(size);
    setBorder(BorderFactory.createTitledBorder("Oberfläche"));
    setLayout(new GridBagLayout());

    GridBagConstraints gc = new GridBagConstraints();

    ////// Erste Spalte ///////////////////////////////////

    gc.anchor = GridBagConstraints.LINE_END;
    gc.weightx = 0.5;
    gc.weighty = 0.5;
    gc.gridx = 0;
    gc.gridy = 0;
    add(beschichtungLabel, gc);

    gc.anchor = GridBagConstraints.LINE_START;
    gc.gridx = 0;
    gc.gridy = 1;
    add(verunreinigungLabel, gc);

    ////// Zweite Spalte ////////////////////////////////////

    gc.anchor = GridBagConstraints.LINE_START;
    gc.gridx = 1;
    gc.gridy = 0;
    add(beschichtungAuswahl, gc);

    gc.anchor = GridBagConstraints.LINE_START;
    gc.gridx = 1;
    gc.gridy = 1;
    add(verunreinigungField, gc);
  }
  public JComboBox<String> getBeschichtungAuswahl()
  {
    return beschichtungAuswahl;
  }

  public JTextField getVerunreinigungField()
  {
    return verunreinigungField;
  }
}
```

Hier Klasse "DetailsPanel4":


```
public class MyDetailsPanel4 extends JPanel 
{
  private static final long serialVersionUID = 1L;

  private JLabel herstellerLabel = new JLabel("Hersteller: ");
  private JLabel straßeLabel = new JLabel("Straße: ");
  private JLabel hausnummerLabel = new JLabel("Hausnummer: ");
  private JLabel plzLabel = new JLabel("PLZ: ");
  private JLabel stadtLabel = new JLabel("Stadt: ");
  private JLabel ansprechpartnerLabel = new JLabel("Ansprechpartner: ");
  private JLabel telefonLabel = new JLabel("Telefonummer: ");
  private JLabel emailLabel = new JLabel("E-Mail Adresse: ");
  private JLabel gültigkeitLabel = new JLabel("Gültigkeit des Angebots: ");
  private JLabel gültigkeit1Label = new JLabel("von Datum: ");
  private JLabel gültigkeit2Label = new JLabel("bis Datum: ");
  private JLabel gültigkeit_Label = new JLabel("-----------------------------");

  private JTextField herstellerField = new JTextField(8);
  private JTextField straßeField = new JTextField(8);
  private JTextField hausnummerField = new JTextField(8);
  private JTextField plzField = new JTextField(8);
  private JTextField stadtField = new JTextField(8);
  private JTextField ansprechpartnerField = new JTextField(8);
  private JTextField telefonField = new JTextField(8);
  private JTextField emailField = new JTextField(8);
  private JFormattedTextField gültigkeit1Field = new JFormattedTextField(new DateFormatter(DateFormat.getDateInstance (DateFormat.SHORT, Locale.GERMAN)));
  private JFormattedTextField gültigkeit2Field = new JFormattedTextField(new DateFormatter(DateFormat.getDateInstance (DateFormat.SHORT, Locale.GERMAN)));

  public MyDetailsPanel4 () 
  {
    Dimension size = getPreferredSize();
    size.width = 500;
    size.height = 1000;
    setPreferredSize(size);
    setBorder(BorderFactory.createTitledBorder("Administrative Daten"));
    setLayout(new GridBagLayout());

    GridBagConstraints gc = new GridBagConstraints();

    ////// Erste Spalte ///////////////////////////////////

    gc.anchor = GridBagConstraints.LINE_END;
    gc.weightx = 0.5;
    gc.weighty = 0.5;


    gc.gridx = 0;
    gc.gridy = 0;
    add(herstellerLabel, gc);

    gc.gridx = 0;
    gc.gridy = 1;
    add(straßeLabel, gc);

    gc.gridx = 0;
    gc.gridy = 2;
    add(hausnummerLabel, gc);

    gc.gridx = 0;
    gc.gridy = 3;
    add(plzLabel, gc);

    gc.gridx = 0;
    gc.gridy = 4;
    add(stadtLabel, gc);

    gc.gridx = 0;
    gc.gridy = 5;
    add(ansprechpartnerLabel, gc);

    gc.gridx = 0;
    gc.gridy = 6;
    add(telefonLabel, gc);

    gc.gridx = 0;
    gc.gridy = 7;
    add(emailLabel, gc);

    gc.gridx = 0;
    gc.gridy = 8;
    add(gültigkeitLabel, gc);

    gc.gridx = 0;
    gc.gridy = 9;
    add(gültigkeit1Label, gc);

    gc.gridx = 0;
    gc.gridy = 10;
    add(gültigkeit2Label, gc);

    ////// Zweite Spalte ////////////////////////////////////

    gc.anchor = GridBagConstraints.LINE_START;
    gc.gridx = 1;
    gc.gridy = 0;
    add(herstellerField, gc);

    gc.gridx = 1;
    gc.gridy = 1;
    add(straßeField, gc);

    gc.gridx = 1;
    gc.gridy = 2;
    add(hausnummerField, gc);

    gc.gridx = 1;
    gc.gridy = 3;
    add(plzField, gc);

    gc.gridx = 1;
    gc.gridy = 4;
    add(stadtField, gc);

    gc.gridx = 1;
    gc.gridy = 5;
    add(ansprechpartnerField, gc);

    gc.gridx = 1;
    gc.gridy = 6;
    add(telefonField, gc);

    gc.gridx = 1;
    gc.gridy = 7;
    add(emailField, gc);

    gc.gridx = 1;
    gc.gridy = 8;
    add(gültigkeit_Label, gc);

    gc.gridx = 1;
    gc.gridy = 9;
    add(gültigkeit1Field, gc);

    gc.gridx = 1;
    gc.gridy = 10;
    add(gültigkeit2Field, gc);

    ((AbstractDocument)hausnummerField.getDocument()).setDocumentFilter(new DocumentSizeFilter(3, DocumentSizeFilter.NUMBER_PATTERN));
    ((AbstractDocument)telefonField.getDocument()).setDocumentFilter(new DocumentSizeFilter(20, DocumentSizeFilter.TELEFON_PATTERN));
    plzField.setDocument(new LimitedInteger(5));        
    gültigkeit1Field.setColumns(8);
    gültigkeit2Field.setColumns(8);

  }
  public JTextField getHerstellerField()
  {
    return herstellerField;
  }
  public JTextField getStraßeField()
  {
    return straßeField;
  }
  public JTextField getHausnummerField()
  {
    return hausnummerField;
  }
  public JTextField getPlzField()
  {
    return plzField;
  }
  public JTextField getStadtField()
  {
    return stadtField;
  }
  public JTextField getAnsprechpartnerField()
  {
    return ansprechpartnerField;
  }
  public JTextField getTelefonField()
  {
    return telefonField;
  }
  public JTextField getEmailField()
  {
    return emailField;
  }
  public JFormattedTextField getGültigkeit1Field()
  {
    return gültigkeit1Field;
  }
  public JFormattedTextField getGültigkeit2Field()
  {
    return gültigkeit2Field;
  }
}
```


----------



## Tinga (22. Apr 2014)

Hallo FetterOtter,



also ich habe Deinen Code nicht zum Laufen gebracht, weil mir die Klasse 5 gefehlt hat bzw. ich nicht wusste, was du mit ihr gemacht hast und sie in MainFraime noch vorkam.

Aber der Code hat mir trotzdem enorm weitergeholfen. Mit Deinem Code und der Art wie Du die ActionListener verwendest habe ich es geschafft alles in einer Klasse unterzubringen (anstatt App, MainFrame und die DetailsPanel). Dafür habe ich zwar alles abändern müssen aber es funktioniert. Juuhuu!

Ich bekomme in den nächsten Wochen noch einen Bachelorarbeiter. Dem soll ich bei der Entwicklung eines weiteren Programms, das auf diesem aufbaut, helfen. Für den Fall, dass ich nicht weiterkomme lasse ich das Thema offen. Du brauchst Dich aber nicht verpflichtet fühlen zu antworten. 

Nochmals vielen, vielen Dank und schöne Urlaubstage.


----------



## Tinga (2. Mai 2014)

Hallo FetterOtter,



nach dem Zahlenformat habe ich wieder ein anspruchsvolleres Problem. Dabei handelt es sich weniger um ein Problem mit Java, sondern vielmehr fehlt mir schon die Logik für einen entsprechenden Algorithmus. Problem ist dabei v. a. das durch die Tabelle iterieren.

Ich erkläre Dir (hoffentlich verständlich genug) zuerst einmal mein Ziel:

Ausgehend von der letzten Anwendung habe ich die Excel-Datei mit einigen Datensätzen gefüllt. Ich möchte nun eine Aussage darüber treffen, wie gut Verschnitt (V) und Produkt (P) zusammen passen. Zunächst soll die Ähnlichkeit zwischen Verschnitt und Produkt (mathematisch ganz einfach) abgebildet werden, nämlich nur durch das Verhältnis der Volumina.

Ich habe zunächst angefangen, mich mit der Hand am Arm durch die Tabelle zu hangeln, in der Hoffnung, es würde mich vom Verständnis weiterbringen. Ausgegangen bin ich vom ersten Datensatz (Codebeispiel 1 & Excel 1). Dies ist ein Produkt. Danach habe ich mir den zweiten Datensatz angeschaut. Das ist ein Verschnitt. Wenn der Verschnitt kleiner ist (ein geringeres Volumen hat) als das Produkt, kann ich aus ihm das Produkt nicht herstellen. Es erscheint dann die Ausgabe: „Keine Verwertung möglich“. Ist der Verschnitt größer als das Produkt, so kann aus dem Verschnitt das Produkt hergestellt werden. Je näher das Volumen des Produkts von unten an das des Verschnitts heranreicht, desto höher ist der Materialnutzungsgrad. Zur Berechnung meines Indikators dividiere ich ganz simpel das Volumen des Produkts durch das des Verschnitts. Je näher der Wert an 1 heranreicht desto besser. Werden 2 Verschnitte oder 2 Produkte miteinander verglichen, wird „---„ ausgegeben. 

Ich habe diese Werte zunächst in einer Spalte der Excel-Datei zwischengespeichert. Diese soll/muss später nicht vorhanden sein, sie dient nur dazu, verständlich zu machen, was ich überhaupt mache. (Das Programm funktioniert trotzdem.)Letztendlich soll das Programm auf diese Weise eine Empfehlung aussprechen, welcher Verschnitt zu welchem Produkt am besten passt. Im konkreten Fall ergibt sich die höchste Übereinstimmung des ersten Datensatzes mit dem Datensatz in Zeile 10 (0,714). Als Ergebnis stelle ich mir etwas in der Art vor: in Zeile 6, Spalte „Empfehlung System“ stehtso etwas wie „10 - Verschnitt aus Presse – Übereinstimmung: 71,4 %“. (Im konkreten Fall habe ich „10 - Verschnitt aus Presse – Übereinstimmung: 71,4 %“ von Hand in die Excel geschrieben, der Rest des Programms läuft.) Ziel wäre es, für jeden Datensatz einen optimalen Partner zu finden. Entsprechend würde dann in Zeile 10 stehen: „6 – Winkel – Übereinstimmung: 71,4 %“. (Damit es einfacher ist, kann statt „ Keine Verwertung möglich“ und „—„ auch schlicht Nullen stehen, dann tut man sich leichter mit den Datentypen und kann die größte Zahl der Spalte bestimmen. Darauf hatte ich keine Lust mehr, weil mich das auch nicht viel weiter bringt. Die Konsolenausgabe „Fehler aufgetreten“  kommt daher ist aber bedeutungslos.)

Ich möchte gar nicht mal so sehr eine komplette Lösung von dir. Ich glaube, damit würde ich selbst Dich etwas länger beschäftigen. Ein paar Tipps, wie bzw. ob man das überhaupt noch annähernd verwirklichen kann, würden mir schon reichen. Ich habe nämlich im Netz nichts gefunden, wobei das eigentliche Problem dahinter nicht wirklich übermäßig komplex ist. Ich kann mir nicht vorstellen, dass niemand auf der Welt einen Vergleich von Zeilen mit Restriktionen aus 2 Spalten gemacht hat. Aber in der Richtung finde ich gar nichts. Selbst ein Beispiel ohne POI hätte mir voll und ganz gereicht. Aber so bin ich im Moment echt chancenlos.

Ich habe jedenfalls noch ein zweites stark vereinfachtes Beispiel (Codebeispiel 2 & Excel 2), in dem ich nicht mehr von Hand durch die Tabelle pflügen möchte, sondern mit einem Iterator. Wenn ich in der Spalte „Art“ unterwegs bin und  zu einem Verschnitt ein Produkt gefunden habe, bekomme ich es evtl. gerade noch so hin, das Volumen des Produkts aus derselben Zeile auszulesen. Allerdings bin ich dann nicht mehr in der Lage, den Volumen-Wert des Ausgansgsdatensatzes (welche Indizes? bin ich schon raus aus der ersten for-Schleife?) anzusprechen. Dieses Springen zwischen den Spalten schaffe ich nicht. 

Hoffe, Du versteht, was ich meine. Bin für jede noch so kleine Idee dankbar.


Viele Grüße,
Tinga

Code 1
[JAVA=42]
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;


public class Rechner {

	public static void main (String[] args) {

		try {
		FileInputStream myInput = new FileInputStream("C:/Users/max/Desktop/Max/Studium/Master/00_Hiwi/20140307_Eclipse/140501_vergleich/Excel.xls");
	    POIFSFileSystem fileSystem = new POIFSFileSystem(myInput);
	    HSSFWorkbook workbook = new HSSFWorkbook(fileSystem);
	    HSSFSheet sheet = workbook.getSheetAt(0);
	    HSSFRow row5 = sheet.getRow(5);
        final HSSFRow row6 = sheet.getRow(6);
        final HSSFRow row7 = sheet.getRow(7);
        final HSSFRow row8 = sheet.getRow(8);
        final HSSFRow row9 = sheet.getRow(9);
        //final HSSFRow row10 = sheet.getRow(10);
        //final HSSFRow row11 = sheet.getRow(11);

        // Zeile 5 & 6

        if (row5.getCell(2).getStringCellValue().equals("V")) {
        	if (row6.getCell(2).getStringCellValue().equals("V")) {
        		HSSFCell cell69 = row6.createCell(69);
        		cell69.setCellValue("---");
        	} else if (row6.getCell(2).getStringCellValue().equals("P")) {
        		if (row5.getCell(11).getNumericCellValue() >= row6.getCell(11).getNumericCellValue()) {
            		double ergebnis = row6.getCell(11).getNumericCellValue() / row5.getCell(11).getNumericCellValue();
            		HSSFCell cell69 = row6.createCell(69);
            		cell69.setCellValue(ergebnis);
        		} else if (row5.getCell(11).getNumericCellValue() < row6.getCell(11).getNumericCellValue()) {
        			HSSFCell cell69 = row6.createCell(69);
            		cell69.setCellValue("Keine Verwertung möglich");
        		}
        	}
        } else if (row5.getCell(2).getStringCellValue().equals("P")) {
        	if (row6.getCell(2).getStringCellValue().equals("V")) {
            	if (row5.getCell(11).getNumericCellValue() <= row6.getCell(11).getNumericCellValue()) {
            		double ergebnis = row5.getCell(11).getNumericCellValue() / row6.getCell(11).getNumericCellValue();
            		HSSFCell cell69 = row6.createCell(69);
            		cell69.setCellValue(ergebnis);
            	} else if (row5.getCell(11).getNumericCellValue() > row6.getCell(11).getNumericCellValue()) {
            		HSSFCell cell69 = row6.createCell(69);
            		cell69.setCellValue("Keine Verwertung möglich");
            	}
            } else if (row6.getCell(2).getStringCellValue().equals("P")) {
            	HSSFCell cell69 = row6.createCell(69);
        		cell69.setCellValue("---");
            }
        }

        // Zeile 5 & 7 

        if (row5.getCell(2).getStringCellValue().equals("V")) {
        	if (row7.getCell(2).getStringCellValue().equals("V")) {
        		HSSFCell cell69 = row7.createCell(69);
        		cell69.setCellValue("---");
        	} else if (row7.getCell(2).getStringCellValue().equals("P")) {
        		if (row5.getCell(11).getNumericCellValue() >= row7.getCell(11).getNumericCellValue()) {
            		double ergebnis = row7.getCell(11).getNumericCellValue() / row5.getCell(11).getNumericCellValue();
            		HSSFCell cell69 = row7.createCell(69);
            		cell69.setCellValue(ergebnis);
        		} else if (row5.getCell(11).getNumericCellValue() < row7.getCell(11).getNumericCellValue()) {
        			HSSFCell cell69 = row7.createCell(69);
            		cell69.setCellValue("Keine Verwertung möglich");
        		}
        	}
        } else if (row5.getCell(2).getStringCellValue().equals("P")) {
        	if (row7.getCell(2).getStringCellValue().equals("V")) {
            	if (row5.getCell(11).getNumericCellValue() <= row7.getCell(11).getNumericCellValue()) {
            		double ergebnis = row5.getCell(11).getNumericCellValue() / row7.getCell(11).getNumericCellValue();
            		HSSFCell cell69 = row7.createCell(69);
            		cell69.setCellValue(ergebnis);
            	} else if (row5.getCell(11).getNumericCellValue() > row7.getCell(11).getNumericCellValue()) {
            		HSSFCell cell69 = row7.createCell(69);
            		cell69.setCellValue("Keine Verwertung möglich");
            	}
            } else if (row7.getCell(2).getStringCellValue().equals("P")) {
            	HSSFCell cell69 = row7.createCell(69);
        		cell69.setCellValue("---");
            }
        }

        // Zeile 5 & 8 

        if (row5.getCell(2).getStringCellValue().equals("V")) {
        	if (row8.getCell(2).getStringCellValue().equals("V")) {
        		HSSFCell cell69 = row8.createCell(69);
        		cell69.setCellValue("---");
        	} else if (row8.getCell(2).getStringCellValue().equals("P")) {
        		if (row5.getCell(11).getNumericCellValue() >= row8.getCell(11).getNumericCellValue()) {
            		double ergebnis = row8.getCell(11).getNumericCellValue() / row5.getCell(11).getNumericCellValue();
            		HSSFCell cell69 = row8.createCell(69);
            		cell69.setCellValue(ergebnis);
        		} else if (row5.getCell(11).getNumericCellValue() < row8.getCell(11).getNumericCellValue()) {
        			HSSFCell cell69 = row8.createCell(69);
            		cell69.setCellValue("Keine Verwertung möglich");
        		}
        	}
        } else if (row5.getCell(2).getStringCellValue().equals("P")) {
        	if (row8.getCell(2).getStringCellValue().equals("V")) {
            	if (row5.getCell(11).getNumericCellValue() <= row8.getCell(11).getNumericCellValue()) {
            		double ergebnis = row5.getCell(11).getNumericCellValue() / row8.getCell(11).getNumericCellValue();
            		HSSFCell cell69 = row8.createCell(69);
            		cell69.setCellValue(ergebnis);
            	} else if (row5.getCell(11).getNumericCellValue() > row8.getCell(11).getNumericCellValue()) {
            		HSSFCell cell69 = row8.createCell(69);
            		cell69.setCellValue("Keine Verwertung möglich");
            	}
            } else if (row8.getCell(2).getStringCellValue().equals("P")) {
            	HSSFCell cell69 = row8.createCell(69);
        		cell69.setCellValue("---");
            }
        }

        // Zeile 5 & 9 

        if (row5.getCell(2).getStringCellValue().equals("V")) {
        	if (row9.getCell(2).getStringCellValue().equals("V")) {
        		HSSFCell cell69 = row9.createCell(69);
        		cell69.setCellValue("---");
        	} else if (row9.getCell(2).getStringCellValue().equals("P")) {
        		if (row5.getCell(11).getNumericCellValue() >= row9.getCell(11).getNumericCellValue()) {
            		double ergebnis = row9.getCell(11).getNumericCellValue() / row5.getCell(11).getNumericCellValue();
            		HSSFCell cell69 = row9.createCell(69);
            		cell69.setCellValue(ergebnis);
        		} else if (row5.getCell(11).getNumericCellValue() < row9.getCell(11).getNumericCellValue()) {
        			HSSFCell cell69 = row9.createCell(69);
            		cell69.setCellValue("Keine Verwertung möglich");
        		}
        	}
        } else if (row5.getCell(2).getStringCellValue().equals("P")) {
        	if (row9.getCell(2).getStringCellValue().equals("V")) {
            	if (row5.getCell(11).getNumericCellValue() <= row9.getCell(11).getNumericCellValue()) {
            		double ergebnis = row5.getCell(11).getNumericCellValue() / row9.getCell(11).getNumericCellValue();
            		HSSFCell cell69 = row9.createCell(69);
            		cell69.setCellValue(ergebnis);
            	} else if (row5.getCell(11).getNumericCellValue() > row9.getCell(11).getNumericCellValue()) {
            		HSSFCell cell69 = row9.createCell(69);
            		cell69.setCellValue("Keine Verwertung möglich");
            	}
            } else if (row9.getCell(2).getStringCellValue().equals("P")) {
            	HSSFCell cell69 = row9.createCell(69);
        		cell69.setCellValue("---");
            }
        }

        //Empfehlung System

        try { 
        double w = row6.getCell(69).getNumericCellValue();
        double x = row7.getCell(69).getNumericCellValue();
        double y = row8.getCell(69).getNumericCellValue();
        double z = row9.getCell(69).getNumericCellValue();
        System.out.println(x);
        } catch (Exception ex) {
        	System.out.println("Fehler aufgetreten");
        }

        FileOutputStream myOutput = new FileOutputStream(new File("C:/Users/max/Desktop/Max/Studium/Master/00_Hiwi/20140307_Eclipse/140501_vergleich/Excel.xls"));  
        workbook.write(myOutput);
        myOutput.close();

		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

[/code]


Code 2
[JAVA=42]
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;


public class Test {

	public static void main (String[] args) {
		try {
			FileInputStream myInput = new FileInputStream("C:/Users/max/Desktop/Max/Studium/Master/00_Hiwi/20140307_Eclipse/140501_spalte/Excel.xls");
		    POIFSFileSystem fileSystem = new POIFSFileSystem(myInput);
		    HSSFWorkbook workbook = new HSSFWorkbook(fileSystem);
		    HSSFSheet sheet = workbook.getSheetAt(0);

		    List<String> a = new ArrayList<String>();

		    for (int i = 1; i <= sheet.getLastRowNum(); i++) {
	            HSSFRow row = sheet.getRow(i);
	            int j = 0;
	            row.getCell(j);
	            a.add((row.getCell(j).getStringCellValue()));

		    }

		    /**
		    int k = 0;
		    for (a.get(k); k <= a.size(); k++) {
		    	if (a.get(k).equals("V")) {
		    		Iterator<String> iter  = a.iterator();
		    		while(iter.hasNext()) {
		    			if (iter.next().equals("P")) {

		    			}
		    		}
		    	}
		    }
		    **/
		    //String ersterWert = a.get(0);

		    /**
		    Iterator<String> iter  = a.iterator();
		    while(iter.hasNext()){
	            if (iter.equals("P")){
	                iter.remove(); 
	            }
		    }
		    **/


		    System.out.println(a);
		    Iterator iter = a.iterator();

	        while (iter.hasNext())
	        {
	            System.out.println(iter.next());
	        }

		    FileOutputStream myOutput = new FileOutputStream(new File("C:/Users/max/Desktop/Max/Studium/Master/00_Hiwi/20140307_Eclipse/140501_spalte/Excel.xls"));  
	        workbook.write(myOutput);
	        myOutput.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

[/code]


Die Datei "Excel2.xls" musst du wieder in "Excel.xls" umbenennen. Ich musste sie fürs Hochladen umbennen.


----------



## Tinga (2. Mai 2014)

Ich weiß nicht wie ich die Excel-Dateien hochladen kann. Wenn jemand weiß, wie das richtig geht, darf er mir gern helfen

Excel 1

BASISDATEN				 GEOMETRIE								ÄHNLICHKEIT / WIRTSCHAFTLICHKEIT	
ID	Bezeichnung	            Art	Material	Volumen [in m³]	Ähnlichkeitskoeff.	    Empfehlung System


	DEMO-Datensatz												
6	Winkel	                    P	        DC04		0,05		         [leer]                           10 - Verschnitt aus Presse - Übereinstimmung: 71,4 %
7	Blechverschnitt	            V	        DX56D	0,30	                  0,166666667	           [leer] 
8	Zerspanungsverschnitt	    V	        DC07		0,02	                  Keine Verwertung möglich [leer] 	
9	Pneumatik-Zylinder	    P	        DD14		0,02	                  ---	                            [leer] 
10	Verschnitt aus Presse	    V	        DC01		0,07	                  0,714285714	          [leer] 



Excel 2

Art	Volumen	Ähnlichkeit
V	1	
P	2	
P	3	
V	4	
P	5


Oh Gott, sieht das bescheuert aus. Ich habe es mit Tabs zumindest halbwegs in eine Form gebracht aber der Hund nimmt es nicht an. Tut mir Leid.


----------



## FetterOtter (5. Mai 2014)

Ich weiß nicht, ob ich deine Vorgaben richtig verstanden habe, aber ich würde es wohl in etwa so lösen:


```
FileInputStream myInput = new FileInputStream("Y:/Eigene Dateien/Test.xls");
      POIFSFileSystem fileSystem = new POIFSFileSystem(myInput);
      HSSFWorkbook workbook = new HSSFWorkbook(fileSystem);
      HSSFSheet sheet = workbook.getSheetAt(0);

      for (int i = 0; i < sheet.getLastRowNum(); i++)
      {
        double faktor = 0;
        int index = -1;
        HSSFRow rowP = sheet.getRow(i);
        if (rowP.getCell(2).getStringCellValue().equals("P"))               // Zu jedem Produkt...
        {
          for (int j = 0; j < sheet.getLastRowNum(); j++)
          {
            HSSFRow rowV = sheet.getRow(j);
            if (rowV.getCell(2).getStringCellValue().equals("V"))           // ...alle Verschnitte durchsuchen
            {
              if (rowP.getCell(3).getStringCellValue().equals(rowV.getCell(3).getStringCellValue()) &&   // Material ist gleich
                  rowP.getCell(4).getNumericCellValue() < rowV.getCell(4).getNumericCellValue())         // Produktgröße < Verschnittgröße
              {
                double faktorNeu = rowP.getCell(4).getNumericCellValue() / rowV.getCell(4).getNumericCellValue();
                if (faktor == 0 ||
                    faktor > faktorNeu)
                {
                  faktor = faktorNeu;
                  index = j;
                }
              }
            }
          }
          if (index >= 0)
          {
            // In rowP optimalen Verschnittrest eintragen (Variablen "faktor" und "index")
          }
          else
          {
            // Produkt kann nicht aus Verschnittresten erstellt werden
          }
        }
      }
```

Ansatz hierbei ist, zu jedem zu erstellenden Produkt zu schauen, ob es dafür einen passenden Verschnittrest gäbe. Übrigbleibende Verschnittreste würden nicht gekennzeichnet werden...
Achtung, der Code ist nur "runtergerappelt", habe nix getestet...


----------



## Tinga (5. Mai 2014)

Ich habe gerade nur kurz drübergeschaut. Ich werde mich direkt ransetzen und gucken, was ich damit anfangen kann. Soweit ich das beurteilen kann, hast Du mein Ziel aber verstanden. Von daher hilft mir das enorm weiter, weil ich alleine wie gesagt keine Idee hatte.
Ich melde mich sobald ich es hinbekommen habe oder einen Stand erreicht habe, der eine neue Frage rechtfertigt. 


Ich weiß, dass das nicht ins JavaForum gehört, ich poste es trotzdem mal. Nebenher habe ich auch an anderen Stellen an dem Projekt gearbeitet und rausgekommen ist das:

Verschnittbrse_test

Ohne Dich hätte ich das nie geschafft. Vielen, vielen Dank für alles!



Tinga


----------



## FetterOtter (5. Mai 2014)

Hallo Tinga,

na, das kann sich doch schon sehen lassen!

Ach, hätte ich nicht geholfen, dann hätte sich ein anderer erbarmt...
Aber ich helfe gerne, wenn ich kann. Nur ist es mit meinen Fähigkeiten leider nicht so weit her.
Bin noch nicht ewig dabei und habs auch nicht von der Pike auf gelernt.
Daher werde ich dir wohl nur eingeschränkt helfen können...
Aber wie gesagt, wenn ich kann, helfe ich gerne !!

Tschüssi


----------



## Tinga (5. Mai 2014)

Hallo FetterOtter,



Dein Code hat (fast) perfekt funktioniert. Ich habe ihn gerade zum Laufen gebracht. Es hat zwar ne ganze Weile gedauert aber bei mir sitzt der Fehler halt in den meisten Fällen vor dem Computer.

Was ich Dir noch sagen wollte: 
Wenn ich groß bin werde ich mal Ingenieur. In Mathe war ich immer gut bis sehr gut. Mittlerweile studiere ich an einer überdurchschnittlich angesehenen TU. Ich dachte immer, mein logisches Denkvermögen wäre überdurchschnittlich.
Aber, ganz ehrlich: Dein Code ist weltklasse. Bin total beeindruckt. Ich finde es brutal brilliant, wie Du das gelöst hast, insbesondere den Teil mit faktor und index. Dafür solltest Du den Friedensnobelpreis oder ein Bundesverdienstkreuz bekommen. Ganz großer Respekt!  

Nach zehn Minuten hatte ich das Gefühl, ich hätte verstanden was du machst. Nach ner halben Stunde hatte ichs wirklich. Dann habe ich angefangen den zweiten Teil zu schreiben und Verschnitt mit Produkt zu vergleichen und die Ähnlichkeit auch in die Verschnittzeilen zu schreiben. Leider ist mir ein Fehler unterlaufen. Daher hab ich dann irgendwann ein Stift und Papier in die Hand genommen und bin Schleife für Schleife durchgegangen (1,5 Stunden). Dabei ist mir dann erst aufgefallen, wie genial das wirklich ist. Nebenbei ist mir dann auch mein Fehler aufgefallen. Und zwar habe ich in Zeile 118 das Vorzeichen andersherum gesetzt. Jedenfalls gab es zum Schluss (in der letzten Zeile) noch ein Fehler. Das war ein Produktdatensatz – also Dein „Fehler“.  Ich bin absolut nicht draufgekommen (ich saß aber auch schon den halben Tag davor und hatte viereckige Augen). Ich hab dann noch einen Freund um Rat gefragt und der meinte, dass der letzte Datensatz nicht mitverarbeitet wird. Ich habe dann in Zeile 22 aus Deinem < ein <= gemacht und siehe da, es funktioniert.
Für mich ist es absolut unvorstellbar, wie Du das einfach „runterrappeln“ kannst während ich Stift und Papier brauch, um es überhaupt nachzuvollziehen. Ohne dass ich mir alles aufgeschrieben hätte, hätte ich es immer noch nicht hinbekommen. 

Im Ernst: Du bist mein Held! Wenn ich Dir bei irgendwas helfen kann (vermutlich in diesem Leben nicht mehr beim Programmieren), lass es mich wissen.



Tinga




Hoffentlich können auch andere Leute davon profitieren. Daher hier unser fertiger Code zu dem Problem:
[JAVA=42]
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;


public class Test {

	public static void main (String[] args) {
		try {
			FileInputStream myInput = new FileInputStream("C:/Users/max/Desktop/Max/Studium/Master/00_Hiwi/20140307_Eclipse/140501_spalte2/Excel.xls");
		    POIFSFileSystem fileSystem = new POIFSFileSystem(myInput);
		    HSSFWorkbook workbook = new HSSFWorkbook(fileSystem);
		    HSSFSheet sheet = workbook.getSheetAt(0);


		    for (int i = 1; i <= sheet.getLastRowNum(); i++)
		      {
		        double faktor = 0;
		        int index = -1;
		        HSSFRow rowP = sheet.getRow(i);
		        if (rowP.getCell(1).getStringCellValue().equals("P"))               // Zu jedem Produkt...
		        {
		          for (int j = 1; j < sheet.getLastRowNum(); j++)
		          {
		            HSSFRow rowV = sheet.getRow(j);
		            if (rowV.getCell(1).getStringCellValue().equals("V"))           // ...alle Verschnitte durchsuchen
		            {
		              if (	  //rowP.getCell(3).getStringCellValue().equals(rowV.getCell(3).getStringCellValue()) &&   // Material ist gleich	
		            		  rowP.getCell(2).getNumericCellValue() < rowV.getCell(2).getNumericCellValue())         // Produktgröße < Verschnittgröße
		              {
		                double faktorNeu = rowP.getCell(2).getNumericCellValue() / rowV.getCell(2).getNumericCellValue();
		                if (faktor == 0 ||
		                    faktor > faktorNeu)
		                {
		                  faktor = faktorNeu;
		                  index = j;
		                }
		              } 

		            }
		          }
		          if (index >= 0)
		          {
		        	  HSSFCell cell3 = rowP.createCell(3); 
		              cell3.setCellValue("Datensatz Nr." + index + " - " + faktor*100 + " % Übereinstimmung"); // In rowP optimalen Verschnittrest eintragen (Variablen "faktor" und "index")
		          }
		          else
		          {
		        	  HSSFCell cell3 = rowP.createCell(3); 
		              cell3.setCellValue("Keine Übereinstimmung");// Produkt kann nicht aus Verschnittresten erstellt werden
		          }
		        } 

		        /**
		        //Max

		        if (rowP.getCell(1).getStringCellValue().equals("V"))               // Zu jedem Produkt...
		        {
		          for (int j = 1; j < sheet.getLastRowNum(); j++)
		          {
		            HSSFRow rowV = sheet.getRow(j);
		            if (rowV.getCell(1).getStringCellValue().equals("V"))           // ...alle Verschnitte durchsuchen
		            {
		              if (	  //rowP.getCell(3).getStringCellValue().equals(rowV.getCell(3).getStringCellValue()) &&   // Material ist gleich
		            		  rowP.getCell(2).getNumericCellValue() > rowV.getCell(2).getNumericCellValue())         // Produktgröße < Verschnittgröße
		              {
		                double faktorNeu = rowV.getCell(2).getNumericCellValue() / rowP.getCell(2).getNumericCellValue();
		                if (faktor == 0 ||
		                    faktor > faktorNeu)
		                {
		                  faktor = faktorNeu;
		                  index = j;
		                }
		              }
		            }
		          }
		          if (index >= 0)
		          {
		        	  HSSFCell cell3 = rowP.createCell(3); 
		              cell3.setCellValue(index + "-" + faktor); // In rowP optimalen Verschnittrest eintragen (Variablen "faktor" und "index")
		          }
		          else
		          {
		        	  HSSFCell cell3 = rowP.createCell(3); 
		              cell3.setCellValue("Keine Übereinstimmung");// Produkt kann nicht aus Verschnittresten erstellt werden
		          }
		        }

		        //Max
		        **/

		      }


		    for (int i = 1; i <= sheet.getLastRowNum(); i++)
		      {
		        double faktor = 0;
		        int index = -1;
		        HSSFRow rowV = sheet.getRow(i);
		        if (rowV.getCell(1).getStringCellValue().equals("V"))               // Zu jedem Produkt...
		        {
		          for (int j = 1; j < sheet.getLastRowNum(); j++)
		          {
		            HSSFRow rowP = sheet.getRow(j);
		            if (rowP.getCell(1).getStringCellValue().equals("P"))           // ...alle Verschnitte durchsuchen
		            {
		              if (	  //rowP.getCell(3).getStringCellValue().equals(rowV.getCell(3).getStringCellValue()) &&   // Material ist gleich	
		            		  rowP.getCell(2).getNumericCellValue() < rowV.getCell(2).getNumericCellValue())         // Produktgröße < Verschnittgröße
		              {
		                double faktorNeu = rowP.getCell(2).getNumericCellValue() / rowV.getCell(2).getNumericCellValue();
		                if (faktor == 0 ||
		                    faktor < faktorNeu)
		                {
		                  faktor = faktorNeu;
		                  index = j;
		                }
		              }
		            }
		          }
		          if (index >= 0)
		          {
		        	  HSSFCell cell3 = rowV.createCell(3); 
		              cell3.setCellValue("Datensatz Nr." + index + " - " + faktor*100 + " % Übereinstimmung"); // In rowP optimalen Verschnittrest eintragen (Variablen "faktor" und "index")
		          }
		          else
		          {
		        	  HSSFCell cell3 = rowV.createCell(3); 
		              cell3.setCellValue("Keine Übereinstimmung");// Produkt kann nicht aus Verschnittresten erstellt werden
		          }
		        } 


		      }



		    FileOutputStream myOutput = new FileOutputStream(new File("C:/Users/max/Desktop/Max/Studium/Master/00_Hiwi/20140307_Eclipse/140501_spalte2/Excel.xls"));  
	        workbook.write(myOutput);
	        myOutput.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

[/code]


----------



## FetterOtter (6. Mai 2014)

Hallo Tinga,

vielen Dank für das Lob, ich könnte dir stundenlang zuhören... 
Aber das ist wirklich zu viel der Ehre.

Ich versichere dir, wenn du dich weiterhin so engagiert reinhängst, dann hast du mich in einem halben Jahr locker überflügelt. Dann hole ich mir Hilfe bei dir !!

Tut mir leid, dass da noch ein Fehler im Code war, aber es war wie gesagt völlig ungetestet und sollte auch nur ein Denkanstoß sein, wie man es evtl. lösen könnte.
Es sind darin auch nicht alle "Fallstricke" berücksichtigt. Es besteht ja durchaus die Möglichkeit, dass sich mehrere Produkte auf den gleichen Verschnittrest "stürzen". Da musst du halt schauen, wie das gelöst werden soll, z.B. durch den Anwender, oder durch "wer zuerst kommt...".
Das überlasse ich dir...

Liebe Grüße


----------



## FetterOtter (6. Mai 2014)

Übrigens, wenn die for-Schleife in Zeile 22 fehlerhaft war, musst du sie auch in Zeile 29 korrigieren...

Bye


----------

