Problem mit ActionListener

bvdcomp

Aktives Mitglied
Hallo zusammen

ich verzweifle fast, ich habe folgenden Code der nicht stimmt:

Java:
class Student implements ActionListener{
    private int stNr; 
    private String name;
    private int alter;
    private double note;
    
    Student[] studis = {     
            new Student(1, "Walterli Tell junjun.", 12, 4.3),
            new Student(2, "Greengrey vonRotz", 20, 3.7),
            .....
            .....
      };
    
    
    public Student(int stNr, String name, int alter, double note) {
        this.stNr = stNr;  
        this.name = name;
        this.alter = alter;
        this.note = note;
  
		fensterErzeugen();	
	}

   public static void main(String[] args) {
	   fensterErzeugen();
	   List<Comparator> comp = new ArrayList<Comparator>();
	      comp.add(new NummerSortieren());
	      comp.add(new NameSortieren());
	      comp.add(new AlterSortieren());
	      comp.add(new NoteSortieren());	      
   }
   

   public static void fensterErzeugen()
   {
	 //Create and set up the window.
	   JFrame fenster = new JFrame("Hausaufgabe 3 - GUI");
	   final JTextArea jta;
	      
	   JPanel jpanel_0 = new JPanel(new BorderLayout());      
	   JPanel jpanel_1 = new JPanel(new GridLayout(0,1));
	   
	   jpanel_1.add(new JButton("Anfangszudtand").addActionListener(new ActionListener(){
           @Override
           public void actionPerformed(ActionEvent event) {
        	   [B]event = studis;[/B]                       
           }
       }));

Ich möchte dohc, wenn jemand auf diesen Button klickt, das der Anfangszustand hergestellt wird.
Wieso geht das nicht?

Kann mir jemand helfen????:shock::shock:
 

Ach da, okay darauf hatte ich nicht geachtet, wegen "implements ActionListener" <--
Du solltest dir mal durchlesen wie man das mit den Listenern genau macht, weil du solltest dich für eine Methode entscheiden *g*

Gut, zu deiner actionPerformed: du weist deiner lokalen Variable event, die übrigens vom Typ ActionEvent ist, dein Student-Array zu ?! Geht a) gar nicht und b) machts auch kein Sinn :>

Und was genau meinst du jetzt mit Anfangszustand? Hol doch bei deiner Beschreibung mal ein wenig aus...:autsch:
 
Ja, ich weis es ist ein wenig schlecht beschrieben :noe:

Es soll folgendes tun:

Ein kleines GUI-Programm mit einigen Buttons welches nach verschiedenen Möglichkeiten sortieren kann.

Ich schaffe es allerdings nicht. Ich habe auch folgendes versucht:


Java:
jpanel_1.add(new JButton("Anfangszudtand").addActionListener(new ActionListener(){
           @Override
           public void actionPerformed(ActionEvent event) {
        	   erzeugeStudent ();                       
           }
       }));

Java:
public static void erzeugeStudent ()
	{
		Student[] studis = {     
            new Student(1, "Walterli Tell junjun.", 12, 4.3),
            new Student(2, "Greengrey vonRotz", 20, 3.7),
            new Student(3, "Fritzli Schneider", 9, 5.9),
            new Student(4, "Archimedes Syrakus", 2296, 6.0),
            new Student(5, "Maria Stuart", 467, 2.9)
      };
    }

Aber das funkt auch nicht.:rtfm::rtfm:
 
weil du da ein neues Array deklarierst was auch nur in dieser Methode gültig ist. Das ist nicht das Array welches du oben bereits deklariert hast. Lasse das [c]Student[][/c] mal weg und :rtfm: 🙂
 
Also du meinst das Array im Konstruktor erstellen und es dann aufrufen??

mit -> new Student;???

Nein, ich meine das was ich schrieb 😀

Java:
	public static void fensterErzeugen() {
		 studis = { new Student(1, "Walterli Tell junjun.", 12, 4.3),
				new Student(2, "Greengrey vonRotz", 20, 3.7),
				new Student(3, "Fritzli Schneider", 9, 5.9),
				new Student(4, "Archimedes Syrakus", 2296, 6.0),
				new Student(5, "Maria Stuart", 467, 2.9) };

	}

wobei du dann immer noch lesen solltest, denn das wird auch nicht funktionieren. Im FAQ steht dazu auch etwas (static / non-static)
 
Ich hab es nun etwas refactioring gemacht und habe folgendes versucht:

Java:
sortieren.addActionListener(new ActionListener() {
                               public void actionPerformed(ActionEvent e) { 
                                textArea.setText(Student.anfangsZustand());
                               }
                           });
        werkzeugleiste.add(sortieren);

In der Klasse Student habe ich eine Methode anfangsZustand() erstellt, welche die Array-Werte hält.

Allerdings ist mir nicht granz klar wie ich als return mitgebe, der Aufruf
Java:
textArea.setText(Student.anfangsZustand());
keinen void zulässt.

Hat jemand eine Idee??
 
wäre es dir denn liebern, wenn 'void zugelassen wäre'?
wieso schreibst du das überhaupt zusammen, schreibe doch zwei Zeilen

> Student.anfangsZustand()
> textArea.setText();
wobei du bei setText() immer noch einen String übergeben musst, "Hallo", "-", oder ganzen Befehl weglassen,
dann kannst du auch gleich den ersten weglassen, welchen Zweck verfolgst du?

also: entweder alle Befehle NICHT hinschreiben, oder du möchtest etwas, z.B. einen Text ausgeben,
dann sollte 'void nicht zugelassen' nicht dein Problem sein, denn du willst ja gerade einen String übergeben,
dann musst du die Methode eben noch so umbauen, dass ein String zurückkommt
 
Meine Methode ist folgende:

Java:
public static String anfangsZustand()
    {
        Student[] studis = {     
            new Student(1, "Walterli Tell junjun.", 12, 4.3),
            new Student(2, "Greengrey vonRotz", 20, 3.7),
            new Student(3, "Fritzli Schneider", 9, 5.9),
            new Student(4, "Archimedes Syrakus", 2296, 6.0),
            new Student(5, "Maria Stuart", 467, 2.9)
        };
    
        int i = 0;
        while(i < studis.length)
        {
            System.out.println(studis[i]);
            i++;
        }
        return null;
    }

Ich möchte diese Methode im TextArra auf meiner GUI ausgeben lassen.
Das Problem ist das ich nicht ganz klarkomme wie ich es anstellen soll.???:L
 
Zeile 14 nicht System.out.println, sondern diesen Text zu einem vor der Schleife definierten String hinzufügen,
diesen String am Ende zurückgeben
 
Zeile 14 nicht System.out.println, sondern diesen Text zu einem vor der Schleife definierten String hinzufügen,
diesen String am Ende zurückgeben

Also du meinst sowas?
Java:
String  zustand;
        int i = 0;
        while(i < studis.length)
        {
            zustand= studis[i];
            i++;
            return zustand;
        }

aber ich gluab ich hab da was falsch gemacht
 
das return am Ende hinter der Schleife, sonst wird die Schleife ja sofort beendet, dann bräuchtest du gar nicht erst eine Schleife

wenn du alle Infos haben willst musst du die Strings mit += zusammenfügen,
bei der Gelegenheit vielleicht noch Leerzeichen, Komma und/oder Zeilenumbruch (\n) einfügen

die Variable anfangs mit "" initialisieren

die Ausgabe kann kryptisch sein, wenn nicht die toString()-Methode der Klasse überschrieben ist,
vielleicht lieber erstmal nur
zustand += studis.getName()
oder ähnliches
 
OK, bislang funkt es nicht ganz so wie es soltle.

ich habe foglendes gemacht:
Java:
String  zustand = null;    
        int i = 0;
        while(i < studis.length)
        {
            zustand += studis[i].getAbstan();
            
            i++;
        }
        return zustand;
    }
    
    public String getAbstand()
    {
        String abstand = "\n";
        return abstand;
        
    }

Es kompiliert, aber ich erhalte null als Ausgabe.:rtfm:
 
wie gesagt, die Variable mit "" inialisieren, sonst kommt "null" in die Ausgabe, wobei ich eher an eine Exception dachte,
du hast aber nicht nur "null" drin, sondern wahrscheinlich auch mehrere Zeilenumbrüche, die nur nicht zu sehen sind,

jetzt die Ausgabe verfeinern, dann wird das schon
 
Irgendwie hänge ich nun. Ich komm nicht mehr weiter...

Logisch wäre für mich wenn ich in der While-Schleife den Aufruf so mache
Java:
zustand += studis[i].getAbstand();
getAbstand() -> \n" noch hinten reigehängt wird

Also eben, Wert von diesem Array + Zeilenumbruch

Was mache ich da falsch?
 
zustand += studis;
zustand += studis.getAbstand();


oder
zustand += studis + studis.getAbstand();
 
Ohhhhhhhhhhhhhh man was ein + alles ausmachen kann.

Ich danke dir SltaerB viel mals.

Das eine Problem ist nun gelöst.

Nun werde ich am zweiten arbeiten.... und werde bestimmt hilfe brauchen.
 
mir mal jemand einen Hinweis geben wieso mein Scroll nicht funkt:

Java:
    protected static JTextArea textArea;
             .....
        textArea = new JTextArea("Hier kommt die Ausgabe",10,20);
        textArea.setBorder(new EtchedBorder());
        textArea.setLineWrap(true);
        textArea.setEditable(false);

        JScrollPane scroller = new JScrollPane(textArea);
        scroller.setPreferredSize(new Dimension(450, 110));
        scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
               
        contentPane.add(textArea);

Ich sehe hier keinen Fehler;(
 
Hat jemand von euch eine Idee wie ich folgendes machen kann:

Wie kann ich diese Objekte;
Java:
Student[] studis = {     
   new Student(1, "Walterli Tell junjun.", 12, 4.3),
   new Student(2, "Greengrey vonRotz", 20, 3.7),
   new Student(3, "Fritzli Schneider", 9, 5.9),
   new Student(4, "Archimedes Syrakus", 2296, 6.0),
   new Student(5, "Maria Stuart", 467, 2.9)
  };

einem String übergeben:

Java:
for (Student alle : studis) {    
    sortierterWert += studis/*[????]*/+ studis[i].getAbstand();
   }
 
wie zuvor, es hat sich noch nichts geändert:

zustand += studis + studis.getAbstand();

oder jetzt eben

sortierterWert += studis+ studis.getAbstand();

wenn studis nur kryptische Zahlen liefert, dann liegt das nach wie vor daran, dass keine toString()-Methode implementiert ist,

nach wie vor ist mein Vorschlag
sortierterWert += studis.getName()
oder so,
ein Zeilenumbruch \n kannst du auch hier direkt schreiben, das muss keine komplizierte Methode in Student sein:
sortierterWert += studis.getName() + "\n";

das Scroll-Problem noch aktuell? kann ich aber erst später testen
 
ICh habe es nun so gemacht und es funktion:
Java:
  int t = 0;A
   for (Student alle : studis) {    
    sortierterWert += studis[t].toString()+ studis[t].getAbstand();
    t++;
   }
...
 }
 
ach das meinst du, das geht natürlich so:

Java:
 for (Student einer : studis) {    
    sortierterWert += einer.toString()+ einer.getAbstand();
   }
 
Ja es, funkt nun. Aber das Problem mit den Scroll ist immer noch ....

ich sehe keinen Fehler

Java:
TitledBorder border = new TitledBorder("Positionieren");
        schieberegler.setBorder(new CompoundBorder(new EmptyBorder(1, 5, 5, 5), border));
        schieberegler.setMajorTickSpacing(5);
        contentPane.add(schieberegler, BorderLayout.SOUTH);
        
        textArea = new JTextArea("Hier kommt die Ausgabe",10,20);
        textArea.setBorder(new EtchedBorder());
        textArea.setLineWrap(true);
        textArea.setEditable(false);
        
        JScrollPane scroller = new JScrollPane(textArea);
        scroller.setPreferredSize(new Dimension(450, 110));
        scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
               
        contentPane.add(textArea);
 
das funkt nun alles so wie es soll. Danke danke danke

Nun noch die letzte aufgabe

Ich möchte die ganze Ausgabe der Sortierung, step by step ausgeben lassen.

Ich habe dafür folgendes gemacht:

Java:
final JSlider schieberegler =new JSlider(JSlider.VERTICAL, 0, 100, 0);
        schieberegler.setPaintTicks(true);
        schieberegler.setMajorTickSpacing(25);
        schieberegler.setMinorTickSpacing(5);
        schieberegler.setPaintLabels(true);
        werkzeugleiste.add(schieberegler);
        ......   
        ......
        ......
        stepbystep = new JButton("Sortieren step by step");
        stepbystep.addActionListener(new ActionListener() {
                               public void actionPerformed(ActionEvent e) { 
                            	   textArea.setText(Student.sortStepbyStep());}
                           });
        werkzeugleiste.add(stepbystep);          
            // Abstände: Werkzeugleiste in ein Extra-Panel mit Flow-Layout legen
        JPanel flow = new JPanel();
        flow.add(werkzeugleiste);
        contentPane.add(flow, BorderLayout.WEST);
        
        
        schieberegler.addChangeListener(new ChangeListener(){
            public void stateChanged(ChangeEvent e){
            	textArea.setText(Student.startSortieren()./*???*/);
            }
         });

Da hab ich leider keihe Ahnung wie ich es anstellen soll:bahnhof:
 

Neue Themen


Zurück
Oben