Grafische Klasse: Zugriff von Listener auf Hauptklasse

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

  • Grafische Klasse: Zugriff von Listener auf Hauptklasse

    Hey, ich hab ein Problem und zwar möchte ich die Listener methode die einzelnen methoden wie eingabe() zuordnen, dass wenn man eingabe drückt die Methode ausgeführt wird meine Idee war es halt einfach die Methode in einer dieser Unterklassen zu packen damit der Listener sie dann halt ausführt... Poblem : Die Unterklasse kennt die Methode zb Eingabe nicht... was kann ich tun Mein Programm :

    IHR MÜSST JETZT NICHT ALLES DURCHLESEN DER WICHTIGE TEIL SIND DIE UNTERKLASSEN (ZEILE 57) UND DIE METHODEN EINGABE(ZEILE 112) UND SUCHEN(ZEILE 144) UND AUSGABE(ZEILE 137), DIE ICH I DIE UNTERKLASSEN EINFÜGEN WILL DAMIT SIE PER KNOPFDRÜCK AUSFÜHRBAR WERDEN.

    Quellcode

    1. import java.util.*;
    2. import java.awt.*;
    3. import java.awt.event.*;
    4. class Datensatz {
    5. private String name;
    6. private int id;
    7. private int note1, note2, note3;
    8. private static int nextUniqueID = 1;
    9. Datensatz(String theName) {
    10. name = theName;
    11. id = nextUniqueID;
    12. nextUniqueID++;
    13. }
    14. Datensatz() {
    15. id = nextUniqueID;
    16. nextUniqueID++;
    17. }
    18. public void setName(String lname) {
    19. name = lname;
    20. }
    21. public boolean setNote1(int n) {
    22. if (n > 0 && n <= 6) {
    23. note1 = n;
    24. return true;
    25. }
    26. else return false;
    27. }
    28. public boolean setNote2(int n) {
    29. if (n > 0 && n <= 6) {
    30. note2 = n;
    31. return true;
    32. }
    33. else return false;
    34. }
    35. public boolean setNote3(int n) {
    36. if (n > 0 && n <= 6) {
    37. note3 = n;
    38. return true;
    39. }
    40. else return false;
    41. }
    42. public String getName() {
    43. return name;
    44. }
    45. public int getID() {
    46. return id;
    47. }
    48. public String toString() {
    49. String s = new String("name: " + name + "\nid: " +id);
    50. return s;
    51. }
    52. }
    53. public class Start extends Frame {
    54. static Random rnum = new Random();
    55. private Button b1,b2,b3,b4;
    56. ArrayList sdata = new ArrayList();
    57. class Bal1 implements ActionListener {
    58. public void actionPerformed(ActionEvent e) {
    59. Start k = new Start();
    60. Out.println("Eingaberoutine"+k.eingabe() );
    61. }
    62. }
    63. class Bal2 implements ActionListener {
    64. public void actionPerformed(ActionEvent e) {
    65. ausgabe(sdata);
    66. }
    67. }
    68. class Bal3 implements ActionListener {
    69. public void actionPerformed(ActionEvent e) {
    70. Out.println("Suchroutine");
    71. }
    72. }
    73. class Bal4 implements ActionListener {
    74. public void actionPerformed(ActionEvent e) {
    75. System.exit(0);
    76. }
    77. }
    78. Start() {
    79. super ("Schulerdatenverwaltung");
    80. this.addWindowListener(new WindowAdapter() {
    81. public void windowClosing(WindowEvent e) {
    82. System.exit(0);
    83. }
    84. });
    85. TextField tf1;
    86. b1 = new Button("Eingabe");
    87. b1.addActionListener(new Bal1());
    88. b2 = new Button("Ausgabe");
    89. b2.addActionListener(new Bal2());
    90. b3 = new Button("Suchen");
    91. b3.addActionListener(new Bal3());
    92. b4 = new Button("Ende");
    93. b4.addActionListener(new Bal4());
    94. tf1 = new TextField("Sie Können nun etwas ''Eingeben'' es anschließen ''Ausgeben'' oder ''Suchen'', mit ''Ende wird das Programm beendet.", 30);
    95. this.setLayout(new BorderLayout());
    96. add(b1,BorderLayout.CENTER);
    97. add(b2,BorderLayout.SOUTH);
    98. add(b3,BorderLayout.EAST);
    99. add(b4,BorderLayout.WEST);
    100. add(tf1,BorderLayout.NORTH);
    101. }
    102. static void eingabe (ArrayList lsdata) {
    103. int n;
    104. boolean flag;
    105. String s;
    106. Datensatz ds = new Datensatz();;
    107. Out.println("Name: ");
    108. s = In.readWord();
    109. ds.setName(s);
    110. Out.println("Note1: ");
    111. n = In.readInt();
    112. while (!(flag = ds.setNote1(n))){
    113. if (!flag) Out.println("Bitte geben Sie eine Note zwischen 1 und 6 ein!");
    114. n = In.readInt();
    115. }
    116. Out.println("Note2: ");
    117. n = In.readInt();
    118. ds.setNote2(n);
    119. Out.println("Note3: ");
    120. n = In.readInt();
    121. ds.setNote3(n);
    122. lsdata.add(ds);
    123. }
    124. private static void ausgabe(ArrayList localdata) {
    125. for (int i = 0; i< localdata.size(); i++)
    126. System.out.println(localdata.get(i));
    127. System.out.println("________________________");
    128. }
    129. private static int suchen(ArrayList localdata) {
    130. Datensatz data;
    131. String name, s;
    132. int k;
    133. Out.print("Welchen Name suchen Sie? Eingabe: ");
    134. s = In.readWord();
    135. for (int i = 0; i< localdata.size(); i++) {
    136. data = (Datensatz) localdata.get(i);
    137. name = data.getName();
    138. k = name.compareTo(s);
    139. if (k == 0) return i;
    140. }
    141. return -1;
    142. }
    143. public static void main(String[] args) {
    144. Start st;
    145. st = new Start();
    146. st.setSize(700,600);
    147. st.setVisible(true);
    148. }
    149. }
    Alles anzeigen


    Vielen Dank, wers vis jetzt Durchgelesen hat ...

    euer ltheonel

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von ltheonel ()

  • Die ganzen statics (außer vor der main) sind übrigens falsch - die solltest du entfernen.

    Warum erzeugst du eine neue Instanz von Start? Du kannst direkt auf die Methode zugreifen. Bei ausgabe() hast du es richtig gemacht. Das einzige was fehlt ist der Parameter.

    Quellcode

    1. class Bal1 implements ActionListener {
    2. public void actionPerformed(ActionEvent e) {
    3. eingabe(lsdata);
    4. }
    5. }
  • also bei mir geht es nur mit (sdata) als parameter...
    ls findet er nicht... aber as problem ist ausserdem folgendes sobald ich den code eingefügt hab und die korrekturen vorgenommen hab kan ich nach dem betärtigen von eingabe zwr das terminal sehn das erscheint und nach den ersten namen fragt aber ich kann nichts einfügen ... und das macht da ganze programm ja überflüssig...


    danke donut

    ltheonel
  • Wenn du der Klasse, die den Listener implementiert, einen Konstruktor gibst, dann kannst du diser auch Referenzen übergeben:
    Zum Beispiel:

    Quellcode

    1. class Bal1 implements ActionListener {
    2. private Start startClass;
    3. public Bal1 (Start startClass) {
    4. this.startClass = startClass;
    5. }
    6. public void actionPerformed(ActionEvent e) {
    7. startClass.eingabe(lsdata);
    8. }
    9. }
    Alles anzeigen


    Grundsätzlich ist das Programm aber ein ziemliches Gewürg.
  • Was mir noch aufgefallen ist:
    Wenn du Variablen/Methoden in einer Klasse ohne Sichtbarkeit (private/public/protected) angibst, dann sind sie automatisch private. Es ist üblich, die Sichtbarkeiten immer anzugeben. Du machst es mal so, mal so.
    Ich stelle grade fest, dass die Methoden eingabe und ausgabe statisch sind. Dadurch kannst du sie von überall direkt mit Start.eingabe(...) bzw. Start.ausgabe() aufrufen. Dadurch brauchst du keine Referenz wie in meinem vorherigen Post vorgeschlagen.
  • Also das kann garnicht funktionieren:

    Quellcode

    1. Out.println("Eingaberoutine"+k.eingabe() );

    1. Statische Methoden ruft man nicht auf einem Objekt sondern auf der Klasse auf. Verwende statt k.eingabe(...) besser Start.eingabe(...).
    2. Die Methode eingabe gibt nichts
    (void) zurück!!! Dadurch kann ein + nicht funktionieren.
    3. Die Methode eingabe verlangt einen Übergabeparameter und zwar vom Typ ArrayList! Dieser wird von dir nicht übergeben. Ich habe oben ... gemacht, wo du eine ArrayList übergeben musst.