Hilfe bei ArrayList<Typ>

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Hilfe bei ArrayList<Typ>

    Hollo Leute,

    bin grade dabei ein Programm zu schreiben und habe da ein Problem mit ArayyList<Typ>.
    Das Problem ist dies: Ich will Fragen in die ArrayList schreiben weil mann nicht absehen kann wieviele fragen es werden kann ich kein normales Array nehmen weil mann dieses beim anlegen Initialisieren muss. Also habe ich ArrayList<> genommen. Ich schreibe also Frage Objekte in die ArrayList (ArrayList<Frage>). Ganz am anfang mache ich nur eine Instanzvariable ( private Frage frage = new Frage(); ). Die Klasse Frage hat mehrer Methoden zwei davon heise setFrageID und setFrageText. Ich setze also die FrageID und Text und schreibe dieses Objekt in die ArrayList<>. (frageListe.add(frage) ). wenn ich jetzt zum beispiel zwei fragen reingeschriben habe [[ frageID=0; frageText = "frage1" und frageID=1;frageText="frage2"]] und die liste in einer for schleife auslese( fragenListe.get(i)) und in ein JText Area einfüge bekomme ich als ergebnis frageID=1; frageText="frage2" und das steht in allen beiden frage Objekten. ich hätte es aber gerne so frageID=0;frageText="frage1" und frageID=1;frageText="frage2".
    ich habe gesehn das ich das ungefähr so machen muss
    private Frage frage1 = new Frage();
    private Frage frage2 = new Frage();
    und dann
    fragenListe.add(frage1);
    fragenListe.add(frage2);
    dann würde es glaube ich das gewünschte ergebnis geben.
    aber ich weis ja nicht wieviele fragen es gibt das hat der user zu entscheiden.
    hier nochmal der Code der zwei Klassen..
    falls ihr noch andere fehler seht wäre ich für rat und kritik dankbar.

    dieKlasse FragenFormulierungsFrame:

    Quellcode

    1. import javax.swing.*;
    2. import javax.swing.border.EtchedBorder;
    3. import javax.swing.border.TitledBorder;
    4. import java.util.ArrayList;
    5. import java.awt.*;
    6. import java.awt.event.ActionEvent;
    7. import java.awt.event.ActionListener;
    8. import java.io.File;
    9. import java.io.FileOutputStream;
    10. import java.io.ObjectOutputStream;
    11. import java.sql.*;
    12. public class FragenFormulierungsFrame extends JInternalFrame{
    13. /**
    14. *
    15. */
    16. private static final long serialVersionUID = 1L;
    17. private JTextArea txtAreaFrage = new JTextArea ();
    18. private JTextArea txtAreaAusgabe = new JTextArea ();
    19. private JScrollPane sPaneFragen = new JScrollPane ();
    20. private JScrollPane sPaneFragenAusgabe = new JScrollPane ();
    21. private JPanel btnPanel = new JPanel();
    22. private JPanel lblPanel = new JPanel();
    23. private JButton btnNext = new JButton("Nächste Frage");
    24. private JButton btnSave = new JButton("Alle speichern");
    25. private JButton btnCancel = new JButton("Abbrechen");
    26. private ArrayList<Frage> fragenListe = new ArrayList<Frage>();
    27. private JLabel lblFragen = new JLabel("Fragen im Speicher: ");
    28. private Frage frage = new Frage();
    29. private Integer fragenCount = new Integer(0);
    30. private FragenFormulierungsFrame parent = this;
    31. // Konstruktor des JInternalFrames
    32. public FragenFormulierungsFrame(){
    33. setTitle("Fragen erstellen");
    34. txtAreaAusgabe.setLineWrap(true);
    35. txtAreaAusgabe.setWrapStyleWord(true);
    36. txtAreaAusgabe.setBorder(new EtchedBorder(Color.BLUE,Color.CYAN));
    37. txtAreaAusgabe.setSize(150,150);
    38. sPaneFragenAusgabe.add(txtAreaAusgabe);
    39. sPaneFragenAusgabe.setViewportView(txtAreaFrage);
    40. //sPaneFragen.setSize(20,20);
    41. sPaneFragenAusgabe.setBorder(new TitledBorder(new EtchedBorder(Color.BLUE,Color.CYAN)));
    42. sPaneFragenAusgabe.setBackground(new Color(129,190,241));
    43. txtAreaFrage.setLineWrap(true);
    44. txtAreaFrage.setWrapStyleWord(true);
    45. txtAreaFrage.setBorder(new EtchedBorder(Color.BLUE,Color.CYAN));
    46. //txtAreaFrage.setSize(250,100);
    47. sPaneFragen.add(txtAreaFrage);
    48. sPaneFragen.setViewportView(txtAreaFrage);
    49. //sPaneFragen.setSize(20,20);
    50. sPaneFragen.setBorder(new TitledBorder(new EtchedBorder(Color.BLUE,Color.CYAN),"Erstellen Sie nacheinander Ihre Fragen"));
    51. sPaneFragen.setBackground(new Color(129,190,241));
    52. lblFragen.setLayout(new FlowLayout(0));
    53. lblFragen.setBorder(new TitledBorder(new EtchedBorder(Color.BLUE,Color.CYAN)));
    54. lblFragen.setBackground(new Color(129,190,241));
    55. btnPanel.setLayout(new FlowLayout(1));
    56. btnPanel.setBackground(new Color(129,190,241));
    57. btnPanel.setBorder(new EtchedBorder(Color.BLUE,Color.CYAN));
    58. btnPanel.add(btnNext);
    59. btnPanel.add(btnSave);
    60. btnPanel.add(btnCancel);
    61. lblPanel.add(lblFragen);
    62. Container C = getContentPane();
    63. C.add(sPaneFragenAusgabe,BorderLayout.CENTER);
    64. C.add(lblPanel,BorderLayout.NORTH);
    65. C.add(sPaneFragen,BorderLayout.EAST);
    66. C.add(btnPanel,BorderLayout.SOUTH);
    67. btnCancel.addActionListener(new MybtnCancelActionListener());
    68. btnNext.addActionListener(new MybtnNextActionListener());
    69. btnSave.addActionListener(new MybtnSaveActionListener());
    70. Dimension D = Toolkit.getDefaultToolkit().getScreenSize();
    71. setSize((D.width)/2,(D.height)/2);
    72. setResizable(true);
    73. Dimension DMinimum = new Dimension();
    74. DMinimum.setSize(360,290);
    75. setMinimumSize(DMinimum);
    76. setClosable(true);
    77. setMaximizable(true);
    78. setAutoscrolls(true);
    79. setLocation ( (D.width - getSize(). width)/2,(D.height - getSize().height)/2);
    80. setVisible (true);
    81. setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    82. }
    83. //ende Konstruktor
    84. //der Text des Labels lblFragen wird hier neu gesetzt
    85. public void setLabelText (Integer fragenCount){
    86. //lblFragen.setSize(10,50);
    87. lblFragen.setText("Fragen im Speicher: "+ fragenCount);
    88. }
    89. //ende Methode
    90. //in dieser Methode werden die formulierten Fragen
    91. //in der ArrayList<Frage> zwischengespeichert
    92. public void addIntoFragenliste (Frage frage){
    93. fragenListe.add(frage);
    94. setFragenCount(fragenListe.size());
    95. }
    96. //ende Methode addIntoFragenliste
    97. //liefert das zwischengespeicherte ArrayList<Frage>
    98. public ArrayList<Frage> getFragneListe (){
    99. return fragenListe;
    100. }
    101. // ende der Methode getFragenListe
    102. //selbsterklärend
    103. public void setFragenCount(Integer fragenCount){
    104. this.fragenCount = fragenCount;
    105. }
    106. //ende der Methode setFragenCount
    107. public Integer getFragenCount(){
    108. return fragenCount;
    109. }
    110. //innere ActionListener Klasse des btnCancel Buttons
    111. public class MybtnCancelActionListener implements ActionListener {
    112. public void actionPerformed(ActionEvent arg0){
    113. if (arg0.getSource().equals(btnCancel))
    114. {
    115. dispose();
    116. //Dimension D = getSize();
    117. //JOptionPane.showMessageDialog(null,"Size hight:" + D.height+"Size width: "+D.width);
    118. }
    119. }
    120. }
    121. //ende innere Klasse
    122. //innere ActionListener Klasse des btnNext Buttons
    123. public class MybtnNextActionListener implements ActionListener {
    124. public void actionPerformed(ActionEvent arg0){
    125. if (arg0.getSource().equals(btnNext))
    126. {
    127. frage.setFrageText(txtAreaFrage.getText());
    128. frage.setFrageID(getFragenCount());
    129. // hier adde ich die Object der array list hinzu
    130. addIntoFragenliste(frage);
    131. //-------------------------------------------------
    132. // und hier Test ich es
    133. for (int i=0; i<=fragenListe.size()-1;i++){
    134. txtAreaAusgabe.append("---> ID: "+fragenListe.get(i).getFrageID()+" :-->Text :"+fragenListe.get(i).getFrageText());
    135. }
    136. // ----------------------------------------------------
    137. setLabelText(getFragenCount());
    138. txtAreaFrage.setText("");
    139. txtAreaFrage.requestFocus();
    140. }
    141. }
    142. }
    143. //ende innere Klasse
    144. public class MybtnSaveActionListener implements ActionListener{
    145. public void actionPerformed(ActionEvent arg0){
    146. // JFileChooser fileChooser = new JFileChooser();
    147. // fileChooser.showSaveDialog(parent);
    148. // String file = fileChooser.getSelectedFile().getName();
    149. try {
    150. FileOutputStream fos = new FileOutputStream("file.ser");
    151. ObjectOutputStream oos = new ObjectOutputStream(fos);
    152. for(int i=0;i<=fragenListe.size()-1;i++){
    153. oos.writeObject(fragenListe.get(i));
    154. txtAreaFrage.append(fragenListe.get(i).getFrageText());
    155. }
    156. oos.close();
    157. JOptionPane.showInternalMessageDialog(parent,"Erfolgreich Serialisiert");
    158. }
    159. catch (IndexOutOfBoundsException ex){
    160. ex.getCause();
    161. ex.printStackTrace();
    162. JOptionPane.showInternalMessageDialog(parent,"Serialisierung fehlgeschlagen!! Fehler: "+ex.getLocalizedMessage());
    163. }
    164. catch(Exception ex1){
    165. JOptionPane.showInternalMessageDialog(parent,"Serialisierung fehlgeschlagen!! Fehler2: "+ex1);
    166. }
    167. }
    168. }
    169. }
    Alles anzeigen




    die Klasse Frage.java

    Quellcode

    1. import java.io.*;
    2. public class Frage implements Serializable {
    3. /**
    4. *
    5. */
    6. //private static final long serialVersionUID = 1L;
    7. private Integer frageID = new Integer(0);
    8. private String frageText = new String("");
    9. private boolean antwort = false;
    10. public boolean isAntwort() {
    11. return antwort;
    12. }
    13. public void setAntwort(boolean antwort) {
    14. this.antwort = antwort;
    15. }
    16. public Integer getFrageID() {
    17. return frageID;
    18. }
    19. public void setFrageID(Integer frageID) {
    20. this.frageID = frageID;
    21. }
    22. public String getFrageText() {
    23. return frageText;
    24. }
    25. public void setFrageText(String frageText) {
    26. this.frageText = frageText;
    27. }
    28. }
    Alles anzeigen
  • Doch Später muss ich es wissen wie viele frgen es sind. Und wie die fragen Lauten.ich serialiesiere sie ja auch aber wenn ich dann deserialisiere habe ich drei objekte von typ frage wo derselbe frage text ist und dieselbe frageid. ich hätte aber gerne die fragen die ich in der JTextArea reingesteckt habe. Verstehst du es jetzt wenn nicht erkläre ich es dir mit einem beispiel bzw für was ich es brauche.
  • alex137 schrieb:

    wenn ich dann deserialisiere habe ich drei objekte von typ frage

    Das ist genau das Problem, du bekommst da eben nicht drei Objekte raus, sondern 3 Referenzen auf ein und dasselbe Objekt. Deswegen ändert sich auch die Frage und die Frage ID für alle Einträge in der ArrayList, da sie alle auf das gleiche Objekt verweisen (und zwar auf das, was du (hier im Quelltext) in Zeile 39 mit "private Frage frage = new Frage();" erstellt hast.
    Du musst jedesmal wenn du eine neue Frage in die Liste eintragen willst auch wirklich eine neue erzeugen und zwar mit "neu Frage()". Dieses neue Objekt kannst du dann in die Liste stecken und es wird die Id und die Frage "behalten" ;).
    Das Attribut "frage" brauchst du garnicht, es reicht wenn du das jedesmal mit ner lokalen Variable speicherst, da kann dann auch der Fehler gar nicht mehr passieren.

    Edit: Okay das war nicht 100% richtig, nach dem deserialisieren hast du wirklich mehrere Objekte in denen das gleiche drinsteht. Aber nur, weil du vorher beim serialisieren das gleiche Objekt mehrmals in den Stream geschrieben hast, da in der ArrayList nur ein Objekt viele male drinsteht ;)
    Hoffe das ist jetzt noch verständlich :D
  • Jaha moment. Du kannst doch die Liste serialisieren. Diese enthält die Frageobjekte.
    Ich glaube ein Beispiel wäre wirklich gut da ich nciht ganz verstehe warum du überall die gleichen Ausprägungen haben solltest.

    Wenn du eine Frage in die TextArea schreibst und diese ausliest, kloppst du den Inhalt doch in das Objekt vom Typ Frage. Das fügst du nun in die Liste ein. Das ganze dann drei mal, dann serialisierst du den Kram und deserialisiert ihn wieder. Nun hast du doch immernoch die Liste welche die "Frageobjekte" enthält und die wiederum den Text den du in deiner TextArea eingegeben hast. Oder versteh ich da was falsch? ;)
  • @Rondrer.
    meinst du so:
    private Frage frage1 = new Frage();
    private Frage frage2 = new Frage();

    dann die Frage Objekte füllen mit der id und den text.

    fragenListe.add(frage1);
    fragenListe.add(frage2);

    das habe ich schon verstanden aber mein Problem ist ja das, dass ich vorher garnicht weis wieviele Fragen es sein werden. D.h. ich müsste Variablen zur Laufzeit anlegen aber das geht in Java nicht. Weil die schon zur Compilierzeit vorhanden sein müssen. Wenn es sich nicht vermeiden läst da werde ich das ganze nicht mehr serialisieren sondern in die Datenbank schreiben.
    Frage Zur Datenbank ??? : was ist performanter in eine Datenbank schreiben oder Serialisieren ?

    @F0kus
    Sorry aber ich verstehe nicht warum du mich nicht verstehst :) ich finde ich habe mich klar ausgedrückt(hoffe ich) bzw. ich weiss nicht wie ich das problem sonst noch beschreiben soll. sorry

    @all
    wie gesagt wenn es nicht anders geht schreibe ich die fragen alle in die daten bank und schau so weiter aber ich dachte halt serialisieren ist performanter.

    Gruß Alex
  • prinzipiell schon so, aber du musst nicht alle variablen als Objektvariablen definieren...
    Ich weiß nicht wie ich das anders erklären soll, also schreib ich halt doch einfach die Lösung hin:

    Quellcode

    1. public class MybtnNextActionListener implements ActionListener {
    2. public void actionPerformed(ActionEvent arg0){
    3. if (arg0.getSource().equals(btnNext))
    4. {
    5. Frage frage = new Frage();
    6. frage.setFrageText(txtAreaFrage.getText());
    7. frage.setFrageID(getFragenCount());
    8. // hier adde ich die Object der array list hinzu
    9. addIntoFragenliste(frage);
    10. //-------------------------------------------------
    11. // und hier Test ich es
    12. for (int i=0; i<=fragenListe.size()-1;i++){
    13. txtAreaAusgabe.append("---> ID: "+fragenListe.get(i).getFrageID()+" :-->Text :"+fragenListe.get(i).getFrageText());
    14. }
    15. // ----------------------------------------------------
    16. setLabelText(getFragenCount());
    17. txtAreaFrage.setText("");
    18. txtAreaFrage.requestFocus();
    19. }
    20. }
    21. }
    Alles anzeigen

    Und die andere Definition von "frage" einfach weg.
  • alex137 schrieb:


    @F0kus
    Sorry aber ich verstehe nicht warum du mich nicht verstehst :) ich finde ich habe mich klar ausgedrückt(hoffe ich) bzw. ich weiss nicht wie ich das problem sonst noch beschreiben soll. sorry


    Kein Problem :D Hab auch nicht verstanden warum du meine Lösung nicht verstanden hast ^^ Aber nu ist es ja direkt codiert :)
    Schau dir mal besser die OOP Grundlagen noch mal an bevor du dich mit Serialisierung groß beschäftigst. Das Thema wird noch ein bisschen schwerer (nicht doll aber ein bisschen ;) ).
  • Hallo,

    @Ronderer.
    Danke werde ich mal ausprobieren. Bin mir nicht sicher aber ich glaube so habe ich das auch schon gemacht. Aber ich probier das mal aus.danke.
    Weist du vieleicht noch was performanter ist serialisierung oder in eine DB schreiben und wieder bei bedarf laden.
    @ F0kus.
    Danke auch an dich. OOP werde ich mir noch anschauen. kannste mir irgend ein buch empfehlen