Zeilenweise Excel-Datei mit Strings befüllen

Tinga

Mitglied
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

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

Java:
 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));

Java:
 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.
 
Zuletzt bearbeitet:

Tinga

Mitglied
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

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

Mitglied
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

Bekanntes Mitglied
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
Code:
String eventText = i + ";" + bezeichnung + ";" + selectedItem1 + ";" + selectedItem2;
änderst du ab in
Code:
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...
 
Zuletzt bearbeitet:

FetterOtter

Bekanntes Mitglied
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:
Java:
  public JComboBox getArtAuswahl()
  {
    return artAuswahl;
  }
Und Klasse 5 könnte dann über diesen Getter auf die Variable zugreifen:
Java:
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

Mitglied
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

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

Mitglied
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

Bekanntes Mitglied
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.
Code:
public class Klasse5 implements ActionListener
Und den Button würde ich quasi "an mich selbst" hängen:
Code:
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:
Java:
  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

Mitglied
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

Bekanntes Mitglied
Klasse 1:
Java:
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:
Java:
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

Mitglied
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

Mitglied
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

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

Mitglied
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

Mitglied
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

Mitglied
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

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

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

Hier Klasse "MainFrame":

Java:
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":

Java:
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":

Java:
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":

Java:
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":

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

Mitglied
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

Mitglied
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

Mitglied
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.
 
Zuletzt bearbeitet:

FetterOtter

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

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

Mitglied
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

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

Mitglied
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

Bekanntes Mitglied
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
3 Textdatei Zeilenweise auslesen Java Basics - Anfänger-Themen 3
X Textdatei: zwei-zeilenweise gleiche Zeilen rausschmeißen Java Basics - Anfänger-Themen 21
N Datei Zeilenweise einlesen, Ausgabe mehrere Arrays Java Basics - Anfänger-Themen 7
B Datei zeilenweise auslesen Java Basics - Anfänger-Themen 7
C Laufzeitverhalten beim zeilenweise durchlaufen eines 2 dimensional array Java Basics - Anfänger-Themen 6
G Datei zeilenweise lesen Java Basics - Anfänger-Themen 19
G Zeilenweise lesen Java Basics - Anfänger-Themen 17
D Texdatei zeilenweise einlesen Java Basics - Anfänger-Themen 3
J Array manuell vom User eingeben, Zeilenweise Java Basics - Anfänger-Themen 2
A CSV Zeilenweise einlesen und in einer HashMap speichern Java Basics - Anfänger-Themen 12
D txt-Datei zeilenweise als String einlesen Java Basics - Anfänger-Themen 2
E Zeilenweise in Dateich schreiben Java Basics - Anfänger-Themen 5
T Input/Output 20Mb Textdatei zeilenweise auslesen Java Basics - Anfänger-Themen 10
E Input/Output Linux datei in Windows zeilenweise einlesen Java Basics - Anfänger-Themen 4
B INI Zeilenweise einlesen. Java Basics - Anfänger-Themen 6
B Textdatei Zeilenweise lesen? Java Basics - Anfänger-Themen 3
E Zeilenweise einlesen Java Basics - Anfänger-Themen 5
B txt Datein zeilenweise einlesen Java Basics - Anfänger-Themen 4
fbn Datei als Ganzes lesen (nicht zeilenweise) Java Basics - Anfänger-Themen 8
H Datei zeilenweise rückwärts lesen Java Basics - Anfänger-Themen 9
B Die PHP Ausgabe Zeilenweise in Java auslesen Java Basics - Anfänger-Themen 8
N aus .txt innerhalb eines JARs Zeilenweise lesen Java Basics - Anfänger-Themen 8
-horn- CSV-file zeilenweise einlesen, was bearbeiten, nächste Zeile Java Basics - Anfänger-Themen 15
G String zeilenweise einlesen Java Basics - Anfänger-Themen 2
A Datei einlesen und splitten nur zeilenweise Java Basics - Anfänger-Themen 7
J Datei zeilenweise lesen. Java Basics - Anfänger-Themen 4
G Zeilenweise Tastatureingaben Java Basics - Anfänger-Themen 2
K Zeilenweise lesen aus einem Array Java Basics - Anfänger-Themen 12
A Zeilenweise einlesen eines Strings Java Basics - Anfänger-Themen 4
M Text Zeilenweise ein lesen und Spaltenweise ausgeben Java Basics - Anfänger-Themen 2
N Textdatei zeilenweise auslesen Java Basics - Anfänger-Themen 8
S Daten zeilenweise aus Datei einlesen Java Basics - Anfänger-Themen 7
Dilandau textdatei zeilenweise schreiben? Java Basics - Anfänger-Themen 2
M Matrizen zeilenweise einlesen (Größe unbekannt) Java Basics - Anfänger-Themen 4
P problem mit zeilenweise einlesen aus Datei Java Basics - Anfänger-Themen 6
S txt Einlesen (Zeilenweise) Java Basics - Anfänger-Themen 3
H Excel-Tabellen mit Java erstellen Java Basics - Anfänger-Themen 4
D Strings aus Excel-Datei einlesen Java Basics - Anfänger-Themen 2
A Verarbeiten einer Excel Datei durch das java-Programm Java Basics - Anfänger-Themen 3
rafi072001 Lesen aus einem Excel File Java Basics - Anfänger-Themen 10
P JSON-Array auf Excel-Spalten verteilen? Java Basics - Anfänger-Themen 5
S Verbindung von einer Excel Datei zu Java-- Java Basics - Anfänger-Themen 4
O JTable in Excel mit Farben Java Basics - Anfänger-Themen 8
Trèfle EXCEL-File Laufwerkunabhängig einbinden. Java Basics - Anfänger-Themen 1
S Java Daten in Excel speichern Java Basics - Anfänger-Themen 1
K Apache POI Excel Letzte Reihe einer bestimmten Spalte Java Basics - Anfänger-Themen 1
B Excel File einlesen und Überschrift prüfen Java Basics - Anfänger-Themen 8
S Prüfen ob Zelle in Excel leer ist funktioniert nicht (Apache POI) Java Basics - Anfänger-Themen 18
F Daten aus Excel-Tabelle in Java importieren Java Basics - Anfänger-Themen 15
P Variablen in Excel speichern Java Basics - Anfänger-Themen 6
P String zerstückeln und in Excel einfügen Java Basics - Anfänger-Themen 11
D Daten mit Apache POI in eine Excel Datei schreiben Java Basics - Anfänger-Themen 5
T printf Daten aus der Tabelle in Excel übernehmen Java Basics - Anfänger-Themen 5
S Kalenderwochen im Excel Java Basics - Anfänger-Themen 0
V Excel Datei einlesen und verarbeiten Java Basics - Anfänger-Themen 4
X Verknüpfte Excel Felder mitändern Java Basics - Anfänger-Themen 6
S Wie bestehende Excel-Einträge mit neuen Vergleichen (mit Apache POI)? Java Basics - Anfänger-Themen 0
C Java Applet Fragen: Serialisierung, Excel import Java Basics - Anfänger-Themen 2
T Apache POI (Excel) - Probleme mit Zahlenformat Java Basics - Anfänger-Themen 2
F Excel und Poi Java Basics - Anfänger-Themen 12
P Excel-Tabelle erstellen Java Basics - Anfänger-Themen 4
R POI HSSF liesst in Excel Formel statt Ergebnis Java Basics - Anfänger-Themen 4
D println von excel $A$1 Java Basics - Anfänger-Themen 3
K JApplet zugriff auf Excel Datei Java Basics - Anfänger-Themen 3
D Werte aus Excel in Diagramm einfügen Java Basics - Anfänger-Themen 6
D Design-Tipps für neues Programm (Excel-Charts-...) Java Basics - Anfänger-Themen 3
K Konvertierung von einem Text in eine Zahl in Excel(JXL) Java Basics - Anfänger-Themen 2
H Ausgabe nach Excel exportieren Java Basics - Anfänger-Themen 7
T Datum aus Excel prüfen Java Basics - Anfänger-Themen 2
D Abfragen ob Excel-Dateien Makros enthalten? Java Basics - Anfänger-Themen 4
Strahlungsleck Datentypen Apache Poi & Excel Datumsformat Java Basics - Anfänger-Themen 4
A POI Einlesen Excel Workbook aus BLOB oder von URL anstatt aus Filesystem ? Java Basics - Anfänger-Themen 3
B Abfragen eines Excel-Feldes auf null Java Basics - Anfänger-Themen 17
T Datei mit Excel öffnen Java Basics - Anfänger-Themen 2
D Speichern in Excel über Filechooser Java Basics - Anfänger-Themen 21
S Excel Textfeld auslesen Java Basics - Anfänger-Themen 6
S POI Excel sortieren Java Basics - Anfänger-Themen 4
D BETAVERT aus Excel auch in Java? Java Basics - Anfänger-Themen 4
M Probleme mit Excel Datei und JSP Java Basics - Anfänger-Themen 7
T Text aus Word in Excel formatieren Java Basics - Anfänger-Themen 3
T ins Excel exportieren. Java Basics - Anfänger-Themen 23
B In Java erstellte Dateien in Excel verwenden Java Basics - Anfänger-Themen 4
D excel datei Spalten lesen? Java Basics - Anfänger-Themen 7
M Object in Excel schreiben Java Basics - Anfänger-Themen 4
M HSSF - JTable zu Excel exportieren Java Basics - Anfänger-Themen 13
M Excel in Java Java Basics - Anfänger-Themen 2
G Excel-Interface (J-Integra for COM) Java Basics - Anfänger-Themen 2
J POI: Leere Excel Zellen Java Basics - Anfänger-Themen 3
M Libraries für Arbeit mit Excel (Alternativen) Java Basics - Anfänger-Themen 2
E Schreiben in Excel -Zellen farbig darstellen Java Basics - Anfänger-Themen 4
G Excel in txt umwandeln Java Basics - Anfänger-Themen 1
G Zellen wie bei Excel? Java Basics - Anfänger-Themen 2
T Excel-Datei einlesen Java Basics - Anfänger-Themen 6
S Excel + Datenbank Java Basics - Anfänger-Themen 2
S Daten nach Excel Java Basics - Anfänger-Themen 12
M Auf Excel Datei zugreifen Java Basics - Anfänger-Themen 3
M Hashmap in Excel exportieren Java Basics - Anfänger-Themen 3
G wie funktioniert die Java Excel Api Java Basics - Anfänger-Themen 4
G Kann man Spalten in einer Excel-Tabelle mit Java löschen? Java Basics - Anfänger-Themen 3
V Excel und Java Java Basics - Anfänger-Themen 14

Ähnliche Java Themen

Neue Themen


Oben