dynamisch Objecte erzeugen

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

  • dynamisch Objecte erzeugen

    hallo!
    ich bin total am verzwifeln!
    ich habe ein JApplet mit verschiedenen Unterpanels.
    Im hauptapplet sind oben zwei Buttons mit + und -
    im Center ( beim applet handelt es sich um einen Borderlayout) habe ich ein unterpanel mit JLabel, JTextField und JComboBox. Wenn man jetzt auf + drückt, dann soll ein weiteres Panel im Center gebildet werden mit diesen drei Objecten. Grundidee ist es, alle drei Objecte im Object-Array [ ] [ ] [ ] zu speichern, für den Anfang habe ich es aber mit einem jlabel[ ] , einem JTextField [ ] und entsprechend einem JComboBox [ ] versucht. zugriff auf die Felder erfolgt mit Hilfe einer int variable, die am ende der methode dazu() (hier wird alles neu gebildet, sowohl ein panel, dem alle drei Objecte zugefügt werden und dann das Panel dem CenterPanel hinzugefügt wird.)
    jetzt meckert mir aber eclipse bei der feldzuweisung und erklärt das Array als nicht initialisiert. aber ich brauche das array, damit ich dann denn zustand der jeweiligen Objecte speichern kann und wieder auslesen kann.
    was übersehe ich?
    hier der code, falls der weiterhilft. mein letzter versuch war es, eine variable für jedes array einzufügen, was ich aber für sinnlos halte und eig den zugriff über feldname[var-1] machen will:

    Quellcode

    1. import javax.swing.*;
    2. import java.awt.*;
    3. import java.awt.event.*;
    4. import java.awt.BorderLayout;
    5. import java.awt.FlowLayout;
    6. @SuppressWarnings("serial")
    7. public class bla extends JApplet implements ActionListener{
    8. JPanel pnorth = new JPanel();
    9. JPanel pmitte = new JPanel();
    10. JButton plus, minus;
    11. JTextField [] text;
    12. JTextField textvar;
    13. JComboBox [] box;
    14. JComboBox boxvar;
    15. JLabel []la;
    16. JLabel lavar;
    17. int var=1;
    18. public void init(){
    19. setSize(400,500);
    20. plus = new JButton("+");
    21. minus = new JButton("-");
    22. plus.addActionListener(this);
    23. minus.addActionListener(this);
    24. BorderLayout hauptLayout = new BorderLayout();
    25. getContentPane().setLayout(hauptLayout);
    26. add(pnorth, BorderLayout.NORTH);
    27. add(pmitte, BorderLayout.CENTER);
    28. pnorth.setLayout(new GridLayout(0,2));
    29. pnorth.add(plus);
    30. pnorth.add(minus);
    31. pmitte.setLayout(new FlowLayout(10,10,10));
    32. pmitte.setAutoscrolls(true);
    33. dazu();
    34. }
    35. public void dazu(){
    36. JPanel p = new JPanel();
    37. textvar = new JTextField("");
    38. text[0]= textvar;
    39. boxvar = new JComboBox();
    40. boxvar.setModel(new DefaultComboBoxModel(new String[] { "Zahleneingabe", "Ja / Nein", "Freitext" }));
    41. box[0]= boxvar;
    42. lavar = new JLabel("Frage "+var);
    43. la [0]= lavar;
    44. GridLayout pL = new GridLayout(0,3);
    45. p.setLayout(pL);
    46. p.add(la[0]);
    47. p.add(text[0]);
    48. p.add(box[0]);
    49. pmitte.add(p);
    50. }
    51. public void actionPerformed(ActionEvent e) {
    52. if(e.getSource()== plus){
    53. var++;
    54. dazu();
    55. }
    56. if(e.getSource()== minus){
    57. // noch nichts gemacht
    58. }
    59. }
    60. }
    Alles anzeigen


    UPDATE: syntax tags by d0nut
  • Naja, es ist genau so, wie es der Compiler sagt: Du benutzt die Arrays ohne sie vorher zu initialisieren. In Java müssen Arrays bei der erzeugen mit einer gewissen Größe erzeugt werden und diese kann danach auch nicht mehr geändert werden. Wenn du also vorher nicht weißt, wie groß das Array werden soll, ist das dafür die falsche Datenstruktur. Du bräuchtest eine Datenstruktur mit dynamischer Größe, ich würde z.B. ArrayList<"Typ"> empfehlen.
    Abgesehen davon schreibst du die neuen Objekte immer an Stelle 0 des Arrays und überschreibst damit ein evtl schon vorhandenes Objekt.
  • es funktioniert!!! *freu* danke sehr!! klar, hab das irgendwie nicht daran gedacht......aber wenn ich die array-länge vorher bestimmten würde, müsste es ja auch theoretisch mit den normalen arrays gehen,oder?
    achso, dass mit feldname(0) habe ich vergessen zu verbessern, dass war, damit es überhaupt erstmal funktioniert

    eine frage habe ich noch, bei der methode, wenn ich die fragen löschen will, dann zählt er lediglich den variablenwert runter, aber es werden keine labels entfernt.
    meine Überlegung ist (was ich auch sogleich ausprobieren werde) für die unterpanels ebenfalls eine arrayList anzulegen und dann einfach das letzte panel zu löschen.
    die variable wird im methodenaufruf des actionlisteners runtergezählt, deswegen auch (var+1)

    meine bisherige methode:

    Quellcode

    1. public void loeschen(){
    2. text.remove(var+1); // var ist fragen-zähler
    3. box.remove(var+1);
    4. la.remove(var+1);
    5. validate();
    6. }


    UPDATE: syntax by d0nut
  • pumpkin schrieb:

    aber wenn ich die array-länge vorher bestimmten würde, müsste es ja auch theoretisch mit den normalen arrays gehen,oder?
    Ja das würde natürlich funktionieren.

    meine Überlegung ist (was ich auch sogleich ausprobieren werde) für die unterpanels ebenfalls eine arrayList anzulegen und dann einfach das letzte panel zu löschen.
    Das wär jetzt auch mein Tipp gewesen. Aber wenn du das Panel in der ArrayListe löschst bringt das noch nicht allzuviel, du musst das Panel aus dem übergeordneten Panel entfernen:
    pmitte.remove(p);
    (wenn p das zu entfernede Panel aus der Liste ist)