Verständnissproblem bei verschiedenen GUI's

Status
Nicht offen für weitere Antworten.

anfänger15

Bekanntes Mitglied
Hallo,

aufgrund von diesem Thread versuche ich gerade meine GUI mit Action-Objekten aufzubauen.

hier eine Klasse davon:

Code:
package de.lukas.gui.action;

import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JSlider;
import javax.swing.KeyStroke;

import de.lukas.gui.DragDrop_JTable;
import de.lukas.gui.VideoPanel;
import de.lukas.gui.WiedergabelistenBox;
import de.lukas.gui.Zeitanzeige;
import de.lukas.media.AbstractMediaPlayer;
import de.lukas.media.PlaySongs;
import de.lukas.media.RandomSongs;
import de.lukas.media.RepeatSongs;

public class APlayB extends AbstractAction{
	
	private AbstractMediaPlayer songlist;
	
	private JButton random;
	private JButton wiederholen;
	private JButton volumeOffB;
	private DragDrop_JTable tabelle;
	private WiedergabelistenBox wiedergabelistenBox;
	private Zeitanzeige zeitanzeige;
	private JButton stopB;
	private VideoPanel video;
	private JSlider songTimeAnzeige;
	
	
	public APlayB(AbstractMediaPlayer songlist,JButton random,JButton wiederholen,JButton volumeOffB,
			JButton stopB, DragDrop_JTable tabelle, WiedergabelistenBox wiedergabelistenBox,Zeitanzeige zeitanzeige,
			VideoPanel video,JSlider songTimeAnzeige){
		super();
		this.songlist = songlist;
		this.random = random;
		this.wiederholen = wiederholen;
		this.volumeOffB = volumeOffB;
		this.tabelle = tabelle;
		this.wiedergabelistenBox = wiedergabelistenBox;
		this.zeitanzeige = zeitanzeige;
		this.stopB = stopB;
		this.video= video;
		this.songTimeAnzeige = songTimeAnzeige;
		
        putValue(SHORT_DESCRIPTION, "Play");
        putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_SPACE,
				InputEvent.CTRL_MASK));
		putValue(SMALL_ICON,new ImageIcon(getClass()
				.getResource("/resource/icons/Play24.gif")));
	}
	
	public void actionPerformed(ActionEvent e){
		boolean ok = true;
		random.setEnabled(false);
		wiederholen.setEnabled(false);

		if (((ImageIcon) getValue(SMALL_ICON)).toString().equals(
				(new ImageIcon(getClass().getResource(
						"/resource/icons/Play24.gif"))).toString())
				&& (ok)) {
			putValue(SMALL_ICON,new ImageIcon(getClass().getResource(
					"/resource/icons/Pause24.gif")));
			ok = false;
			volumeOffB.setEnabled(true);
		}
		if (((ImageIcon) getValue(SMALL_ICON)).toString().equals(
				(new ImageIcon(getClass().getResource(
						"/resource/icons/Pause24.gif"))).toString())
				&& (ok)) {
			putValue(SMALL_ICON,new ImageIcon(getClass().getResource(
					"/resource/icons/Play24.gif")));
			ok = false;
			volumeOffB.setEnabled(false);
		}
		

			if (((ImageIcon) getValue(SMALL_ICON)).toString().equals(
					(new ImageIcon(getClass().getResource(
							"/resource/icons/Play24.gif"))).toString())) {

				AbstractMediaPlayer.setOption("pauseOf");
				AbstractMediaPlayer.setPlay(false);
				AbstractMediaPlayer.setStopButtonEvent(false);

				tabelle.setEnabled(false);
				tabelle.setRowSelectionAllowed(true);
				wiederholen.setEnabled(false);
				wiedergabelistenBox.setEnabled(false);

				
				

				if (AbstractMediaPlayer.randomboolean) {
					songlist = new RandomSongs(tabelle.getHashMap(), tabelle,
							songTimeAnzeige, zeitanzeige,
							stopB, video);
					songlist.start();
				} else if (AbstractMediaPlayer.wiederholenboolean) {
					songlist = new RepeatSongs(tabelle.getHashMap(), tabelle,
							songTimeAnzeige, zeitanzeige,
							stopB, video);
					songlist.start();
				} else {
					songlist = new PlaySongs(tabelle.getHashMap(), tabelle,
							songTimeAnzeige, zeitanzeige,
							stopB, video);
					songlist.start();

				}
				

			}
			if (((ImageIcon) getValue(SMALL_ICON)).toString()
					.equals(
							(new ImageIcon(getClass().getResource(
									"/resource/icons/Pause24.gif")))
									.toString())) {

				AbstractMediaPlayer.setOption("pause");
				AbstractMediaPlayer.setPlay(true);
				AbstractMediaPlayer.setStopButtonEvent(true);
				songlist.pauseSong(true);
				wiederholen.setEnabled(true);
				tabelle.setEnabled(true);
				wiedergabelistenBox.setEnabled(true);

			
		}
	}
	
}

Ich habe das in einer eigenen Klasse, weil es noch weitere Oberflächen geben soll die diese Klasse auch verwenden.
Gibt es da noch eine andere Möglichkeit, da ich es nicht besonders schön finde so viele GUI elemente im Konstruktor mitzugeben, oder ist das so normal?

Ich könnte natürlich die actionPerformed methode in der jeweiligen Klasse in der auch die anderen GUI Elemente sind einsetzen, dann müsste ich dies aber ja bei jeder Oberfläche machen. Deshalb würde ich diese gerne zentral halten.
Wie macht ihr das Standardmäßig?

Ein weiteres Problem gibt es nun wenn ich den Konstruktor der Klasse APlayB aufrufe.

Code:
JButton playB = null;
JButton randomB = null;
//...

APlayB play = new APlayB(songlist,randomB,wiederholenB,volumeOffB, stopB,tabelle,wiedergabelistenBox,zeitanzeige,video,songTimeAnzeige);
 
playB = new JButton(play);
randomB = new JButton(random);
//...
Klicke ich nun den Button Play an bekomme ich eine Nullpointer Exception (Zeile 61), wenn die Klasse APlayB random setEnabled(false) setzt. Dies ist ja verständlich da zum Zeitpunkt als der Konstruktor aufgerufen wurde randomB noch null war und somit auch random in der Klasse APlayB. Wie sollte ich das ändern.

Steh gerade irgendwie auf dem Schlauch.

Hoffe das war verständlich

danke
 

EOB

Top Contributor
sieht irgendwie komisch aus...warum hast du in der action gui zeug drin? normalerweise macht man in einer action eben auch eine action und stellt nix dar. also was weiss ich, eine ExitAction, die eben dann an ein exit menü und einen exit knopf gebunden wird. das prinzip ist hier auch wieder die wiederverwendung von code. was willst du genau machen?

grüße
eob
 

Marco13

Top Contributor
Code:
if (((ImageIcon) getValue(SMALL_ICON)).toString().equals(
            (new ImageIcon(getClass().getResource(
                  "/resource/icons/Play24.gif"))).toString())
            && (ok)) {
         putValue(SMALL_ICON,new ImageIcon(getClass().getResource(
               "/resource/icons/Pause24.gif")));
         ok = false;
         volumeOffB.setEnabled(true);
      }
:autsch: sieht SEHR komisch aus :autsch: (Anders formuliert: Ist kompletter Trash!)
Ein Konstruktor, der 10 Parameter übergeben bekommt, ist übrigens auch ... :autsch:

Schaun vielleicht mal nach dem MVC-Pattern (Model-View-Controller). Du solltest ggf. einen Player schreiben (das Modell) der NICHTS davon weiß, wie das GUI aussieht, und nur die Methoden anbietet, die ein Player eben hat (start, stop, random, ....). Und DIE können dann (von verschiedenen GUIs) aufgerufen werden.
 

EOB

Top Contributor
ja, ich würde sogar so weit gehen, dass ich alles nochmal machen würde ... eh du das jetzt wieder auseinanderfummelst und dann doch nicht richtig hast. ich würde auch strikt trennen.


model = daten

view = deine oberfläche

control (mit actions wie dus auch hast - war ne gute idee :))= klassen die aus der gui angestoßen werden und dann die action ausführen oder gegebenenfalls weiterleiten


es würde sich auch anbieten, das ein oder andere design pattern zu verwenden (facade zb) so hast du ne losere kopplung. auf keinen fall würde ich mit dem design weiter machen :p. aber man lernt ja nie aus. mit der facade kannst du eine schnittstelle anbieten, die vom controller aufgerufen wird. also sagen wir mal du hast eine funktion in dem player, die mehrerer sachen auslöst, also sagen wir mal sache a,b und c. eh du jetzt alle 3 methoden aufrufst, kannst du EINE methode anbieten, welche dann die 3 aufruft...so ist die kopplung geringer, da statt 3 methoden nur eine aufgerufen wird ... ganz wie du willst, man kanns mit patterns auch übertreiben, aber ganz weglassen ist auch nicht gut. ich zb implementiere die eigentliche funktionalität nie direkt im controller, sondern rufe von da immer nochmal was anderes auf. ist aber geschmackssache würd ich sagen.

oder du haust dann später je nach datenformat welches abgespielt wird das strategy pattern (früher auch policy genannt) rein...um das jeweilige format abzuspielen, falls das nötig ist. so ist das verhalten gekapselt und du kannsts immer wieder verwenden. also was weiss ich n interface IFormatPlayer welches die methode play() anbietet und die implementierst du dann mit dem jeweiligen algorithmus zum abspielen. aber nur, wenns nötig ist. also so in der art:

Code:
class MP3Player implements IFormatPlayer {

     play(){
        //mp3 algorithmus
     }
}

class OGGPlayer implements IFormatPlayer {

     play(){
        //ogg algorithmus
     }
}

dann bist du einerseits flexibel wegen dem interface und hast das verhalten schön einzeln um es zu verbessern oder zu warten.



wichtig ist, dass man eine trennung einbringt, um später leichter erweitern oder warten zu können.



grüße
eob
 

anfänger15

Bekanntes Mitglied
Ja das Problem ist ja das ich mehrere GUI's hab bzw. eine Menüleiste und die normalen Buttons. Meines Wissens sollte ja nun in der Klasse die ich von AbstractAction abgeleitet habe die actionPerformed methode (das was der Button eben machen soll) rein. Nun sollen die Button eben bestimmte andere Button deaktivieren ( setEnabled(false) ). Dies ist aber ja nur möglich, wenn ich die Buttons der Klasse die ich von AbstractAction abgeleitet habe übergebe, sonst müsste ich ja für die beiden Buttons wieder einen extra Listener in der GUI Klasse erstellen, der dann die Button deaktivieren.

Schau mir eure Tipps aber nochmal in ruhe an

schon mal danke
 

Marco13

Top Contributor
Wenn ein Button geklickt wird, dann sollen zwei andere deaktiviert werden. Die werden aber deaktiviert, weil sich der Zustand geändert hat. (Z.B. wurde durch den Buttnklick der Player in den "Play"-Modus geschaltet, und in allen GUIS sollten dann der "Play"Button und der "Shuffle"-Button diabled werden. Dann würde der Player eben eine Nachricht aussenden "ICh binin den Play-Modus gegangen", die bei allen GUIs (bzw. bei allen "PlayerStateListeners") ankommt, und die darafhin ihre Buttons disablen, wie sie wollen...
 

anfänger15

Bekanntes Mitglied
Marco13 hat gesagt.:
Wenn ein Button geklickt wird, dann sollen zwei andere deaktiviert werden. Die werden aber deaktiviert, weil sich der Zustand geändert hat. (Z.B. wurde durch den Buttnklick der Player in den "Play"-Modus geschaltet, und in allen GUIS sollten dann der "Play"Button und der "Shuffle"-Button diabled werden. Dann würde der Player eben eine Nachricht aussenden "ICh binin den Play-Modus gegangen", die bei allen GUIs (bzw. bei allen "PlayerStateListeners") ankommt, und die darafhin ihre Buttons disablen, wie sie wollen...

achso ich soll das ganze über Listener machen und nur die wirkliche action also player.play() in der AbstractAction Klasse machen.

danke
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K verständnissproblem mit TableModel AWT, Swing, JavaFX & SWT 2
C Applet JApplet - Verständnissproblem AWT, Swing, JavaFX & SWT 3
JavaJakob22 ButtonGroups in verschiedenen Packages AWT, Swing, JavaFX & SWT 2
G 2D-Grafik Grafik in zwei verschiedenen Fenstern gleichzeitig zeichnen AWT, Swing, JavaFX & SWT 9
P Zwischen verschiedenen Panels wechseln AWT, Swing, JavaFX & SWT 3
N JavaFX TreeView mit verschiedenen Datentypen AWT, Swing, JavaFX & SWT 8
B Java FX TableView Zeilen mit verschiedenen Typen AWT, Swing, JavaFX & SWT 15
R JTextArea mit verschiedenen Textfarben AWT, Swing, JavaFX & SWT 6
C Swing Aus verschiedenen Klassen zeichnen. AWT, Swing, JavaFX & SWT 2
HoloYoitsu Swing JButton in verschiedenen Winkeln drehen AWT, Swing, JavaFX & SWT 0
F Swing Drag and Drop in JTree aus verschiedenen Listen AWT, Swing, JavaFX & SWT 6
HaukeG Swing Drag & Drop in verschiedenen Varianten AWT, Swing, JavaFX & SWT 4
X JTable mit verschiedenen Objekten füllen AWT, Swing, JavaFX & SWT 14
F jTable mit verschiedenen Textfarben AWT, Swing, JavaFX & SWT 4
MQue JTable mit verschiedenen Models AWT, Swing, JavaFX & SWT 4
K Design von verschiedenen Rechnern AWT, Swing, JavaFX & SWT 13
dzim JFace TableViewer mit verschiedenen Inhalten AWT, Swing, JavaFX & SWT 4
A Design Problem bei verschiedenen Oberflächen AWT, Swing, JavaFX & SWT 3
S [SWT] Toogle Button 2 verschiedenen images? AWT, Swing, JavaFX & SWT 6
S Starten von verschiedenen JFrames AWT, Swing, JavaFX & SWT 11
C Verschachtelung von JPanels mit verschiedenen LayoutManager AWT, Swing, JavaFX & SWT 4
B Auto. anpassen bei verschiedenen Aulösungen AWT, Swing, JavaFX & SWT 9
T Die Schrift in verschiedenen Farben blinken zu lassen AWT, Swing, JavaFX & SWT 2
D Textzeielen mit verschiedenen Textfarben in JList? AWT, Swing, JavaFX & SWT 6
P in JFrame zwischen verschiedenen JPanels wechseln AWT, Swing, JavaFX & SWT 7
N Zufallszahlen in verschiedenen Bereichen. AWT, Swing, JavaFX & SWT 4
B JList Zeilen in verschiedenen Farben markieren. AWT, Swing, JavaFX & SWT 3
K JTextArea mit verschiedenen Farben betreiben [Chat] AWT, Swing, JavaFX & SWT 3
G JTextArea.append() in verschiedenen Farben AWT, Swing, JavaFX & SWT 2
J Daten in verschiedenen JTables AWT, Swing, JavaFX & SWT 5
K JFrames in verschiedenen Fenstern AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben