Hallo,
aufgrund von diesem Thread versuche ich gerade meine GUI mit Action-Objekten aufzubauen.
hier eine Klasse davon:
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.
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
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);
//...
Steh gerade irgendwie auf dem Schlauch.
Hoffe das war verständlich
danke