# jTable bzw. Sortierung



## polenben (25. Januar 2008)

Hallo zusammen,
ich hab ein problem  ,dass mit mehreren problemen zusammen hängt. somit einen kurze erklärung:
Daten aus einer excel spalte auslesen (erledigt)
Daten vergleichen und bei übereinstimmung eine summe bilden und aufaddieren (erledigt)
die so gewonnen statisik ausgegen (erledigt)

so jetzt kern der frage:
die ausgelesenen daten sollen jetzt noch sortiert werden. und dazu habe ich schon ein programm geschrieben, aber irgendwie hab ich mich da irgendwie total verzettelt und vorher eben gerade auch den überblick verloren weil ich molch es nicht OO programmiert habe. naja evtl wirft mal einer nen blick drüber oder gibt mir nen besseren lösungsvorschlag. bzw sagt mir wie er/sie es machen würde 


```
import java.io.File;
import java.io.IOException;
import java.util.Vector;
import java.util.Date;
import jxl.*;
import jxl.write.*;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import java.io.*;
import java.lang.*;
import jxl.write.Number;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;





public class ExcelTest
{
  // Initialisieren der globalen Variablen
  public String path = "//ar203fi2/home/benjamin.assbeck/java/test/namen.xls";
  public Workbook workbook = null;
  public Vector<NameCounter> nameVector = new Vector<NameCounter>();
  //private Vector <NameCounter> nameVector = new Vector();

  /**
   * Programm starten.
   */
  public void start()
  {
    // Abfangen der Exceptions
    try
    {
      // Einlesen der Datei
      this.workbook = Workbook.getWorkbook(new File("//homedir/******/myfile.xls"));

    }
    catch (BiffException e)
    {
      System.out.println("BiffException" + e.getMessage());
    }
    catch (IOException e)
    {
      System.out.println("IOException" + e.getMessage());
    }

    // Tabelle initialisieren
    Sheet sheet = this.workbook.getSheet(0);

    // Erstellen der Zellenobjekte
    String cellText;
    NameCounter nameCounter;

    // Die zu durchsuchende Spalte und Startzeile initialisieren
    int suchSpalte = 4;
    int startZeile = 8;

    // Schleife für Zellenüberprüfung
    for (int i = startZeile; i < sheet.getRows(); i++)
    {
      // Einlesen der Zellen in die String-Variablen
      cellText = sheet.getCell(suchSpalte, i).getContents().trim();

      nameCounter = isNameInVector(cellText);

      if (nameCounter == null)
      {
        if (!cellText.equals(""))
        {
          this.nameVector.add(new NameCounter(cellText));
        }
      }
      else
      {
        nameCounter.setCounterUp();
      }
    }

    try{
    
      WritableWorkbook workbook1 = Workbook.createWorkbook(new File("//homedir/******/myfile.xls"));
      WritableSheet sheet1 = workbook1.createSheet("meop2", 2);
      
       // Schleife für die Konsolenausgabe
     for (int i = 0; i < this.nameVector.size(); i++)
      {
         nameCounter = this.nameVector.elementAt(i);

         System.out.println(nameCounter.getName() + ": "  +" \t "+ nameCounter.getCounts());

         Label label = new Label(3, (i+5),nameCounter.getName() + ": "  );
         sheet1.addCell(label);

         Number number = new Number(6, (i+5), nameCounter.getCounts());
         sheet1.addCell(number);
      }
         workbook1.write();
         workbook1.close();
    }
    
      catch (Exception e) {
       System.out.println("Exception: " + e.getMessage());

      }
  }
       public class CSVTest extends JFrame
  {
            private class MeinWindowListener extends WindowAdapter
           {
            public void windowClosing(WindowEvent arg0)
            {
             System.exit(0);
            }
           }
      private String[] columnNamen = { "Spalte 1", "Spalte 2" };
      private DefaultTableModel tableModel;
      private JButton button;
      private JComponent contentPane = (JComponent) getContentPane();
      
              CSVTest()
               {
                 super("CSV Test");
                 setSize(800, 600);
                 initLayout();
                 setLocationRelativeTo(null);
                 addWindowListener(new MeinWindowListener());
                 setVisible(true);
                 setResizable(true);
                }
      
          void initLayout()
   {
        contentPane.setLayout(new BorderLayout());

        tableModel = new DefaultTableModel(null, columnNamen);
        JTable tableZahlen = new JTable(tableModel);
        tableZahlen.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

         JScrollPane scrollPane = new JScrollPane(tableZahlen);
         scrollPane.setPreferredSize(new Dimension(300, 300));

         JPanel jpTable = new JPanel();
         jpTable.add("Center", scrollPane);
         contentPane.add("West", jpTable);

                button = new JButton("Einlesen");
               button.addActionListener(new ActionListener()
               {
                public void actionPerformed(ActionEvent e)
                {
                    readFile();
                }
               });

        JPanel jpButton = new JPanel();
        jpButton.add(button);
        contentPane.add("South", jpButton);

    }


        /**
        *
        */
        protected void readFile()
        {
         try{
              BufferedReader reader = new BufferedReader(new File("//homedir/******/myfile.xls"));

                String strLine;
                while ( (strLine = reader.readLine()) != null )
                 {
                  String[] items = strLine.split(";");
                  tableModel.addRow(items);
                 }
                 tableModel.fireTableDataChanged();
             }
                 catch(FileNotFoundException e) {}
                 catch(IOException e) {}
        }
      
      
   }
  
  /**
   * Überprüfen ob der Name bereits im Vector vorhanden ist.
   */
  public NameCounter isNameInVector(String name)
  {
    NameCounter nameCounter = null;
    NameCounter nameCounterTest;

    for (int i = 0; i < nameVector.size(); i++)
    {
      nameCounterTest = nameVector.elementAt(i);

      if (nameCounterTest.getName().equals(name))
      {
        nameCounter = nameCounterTest;
        break;
      }
      else
      {
        nameCounter = null;
      }
    }

    return nameCounter;
  }




  /**
   * Mainmethode

   */
      public static void main(String[] args)
      {
       new ExcelTest().start();
        CSVTest frame = new CSVTest();
       frame.setLocation(150, 90);
       frame.setSize(600, 500);
       frame.setResizable(true);
       frame.setVisible(true);


      }

}
```




```
public class NameCounter
{
  public String name;
  public int counter;

  /**
   * Konstruktor
   */
  public NameCounter(String name)
  {
    this.name = name;
    this.counter = 1;
  }

  /**
   * Erhöht den Namenzähler
   */
  public void setCounterUp()
  {
    this.counter++;
  }

  /**
   * Gibt den Namen zurück.
   *
   * @return {@link String}
   */
  public String getName()
  {
    return name;
  }

  /**
   * Gibt die Anzahl der gezählten Namen zurück.
   *
   * @return {@link Integer}
   */
  public int getCounts()
  {
    return counter;
  }
}
```


----------



## Matze (25. Januar 2008)

Also:
Verschiedene Sortieralgorytmen: Sortieralgorithmen

Hier hast du 81 Threads, indenen das Thema "String Sortierung" bereits behandelt wurde: Wow, alles über die Suchfunktion

So, noch Fragen


----------



## lernen.2007 (25. Januar 2008)

Hallo,

ich weiß nicht mit was für JAVA Version du programmierst aber so automatisches Sortieren nach Datentyp ist in java 1.6 enthalten. Falls du mit 1.5 machst, dann gibt es jxtable Möglichkeit.

Gruß
lernen.2007


----------



## polenben (28. Januar 2008)

Hallo zusammen, evtl habe ich mich ein bisschen falsch ausgedrückt, sodass ihr mich falsch verstanden habt. bei menem code den ich gepostet habe bekomme ich eine fehlermeldung (sortierung schon integriert). Allerdings weiß finde ich den fehler nicht auch nach mehrmaligen drüber schauen hab ich ihn nicht entdeckt. 

Felhermeldung:         CSVTest frame = new CSVTest();

evtl kann mir ja einer helfen.
vielen dank schonmal

greez ben


----------



## Matze (28. Januar 2008)

polenben hat gesagt.:


> so jetzt kern der frage:
> die ausgelesenen daten sollen jetzt noch sortiert werden. und dazu habe ich schon ein programm geschrieben, aber irgendwie hab ich mich da irgendwie total verzettelt ...



Wie soll man das anders verstehen?

Und wie lautet die Fehlermeldung?


----------



## polenben (28. Januar 2008)

Fehlermeldung: Non-static variable cannot be referenced from a non-static context

hab auch schon eine neue methode geschrieben, die ich dann in der main methode wieder aufrufe um sie auzuführen, allrdings klappt das irgendwie nicht.

montag morgen und ich könnt schon wieder kotzen ^^


----------



## Matze (28. Januar 2008)

polenben hat gesagt.:


> Fehlermeldung: Non-static variable cannot be referenced from a non-static context



Sagt die Fehlermeldung nicht schon alles?

```
CSVTest frame = new CSVTest();
frame.setLocation(150, 90);
frame.setSize(600, 500);
frame.setResizable(true);
frame.setVisible(true);
```
Entferne mal alle 4 Zeilen unter CSVTest frame = new CSVTest();


----------



## polenben (28. Januar 2008)

es geht deswegen auch noch nicht. die vier zeilen hatte ich anfangs mal drinnen. da ich die im konstrukter gesetzten variablen dadurch ja verändern/ersetzen kann.


----------



## Matze (28. Januar 2008)

Kannst du mal genauer sagen, wo der Fehler geworfen wird? Bestimmt nicht beim Erzeugen des Objekts. Ich denke im Konstruktor. Und wenn dus schon gemerkt hast, wieso schreibst du die 4 Angaben nicht gleich in den Konstruktor?


----------



## MeinerEiner_80 (28. Januar 2008)

Moin!
Die Fehlermeldung , wie Matze schon meinte,  sagt alles, aber die Ursache liegt wirklich in der Erstellung des Objekts.
Da CSVTest als nichtstatische innere Klasse von ExcelTest implementiert ist, kann sie nunmal nicht ohne eine Instanz von ExcelTest erstellt werden.
Unabhängig davon, ob es in diesem Zusammenhang sinnvoll ist, was du machst, CSVTest kann folgendermassen erstellt werden:

```
public static void main(String[] args){
ExcelTest test = new ExcelTest();
CSVTest frame  = test.new CSVTest();

//oder 
CSVTest frame = new ExcelTest().new CSVTest();

}
```


*grüssle*
MeinerEiner


----------



## polenben (28. Januar 2008)

So juetzt nochmal was anderes. hab den code nochmal geändert und jetzt wird kein fehler mehr geworfen. dass einzige, was jetzt nicht funktioniert oder evtl vielleicht auch nicht mehr ist, dass er mir müll ausgiebt
aber zuerst der code: 


```
import java.io.File;
import java.io.IOException;
import java.util.Vector;
import java.util.Date;
import jxl.*;
import jxl.write.*;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import java.io.*;
import java.lang.*;
import jxl.write.Number;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;



  public class CSVTest extends JFrame
  {
  // Initialisieren der globalen Variablen
  public String path = "//test/transporte.xls";
  public Workbook workbook = null;
  public Vector<NameCounter> nameVector = new Vector<NameCounter>();
  
            private class MeinWindowListener extends WindowAdapter
           {
            public void windowClosing(WindowEvent arg0)
            {
             System.exit(0);
            }
           }
      private String[] columnNamen = { "Spalte 1", "Spalte 2" };
      private DefaultTableModel tableModel;
      private JButton button;
      private JComponent contentPane = (JComponent) getContentPane();

              CSVTest()
               {
                 super("CSV Test");
                 setSize(800, 600);
                 initLayout();
                 setLocationRelativeTo(null);
                 addWindowListener(new MeinWindowListener());
                 setVisible(true);
                 setResizable(true);
                }

          void initLayout()
   {
        contentPane.setLayout(new BorderLayout());

        tableModel = new DefaultTableModel(null, columnNamen);
        JTable tableZahlen = new JTable(tableModel);
        tableZahlen.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

         JScrollPane scrollPane = new JScrollPane(tableZahlen);
         scrollPane.setPreferredSize(new Dimension(300, 300));

         JPanel jpTable = new JPanel();
         jpTable.add("Center", scrollPane);
         contentPane.add("West", jpTable);

                button = new JButton("Einlesen");
               button.addActionListener(new ActionListener()
               {
                public void actionPerformed(ActionEvent e)
                {
                    readFile();
                }
               });

        JPanel jpButton = new JPanel();
        jpButton.add(button);
        contentPane.add("South", jpButton);
        
        
    }
        protected void readFile()
        {
         try{
               // Abfangen der Exceptions
               try
               {
               // Einlesen der Datei
               this.workbook = Workbook.getWorkbook(new File("//java/test/transporte.xls"));

               }
                catch (BiffException e)
                {
                 System.out.println("BiffException" + e.getMessage());
                  }
                  catch (IOException e)
                  {
                  System.out.println("IOException" + e.getMessage());
                  }

                  // Tabelle initialisieren
                  Sheet sheet = this.workbook.getSheet(0);

                  // Erstellen der Zellenobjekte
                  String cellText;
                  NameCounter nameCounter;

                  // Die zu durchsuchende Spalte und Startzeile initialisieren
                  int suchSpalte = 4;
                  int startZeile = 8;

                  // Schleife für Zellenüberprüfung
                  for (int i = startZeile; i < sheet.getRows(); i++)
                  {
                       // Einlesen der Zellen in die String-Variablen
                       cellText = sheet.getCell(suchSpalte, i).getContents().trim();

                      nameCounter = isNameInVector(cellText);

                      if (nameCounter == null)
                     {
                         if (!cellText.equals(""))
                        {
                         this.nameVector.add(new NameCounter(cellText));
                        }
                       }
                     else
                     {
                     nameCounter.setCounterUp();
                     }
                     }

             }

                  catch (Exception e)
                  {
                  System.out.println("IOException" + e.getMessage());
                  }
                 
        }
        
          /**
   * Überprüfen ob der Name bereits im Vector vorhanden ist.
   */
  public NameCounter isNameInVector(String name)
  {
    NameCounter nameCounter = null;
    NameCounter nameCounterTest;

    for (int i = 0; i < nameVector.size(); i++)
    {
      nameCounterTest = nameVector.elementAt(i);

      if (nameCounterTest.getName().equals(name))
      {
        nameCounter = nameCounterTest;
        break;
      }
      else
      {
        nameCounter = null;
      }
    }

    return nameCounter;
    
    
  }
  
  CSVTest frame = new CSVTest ();
  
  public static void main(String[] args)
      {
       new ExcelTest().start();
          new CSVTest();



      }

    
}
```

und die ausgabe ist:

MUELLERA:    11
RADICE:    10
BEHNCKE:    4
DENNEHY:    7
PIESKER:    1
JOAS:    1
4INVOICE1:    1
EASY:    1
BORTOLAZZI:    1
ROMEU:    1
Moep:    2

Exception in thread "main" java.lang.StackOverflowError
 at sun.awt.Win32GraphicsConfig.getBounds(Native Method)
 at sun.awt.Win32GraphicsConfig.getBounds(Win32GraphicsConfig.java:240)
 at java.awt.Window.init(Window.java:368)
 at java.awt.Window.<init>(Window.java:407)
 at java.awt.Frame.<init>(Frame.java:402)
 at javax.swing.JFrame.<init>(JFrame.java:207)
 at CSVTest.<init>(CSVTest.java:51)
 at CSVTest.<init>(CSVTest.java:178)
 at CSVTest.<init>(CSVTest.java:178)
 at CSVTest.<init>(CSVTest.java:178)
 at CSVTest.<init>(CSVTest.java:178)
 at CSVTest.<init>(CSVTest.java:178)
 at CSVTest.<init>(CSVTest.java:178)
 at CSVTest.<init>(CSVTest.java:178)
 at CSVTest.<init>(CSVTest.java:178)
 at CSVTest.<init>(CSVTest.java:178)


zusätliche infos: das programm lässt sich ohne probleme compelieren allerdings ist die ausgabe dieser zeilen in der entwicklungsumgebung selbst. und nicht in einer jtabele die ich doch so gerne hätte. und die namen endlich zu sortieren ^^
wenn ihr noch fragen dazu habt, da ich zu ungenau beschrieben habe oder sonst irgendwas nicht versteht von meinem nonsens dann fragt bitte und überlest diesen foren post nicht nur.
thx


----------



## Matze (28. Januar 2008)

Also wie du Daten in eine JTable bekommst, ja, da dürfte es hier genug Themen auf Tutorials geben. Passt aber NICHT in dies Thread (-> siehe deinen Thread Namen)


----------



## MeinerEiner_80 (28. Januar 2008)

1. Das was du da gepostet hast, lässt sich ganz und gar nicht fehlerfrei kompilieren. Wo ist denn deine ExcelTest Klasse hingewandert? Existiert die noch? Zumindest mal nicht mal in dem was du gepostet hast..

2. Würde ich dich bitten, halte dich mal an die Netiquette. Insbesondere, was Rechtschreibung/ Gross-Kleinschreibung angeht. Das ist nämlich echt grausig zu lesen, was du da schreibst und trägt sicher nicht dem Verständniss bei!

*grüssle*
MeinerEiner


----------



## polenben (29. Januar 2008)

Die ExcelTest Klasse ist die gleich wie die CSVTest Klasse, hab lediglich 2 Programme geöffnet gehabt um etwas zu testen, bzw gleich den Unterschied zu sehen im direkten Vergleich.

Allerdings besteht mein Problem immmer noch. Mittlerweile hab ich schon diverse Ansätze wie:


```
if (v1<v2) return -1;
if (v1>v2) return 1;
if (v1==v2{
  return n1.compareTo(n2);
}
```

allerdings hatte ich da ein Problem mit der Namens und Anzahl Sortierung, die da nicht funktioniert hatte.Und mit Comparator und Comparable aus der API komm ich einfach nicht zurecht... Hab es mit ihnen probiert aber mir hats jedes mal das Prog geschossen.

Jetzt hoffe ich halt auf eure Unterstützung, dass ihr mir da weiter helft und evtl gleich nen kleinen Teil des Progs liefert.

vg Benni


----------

