JButton und Aktion...


Eben. Zumal OOP nicht ganz so trivial ist wie wirs vorgesetzt bekommen.
Unbequeme Aspekte wie zum Beispiel die Probleme die durch Nichteinhalten des Liskov’schen Substitutionsprinzips entstehen können wurden ja bisher nichtmal erwähnt. Hoffentlich wird das noch einigermaßen gründlich behandelt, sonst müsste man sich wirklich erstmal in Sekundärliteratur vergraben um sich über die fundamentalen Eigenschaften von OOP zu informieren. Nagut ist vllt ein bisschen übertrieben, aber die meisten OOP Bücher mit höherem Anspruch sind recht nervig zu lesen. (vgl. auch “höhere” Literatur zu Java.)
Und überhaupt: wo bleiben DesignPatterns? Da wird einfach mal so ins Blaue ein Delegation-Based Event Model motiviert bzw gröblichst umrissen um bunte GUIs zu bauen.
Also wie man vllt rauslesen kann fände ich fundierte Grundlagen mal um einiges wichtiger.
Mal im Ernst: wie soll man denn so was ordentliches in Java schreiben?


???
Bahnhof
???


Genau, von Reflection hätte man uns natürlich auch mal was erzählen können.
Und Threads wären vllt auch mal nicht schlecht.


@andy: ich versteh von dem, was du angemerkt hast nicht soo viel, aber ich meine sagen zu können, dass AlgoI und II nur einen kurzen Einstieg in die Programmierung bieten sollen, der einen groben Überblick über Möglichkeiten usw. vermittelt.
Denjenigen, die bereits am Gedanken Algo Hausaufgaben machen zu müssen ein Störgefühl im Magen bekommen und nichts von allem, was in Vorlesung und Übung besprochen wird verstehen können/wollen, wird damit gezeigt, dass sie das falsche Studienfach gewählt haben.
Denjenigen, denen die Tiefe des vermittelten Stoffes nicht ausreicht sollten sich hingegen noch etwas in höhere Semester gedulden, dann wird bestimmt der Wissensdurst gestillt werden und “Probleme” wie

besprochen werden!
Bye,
Julian


Das klingt ja fast so als wären das “fortgeschrittene” Themen. In jedem besseren Javabuch wird auf Reflection, DesignPatterns, Threads und das EventModel eingegangen…
Und Liskov gehört eigentlich direkt ins Kapitel Vererbung, wobei ich zugeben muss das das in den wenigstens Büchern so explizit aufgezeigt wird, aber wenigstens die Idee dahinter sollte doch vermittelt werden.


Wow… Das erste Mal, dass ich in diesem Forum so richtig gelacht hab… :smiley:

Gut, wenn man dann einmal die Liskov-Geschichte nachschaut, schaut’s wirklich danach aus, als ob man es – auch in Algo Eins – zumindest mal ansprechen sollte, wenn man schon unbedingt die ganze Objektorientierung von Grund auf machen muss (wovon ich eigentlich nicht besonders viel halte; und vielleicht liegt es ja an dieser etwas merkwürdigen Strukturierung der Vorlesung, dass einige Leute diese Störgefühle im Magen bekommen…)

http://www.jeckle.de/vorlesung/sei/kII.html

Das Liskov’sche Substitutionsprinzip (Abk. LSP)

Zwar bietet Java, wie auch andere verfügbare objektorientierte Programmiersprachen, die Möglichkeit der Vererbung, jedoch ist seitens der Programmiersprache keine weitergehende Einschränkung zu deren Einsatz definiert. Konkret bedeutet dies: auch die unsaubere Vererbung mit dem Ziel der – bequemen – Schreibaufwandsreduktion ist technisch möglich.
Gewünscht ist jedoch eine griffige Formulierung zur (richtigen) Bildung von Subtypen; diese liefert das von Barbara Liskov 1988[2] postulierte Substitutionsprinzip:

Definition (nach Liskov): Wenn für jedes Objekt o1 eines Typs S ein Objekt o2 eines Typs T existiert, so dass für alle Programme P das Verhalten von P nach Substitution von o1 durch o2 unverändert ist, dann ist S ein Untertyp von T.

Alternativ (und einfacher): Dann (und nur dann) ist eine Klasse eine (sinnvolle) Subklasse einer anderen, wenn an jeder Stelle im Programm, an der eine Ausprägung der Superklasse erwartet wird, ein Objekt der Subklasse stehen kann


Exakt. Eine mögliche Lösung des Problems ist entweder eine Einschränkung der Sprache:
-keine virtuellen Methoden oder virtuelle Vererbung
-keine sichtbaren Attribute oder Methoden in öffentlichen Datenstrukturen
-keine Verändung von öffentlichen Datenstrukturen
o restriktiv: keine Zuweisungen oder Veränderungen und dergleichen
o weniger restriktiv: keine Funktion darf direkt oder indirekt die Daten die sie als Argumente erhält verändern

oder durch Konventionen bzw Spezifikation der Vor und Nachbedingungen (die auch in der Sprache verankert sein können. Smalltalk kann das iirc). Hier ist für Java vor allem der Design by Contract Ansatz interessant. http://en.wikipedia.org/wiki/Design_by_contract
Wird afaik sogar noch in der Vorlesung im Zuge eines Verifikations-Kalküls erwähnt.


Was habt ihr denn so als das “Problem” geschrieben?

Ich haette gesagt, das Problem is, dass man die Grammatik nich direkt ueberfuehren kann, also Schritt fuer Schritt sondern die einzelnen Abbildungen miteinander verknuepfen muss. Also isExeption mit isTerm und mit isFactor…?


Ich habe geschrieben, dass man die Produktionen umdrehen musste.
Also z.B. anstatt
E → E | E *T
dieses hier
E → E | T * E
.
Warum? Weil wir mit dem proceed() nur von rechts nach links durchwandern können. Die Grammatik wie oben beschrieben würde aber von rechts nach links aufgebaut.


ich hab noch ne kurze frage, wie heisst die JList Aktion, damit man nur ein Feld auswählen kann. Wenn ich Strg bzw. Shift drücke sind mehrfach auswahlen möglich, das möchte ich unterbinden. danke im vorraus.

Ich will mal nicht so sein

liste = new JList(data);
liste.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

Danke das geing ja super fix :wink:



java LetsSwing

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
at LetsSwing$3.valueChanged(LetsSwing.java:62)
at javax.swing.JList.fireSelectionValueChanged(Unknown Source)
at javax.swing.JList$ListSelectionHandler.valueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.setValueIsAdjusting(Unknown Sou
rce)
at javax.swing.JList.setValueIsAdjusting(Unknown Source)
at javax.swing.plaf.basic.BasicListUI$Handler.mouseReleased(Unknown Sour
ce)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Soweit alles geil, kann nun auch nur noch eines auswählen, bei Strg bekomm ich in der Console folgende Scheisse. Programm läuft dennoch problemlos weiter. Sollte ich da was dagegen unternehmen :slight_smile: ?


Nach dem bisherigen Vorlesungsinhalt kannst du noch garnix unternehmen, da Exceptions noch nicht behandelt wurden :wink:
Und so lange das Programm weiterlaeuft wuerd ich fuer die Aufgabe da jetzt nix mehr gross dran machen. Wenns dich natuerlich interessiert waer das eine gute Gelegenheit sich schonmal ein bissl mit der Fehlerbehandlung und Exceptions zu befassen (Stichwort try{} catch{}).


Wir koennen mit parseString[currentChar] und currentChar++ von links nach rechts durchgehen (bin sicher du hast das richtige gemeint).

Ansonsten hab ich sowas auch geschrieben, war erst noch am ueberlegen ob sie was ueber den “Sentinel” hoeren wollen, aber da gibts ja eigentlich net wirklich was zu sagen…

cya
Nic


@schniggie_iuk2k5: Naja, nicht schockieren lassen von solchen Meldungen, einfach immer an den Anfang schauen, da steht, wo dir Ursache zu suchen ist!
Anfang ist bei dir:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
at LetsSwing$3.valueChanged(LetsSwing.java:62)

Topp die Wette gilt, in Zeile 62 machst du einen “getSelectedIndex()” Aufruf :wink: Und eigentlich sagt dir die Meldung “java.lang.ArrayIndexOutOfBoundsException: -1” alles, was du wissen musst, um drauf zu kommen, was los ist:
Wenn du per Strg alle Elemente deiner Liste deselektierst (oder wie auch immer man da sagt :wink: ), dann bekommst du von “getSelectedIndex()” den Wert -1. Und wenn du damit jetzt dein Array ansprichst, dann kannst dir ja denken, was passiert…?
Also von wegen Exceptions oder so, das kannst du auch ganz einfach selber per Hand umgehen, wenn du weißt, was du beachten musst.


tach zusammen,
kann mir mal jemand sagen was hier nicht passt ,er spuckt mir immer die Fehlermeldung "cannot resolve symbol…
symbol: class ListSelectionListener

colorList.addListSelectionListener( new ListSelectionListener() { "
^

aus…

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class LetsSwing {
	public static void main (String[] args) {
		final String [] possibleColors = {"black" , "blue","cyan","green","magenta","orange","Red","white","yellow" } ;
		final Color [] actualColor = {Color.black , Color.blue,Color.cyan,Color.green,Color.magenta,Color.orange,Color.red,Color.white,Color.yellow} ;		


		JFrame w = new JFrame ("You don't mean a thing...if you ain't got that swing");
		w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		w.setSize(300,300);
		w.setVisible(true);
		
		
		JPanel panel =new JPanel(new BorderLayout());
		w.getContentPane().add(panel);
		
		final JButton button = new JButton("reset");
		button.setSize(100,25);
		panel.add(button, BorderLayout.SOUTH);

		
		final JList colorList=new JList(possibleColors);
		panel.add(colorList,BorderLayout.NORTH);		

		

		button.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent pushdabutton){
				button.setForeground(actualColor[0]);
				colorList.setSelectedIndex(0);
			}
		});
		

		colorList.addListSelectionListener( new ListSelectionListener() {
			public void valueChanged ( ListSelectionEvent choosecolor ){
			button.setForeground(actualColor[colorList.getSelectedIndex()]);
			}
		

		});
		
				
			
		
	}
	
	
}

Wäre dankbar für hilfe…ich hab grad echt keinen peil mehr…


Das ist einfach.
Er kennt den ListSelectionEvent nicht.
Den musst du extra einbinden.

Tipp für Eclipsenutzer:
Einfach munter drauf los schreiben. Und dann zaubern: “Source”->“Organize Imports” (Shift+Ctrl+O)

Oder so:

import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

Wozu brauch ich das ListSelectionModel?
Hierfür

liste = new JList(data);
liste.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);1

Eigentlich trivial,einer der typischen Fehler wenn man überarbeitet ist…g

Auf jeden Fall 1000 Dank…4 Thumbs up
:slight_smile:


Gern geschehen…