Announcement

Collapse
No announcement yet.

Fehlermeldung im Eclipse

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Fehlermeldung im Eclipse

    Ich schreibe gerade in Eclipse ein JavaBean und möchte per Knopfdruck eine Tabelle in Excel ausgeben.

    Mein Code lautet:
    public int getPosition() {
    return Position;
    }

    public void setPosition(int position) {
    Position = position;
    }


    public void onArtikelExcel(ActionEvent e)
    {
    HSSFWorkbook arbeitsmappe = new HSSFWorkbook();
    HSSFSheet datenblatt = arbeitsmappe.createSheet("Artikelliste");

    HSSFRow ueberschrift = datenblatt.createRow(0);
    HSSFCell ueberschriftA = ueberschrift.createCell( (short) 0); ueberschriftA.setCellValue("Pos.");
    ...

    for (int i = 0; i < currentArtikelList.size(); i++) {

    HSSFRow inhalt = datenblatt.createRow(i+1);
    HSSFCell inhaltA = inhalt.createCell( (short) 0); inhaltA.setCellValue(currentArtikelList.get(i).get Position());
    ...
    In der for Schleife meckert er mir dann aber immer "getPosition" an, mit der Meldung "the method getPosition() is undefined for the type object." Was muß ich hier tun, damit es funzt?

  • #2
    get Position());

    Da ist zumindestens hier in deinem Code ein Leerzeichen mit drin
    Christian

    Comment


    • #3
      War vermutlich falsch kopiert. Ich hab im code aber kein Leerzeichen drin.

      Folgenden Tip hab ich noch bekommen:
      die currentArtikelList ist eine Liste ohne Definition der Objekte die beinhaltet sind.

      Darum sagt er „undefined for object“ – denn erwartet irgendein Objekt. Und ob irgendein Objekt auch eine Methode namens getPosition() hat kann er natürlich nicht wissen!

      Nun gibt es folgende Möglichkeit:

      Du definierst beim erstellen der Liste das nur objekte vom Typ Zeile beinhaltet sind.
      Der Vorschlag hat wohl was mit den spitzen Klammern <> zu tun.

      Comment


      • #4
        Dann frag doch den Tippgeber???

        Ich kann <> nicht sehen

        Oder meinst du

        http://www.rz.uni-hohenheim.de/anw/p...0001D41F032100

        Kap. 6.13.1
        Christian

        Comment


        • #5
          Hallo zusammen,

          damit ist einfach die Typisierung von generischen Datentypen (seit Java5), gemeint. Der Default-Rückgabewert von List ist im allgemeinen Object, welches du auf den entsprechenden Typ casten must. Oder du probierst dies:
          Code:
          List<Artikel> currentArtikelList = new LinkedList<Artikel>();
          ...
          Artikel artikel = currentArtikelList.get(i).get Position();
          sollte auch gehen, denk ich. Bin noch nicht ganz wach
          Ach ich seh gerade, der Christian hat es ja schon geschrieben. Naja. Egal.

          Comment


          • #6
            Dieses Problem ist mittlerweile gelöst. Der Fehler war hier versteckt:

            private List<Zeile> currentArtikelList = new ArrayList<Zeile>();
            Ich hatte "<Zeile>" vergesssen. Aber meine Excelliste wird noch nicht mit Daten gefüllt, nur mit den Überschriften. Mein Tipgeber (ich werde von ihm eingearbeitet, bin nämlich absoluter Java-Neuling in der Firma) sagte mir, ich muß die currentArtikelList ja auch erst mit Daten füllen. Entweder die Daten erneut aus der DB abfragen, oder die Daten aus dem Objekt hinter der Fixgrid nehmen.

            Damit konnte ich aber noch nicht viel anfangen. Mit der Methode getItems() könnte ich an die Zeile Objekte herankommen.

            Comment


            • #7
              Auch das Problem ist jetzt gelöst. Mein Code an der betreffenden Stelle sieht jetzt so aus:

              private void ladeArtikelliste()
              {
              System.out.println("Lade Artikelliste!");

              Connection con;
              try
              {
              Class.forName("com.mysql.jdbc.Driver");
              con=DriverManager.getConnection("jdbc:mysql://localhost/uebungtest1", "root", "geis");
              Statement statement=con.createStatement();
              statement.executeQuery("select * from lager order by id");
              ResultSet rs = statement.executeQuery("select * from lager order by id");
              while (rs.next())
              {
              Zeile z = new Zeile();
              z.setSpaltePos(rs.getInt("id"));
              z.setSpalteAnzahl(rs.getInt("anzahl"));
              z.setSpalteBezeichnung(rs.getString("bezeichnung") );
              z.setSpaltePreis(rs.getDouble("preis"));
              lagerTabelle.getItems().add(z);
              currentArtikelList.add(z);
              }
              con.close();
              }
              catch (ClassNotFoundException e1)
              {
              e1.printStackTrace();
              }

              catch (SQLException e2)
              {
              e2.printStackTrace();
              }
              }
              Ich hab lediglich die Zeile currentArtikelList.add(z); zugefügt. Aber was genau mach ich jetzt damit? Frage ich die DB ab, oder ist es doch in irgendeiner Art eine getItems Methode?

              Comment


              • #8
                Guten Morgen,

                also fangen wir mal so an:

                Code:
                private void ladeArtikelliste()
                Diese Mehtode liest eine Datenbank aus und schreibt die gelesenen Artikel in die currentArtikelList Liste. Soweit fein.

                Code:
                ...
                Class.forName("com.mysql.jdbc.Driver");
                con=DriverManager.getConnection("jdbc:mysql://localhost/uebungtest1", "root", "geis");
                Statement statement=con.createStatement();
                statement.executeQuery("select * from lager order by id");
                ResultSet rs = statement.executeQuery("select * from lager order by id");
                hier verbindest du dich mit der Datenbank und liest alle Daten aus der Tabelle Lager, wobei das Ergebnis nach ID sortiert wird. Dir wird sicherlich auffallen, dass du die Zeile mit dem executeQuery("select ... "); doppelt hast. Erster kannst du löschen, die zweite mit dem ResultSet (das Ergebnis deiner Datenbankanfrage) verwenden wir anschließend gleich weiter.

                Die Zeilen:
                Code:
                ...
                while (rs.next())
                {
                Zeile z = new Zeile();
                z.setSpaltePos(rs.getInt("id"));
                z.setSpalteAnzahl(rs.getInt("anzahl"));
                z.setSpalteBezeichnung(rs.getString("bezeichnung") );
                z.setSpaltePreis(rs.getDouble("preis"));
                lagerTabelle.getItems().add(z);
                currentArtikelList.add(z);
                }
                ...
                bewirkt folgendes. Du legst ein neues Objekt vom Typ Zeile an. Dieses wird mit den Daten aus der ersten Zeile des ResultSets, also der Ergebnistabelle aus der Datenbankanfrage gefüllt. Wir lesen ID, Preis, Anzahl und Beschreibung und schreiben diese Daten in das Zeilen Objekt. Anschließend fügen wir diese Zeile über currentArtikelList.add(z); in die Liste mit unseren Artikeln. Also z wird zur liste hinzu "geadded" (was für ein schlimmes Deutsch). Dann wird die zweite Zeile des ResultSets bearbeitet. Solange, bis rs.next() false liefert, also anzeigt, dass es keine weiter Zeile mehr gibt.

                Der Rest ist Datenbankverbindung schließen und Fehlerbehandlung. Wenn ich mir noch eine Anmerkung erlauben darf, die Klasse Zeile würde ich ehre in so etwas wie Artikel oder LagerArtikel umbennen, weil du Artikel aus der Datenbank ausliest und in der Liste speicherst. Mit Zeilen hat es eher weniger zu tun (die Datenbank speichert sie halt als Zeilen, mehr aber auch nicht).

                Also die erfragte Zeile fügt somit Elemente zur Liste hinzu, während getItem ein Elemente ausliest (nicht entfernt!).

                Hoffe das war hilfreich.

                jan

                Comment


                • #9
                  Danke für Deine Antwort. Sehr gut erklärt. Ich frage also die Datenbank ab. Mein Tipgeber meinte ja als zweite Möglichkeit "oder die Daten aus dem Objekt hinter der Fixgrid nehmen."
                  Das hab ich dann auch noch gemacht. Nachdem ich ja schon lagerTabelle.getItems().add(z); im Code stehen hatte, mußte ich nur die Zeile HSSFCell inhaltA = inhalt.createCell( (short) 0); inhaltA.setCellValue(currentArtikelList.get(i).get Position()); ändern in HSSFCell inhaltA = inhalt.createCell( (short) 0); inhaltA.setCellValue(lagerTabelle.getItems().get(i ).getSpaltePos());

                  Comment

                  Working...
                  X