Eintrag soll nur einmal in Listview zu sehen sein

Gregorio

Mitglied
Hallo zusammen,

ich glaube ich stehe momentan aufm Schlauch oder denke zu kompliziert.
Für nen MediaPlayer öffne ich die Audiodateien und die landen feinsäuberlich in der Liste, möchte aber verhindern daß die Datei doppelt
geladen wird wenn sie sich schon in der Liste befindet.
Wie bewerkstellige ich das?

Hiermit sehe ich ja welchen Eintrag in selektiere, bringt mir das weiter?
[CODE lang="java" title=""]liste.getSelectionModel().getSelectedItem();[/CODE]

hier der Code:
[CODE lang="java" title="FXMLController"]import java.io.File;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.geometry.Point2D;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.ListView;
import javafx.stage.FileChooser;
import javafx.stage.FileChooser.ExtensionFilter;
import javafx.stage.Stage;

import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.image.Image;

public class FXMLController {
//für die Bühne
private Stage meineStage;
//für den Player
private MediaPlayer mediaplayer;

//für die MediaView
@FXML private MediaView mediaview;
//für die ImageView mit dem Symbol
@FXML private ImageView symbol;
//für das Listenfeld
@FXML private ListView<String> liste;



//die Methode setzt die Bühne auf den übergebenen Wert
public void setMeineStage(Stage meineStage) {
this.meineStage = meineStage;
}

//die Methode zum Laden
@FXML protected void ladenKlick(ActionEvent event) {
//eine neue Instanz der Klasse FileChooser erzeugen
FileChooser oeffnenDialog = new FileChooser();
//den Titel für den Dialog setzen
oeffnenDialog.setTitle("Datei öffnen");
//die Filter setzen
oeffnenDialog.getExtensionFilters().add(new ExtensionFilter("Audiodateien", "*.mp3"));
oeffnenDialog.getExtensionFilters().add(new ExtensionFilter("Videodateien", "*.mp4"));

//den Startordner auf den Benutzerordner setzen
oeffnenDialog.setInitialDirectory(new File(System.getProperty("user.home")));

//den Öffnendialog anzeigen und das Ergebnis beschaffen
File datei = oeffnenDialog.showOpenDialog(meineStage);
//wurde eine Datei ausgewählt
if (datei != null)
//dann über eine eigene Methode laden
dateiLaden(datei);
}

//Auswahl aus Liste
@FXML
protected void listeAuswahlKlick(ActionEvent event) {
//gibt es überhaupt einen Mediaplayer?
if (mediaplayer != null)
//dann anhalten
mediaplayer.stop();
System.out.println("+++");
}

//die Methode zum Stoppen
@FXML protected void stoppKlick(ActionEvent event) {
//gibt es überhaupt einen Mediaplayer?
if (mediaplayer != null)
//dann anhalten
mediaplayer.stop();
}

//die Methode für die Pause
@FXML protected void pauseKlick(ActionEvent event) {
//gibt es überhaupt einen Mediaplayer?
if (mediaplayer != null)
//dann unterbrechen
mediaplayer.pause();
}

//die Methode für die Wiedergabe
@FXML protected void playKlick(ActionEvent event) {
//gibt es überhaupt einen Mediaplayer?
if (mediaplayer != null)
//dann wiedergeben
mediaplayer.play();
}

//die Methode für das Ein- und Ausschalten der Lautstärke
@FXML protected void lautsprecherKlick(ActionEvent event) {
//gibt es überhaupt einen Mediaplayer?
String dateiname;
if (mediaplayer != null) {
//ist die Lautstärke 0?
if (mediaplayer.getVolume() == 0) {
//dann auf 100 setzen
mediaplayer.setVolume(100);
//und das "normale" Symbol setzen
dateiname = "icons/mute.gif";
}
else {
//sonst auf 0 setzen
mediaplayer.setVolume(0);
//und das durchgestrichene Symbol setzen
dateiname = "icons/mute_off.gif";
}
//das Bild erzeugen und anzeigen
File bilddatei = new File(dateiname);
Image bild = new Image(bilddatei.toURI().toString());
symbol.setImage(bild);
}
}


//die Methode zum Beenden
@FXML protected void beendenKlick(ActionEvent event) {
Platform.exit();
}



//die Methode lädt eine Datei
public void dateiLaden(File datei) {
//läuft schon eine Wiedergabe?
if (mediaplayer != null && mediaplayer.getStatus() == MediaPlayer.Status.PLAYING) {
//dann anhalten
mediaplayer.stop();
}
//das Medium, den Mediaplayer und die MediaView erzeugen
try {
Media medium = new Media(datei.toURI().toString());
mediaplayer = new MediaPlayer(medium);
mediaview.setMediaPlayer(mediaplayer);
//die Wiedergabe starten
mediaplayer.play();

//den Pfad in das Listenfeld eintragen
liste.getItems().add(datei.toString());
if(liste.getSelectionModel().getSelectedIndices().contains(liste.getItems().size()-1))
liste.getItems().add("new list item");


//und die Titelleiste anpassen
meineStage.setTitle("JavaFX Multimedia-Player " + datei.toString());
}
catch(Exception ex) {
//den Dialog erzeugen und anzeigen
Alert meinDialog = new Alert(AlertType.INFORMATION, "Beim Laden hat es ein Problem gegeben.\n" + ex.getMessage());
//den Text setzen
meinDialog.setHeaderText("Bitte beachten");
meinDialog.initOwner(meineStage);
//den Dialog anzeigen
meinDialog.showAndWait();
}
}
}
[/CODE]

Vielen Dank
 

lam_tr

Top Contributor
Hallo zusammen,

ich glaube ich stehe momentan aufm Schlauch oder denke zu kompliziert.
Für nen MediaPlayer öffne ich die Audiodateien und die landen feinsäuberlich in der Liste, möchte aber verhindern daß die Datei doppelt
geladen wird wenn sie sich schon in der Liste befindet.
Wie bewerkstellige ich das?

Hiermit sehe ich ja welchen Eintrag in selektiere, bringt mir das weiter?
[CODE lang="java" title=""]liste.getSelectionModel().getSelectedItem();[/CODE]

hier der Code:
[CODE lang="java" title="FXMLController"]import java.io.File;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.geometry.Point2D;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.ListView;
import javafx.stage.FileChooser;
import javafx.stage.FileChooser.ExtensionFilter;
import javafx.stage.Stage;

import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.image.Image;

public class FXMLController {
//für die Bühne
private Stage meineStage;
//für den Player
private MediaPlayer mediaplayer;

//für die MediaView
@FXML private MediaView mediaview;
//für die ImageView mit dem Symbol
@FXML private ImageView symbol;
//für das Listenfeld
@FXML private ListView<String> liste;



//die Methode setzt die Bühne auf den übergebenen Wert
public void setMeineStage(Stage meineStage) {
this.meineStage = meineStage;
}

//die Methode zum Laden
@FXML protected void ladenKlick(ActionEvent event) {
//eine neue Instanz der Klasse FileChooser erzeugen
FileChooser oeffnenDialog = new FileChooser();
//den Titel für den Dialog setzen
oeffnenDialog.setTitle("Datei öffnen");
//die Filter setzen
oeffnenDialog.getExtensionFilters().add(new ExtensionFilter("Audiodateien", "*.mp3"));
oeffnenDialog.getExtensionFilters().add(new ExtensionFilter("Videodateien", "*.mp4"));

//den Startordner auf den Benutzerordner setzen
oeffnenDialog.setInitialDirectory(new File(System.getProperty("user.home")));

//den Öffnendialog anzeigen und das Ergebnis beschaffen
File datei = oeffnenDialog.showOpenDialog(meineStage);
//wurde eine Datei ausgewählt
if (datei != null)
//dann über eine eigene Methode laden
dateiLaden(datei);
}

//Auswahl aus Liste
@FXML
protected void listeAuswahlKlick(ActionEvent event) {
//gibt es überhaupt einen Mediaplayer?
if (mediaplayer != null)
//dann anhalten
mediaplayer.stop();
System.out.println("+++");
}

//die Methode zum Stoppen
@FXML protected void stoppKlick(ActionEvent event) {
//gibt es überhaupt einen Mediaplayer?
if (mediaplayer != null)
//dann anhalten
mediaplayer.stop();
}

//die Methode für die Pause
@FXML protected void pauseKlick(ActionEvent event) {
//gibt es überhaupt einen Mediaplayer?
if (mediaplayer != null)
//dann unterbrechen
mediaplayer.pause();
}

//die Methode für die Wiedergabe
@FXML protected void playKlick(ActionEvent event) {
//gibt es überhaupt einen Mediaplayer?
if (mediaplayer != null)
//dann wiedergeben
mediaplayer.play();
}

//die Methode für das Ein- und Ausschalten der Lautstärke
@FXML protected void lautsprecherKlick(ActionEvent event) {
//gibt es überhaupt einen Mediaplayer?
String dateiname;
if (mediaplayer != null) {
//ist die Lautstärke 0?
if (mediaplayer.getVolume() == 0) {
//dann auf 100 setzen
mediaplayer.setVolume(100);
//und das "normale" Symbol setzen
dateiname = "icons/mute.gif";
}
else {
//sonst auf 0 setzen
mediaplayer.setVolume(0);
//und das durchgestrichene Symbol setzen
dateiname = "icons/mute_off.gif";
}
//das Bild erzeugen und anzeigen
File bilddatei = new File(dateiname);
Image bild = new Image(bilddatei.toURI().toString());
symbol.setImage(bild);
}
}


//die Methode zum Beenden
@FXML protected void beendenKlick(ActionEvent event) {
Platform.exit();
}



//die Methode lädt eine Datei
public void dateiLaden(File datei) {
//läuft schon eine Wiedergabe?
if (mediaplayer != null && mediaplayer.getStatus() == MediaPlayer.Status.PLAYING) {
//dann anhalten
mediaplayer.stop();
}
//das Medium, den Mediaplayer und die MediaView erzeugen
try {
Media medium = new Media(datei.toURI().toString());
mediaplayer = new MediaPlayer(medium);
mediaview.setMediaPlayer(mediaplayer);
//die Wiedergabe starten
mediaplayer.play();

//den Pfad in das Listenfeld eintragen
liste.getItems().add(datei.toString());
if(liste.getSelectionModel().getSelectedIndices().contains(liste.getItems().size()-1))
liste.getItems().add("new list item");


//und die Titelleiste anpassen
meineStage.setTitle("JavaFX Multimedia-Player " + datei.toString());
}
catch(Exception ex) {
//den Dialog erzeugen und anzeigen
Alert meinDialog = new Alert(AlertType.INFORMATION, "Beim Laden hat es ein Problem gegeben.\n" + ex.getMessage());
//den Text setzen
meinDialog.setHeaderText("Bitte beachten");
meinDialog.initOwner(meineStage);
//den Dialog anzeigen
meinDialog.showAndWait();
}
}
}
[/CODE]

Vielen Dank
Du kannst bevor du der Observable List übergibst, die Liste distincten.

Bsp von StackOverflow: https://stackoverflow.com/questions/23699371/java-8-distinct-by-property
 

lam_tr

Top Contributor
Ok, vielen Dank, schau ich mir mal an.
Habe vorhin im Netz gelesen was über contains() gelesen, wäre das nicht einfacher?
wenn ja, wie müßte ich da vorgehen?
Du kannst an sich auch beim Laden der Liste zuerst alle Dateinamen in eine Map as key packen, dann werden die vorkommenenden Namen zumindest überschrieben. Bestimmt gibt es auch bessere Lösungen. Hier nur ein simpler Ansatz von mir.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J JComboBox Eintrag soll TextField aktualisieren AWT, Swing, JavaFX & SWT 3
R SWT: FileMenu-Eintrag soll Methode aufrufen AWT, Swing, JavaFX & SWT 2
H Swing Auf Klick auf Menü-Eintrag reagieren AWT, Swing, JavaFX & SWT 0
S Swing jScrollPane - pro Eintrag der Liste, die jCheckBoxes Speichern die in dem Eintrag aktiviert wurden AWT, Swing, JavaFX & SWT 2
C JComboBox Objecte übergeben und Eintrag auswählen AWT, Swing, JavaFX & SWT 3
P Einer JList mit eigenem ListModel einen Eintrag hinzfügen AWT, Swing, JavaFX & SWT 5
D Swing JComboBox (DefaultComboBoxModel) überschreibt Eintrag beim erstellen AWT, Swing, JavaFX & SWT 0
J Viewerfilter mehr als ein Eintrag AWT, Swing, JavaFX & SWT 6
D Apple MenuBar Eintrag "java" AWT, Swing, JavaFX & SWT 15
F Swing String[] in JTextArea ausgeben. Jeder Eintrag in neue Zeile, aber ohne "\n"- Geht das? AWT, Swing, JavaFX & SWT 3
Ollek JList - neuer Eintrag in ArrayList dadurch keine Anzeige der Objekte AWT, Swing, JavaFX & SWT 18
N Swing Eintrag in JTable an dessen TableModel weiterreichen AWT, Swing, JavaFX & SWT 3
F Wert zu Eintrag in ComboBox speichern?! AWT, Swing, JavaFX & SWT 7
W Swing Tag Oder Custom Eintrag AWT, Swing, JavaFX & SWT 7
S JTable letzen Eintrag anzeigen AWT, Swing, JavaFX & SWT 3
D JCombobox mit <neuer Eintrag> AWT, Swing, JavaFX & SWT 10
Z JLIST / Model erster EINTRAG AWT, Swing, JavaFX & SWT 11
hdi SWT JComboBox : Drop-Down Header ohne Eintrag AWT, Swing, JavaFX & SWT 6
C JList: Eintrag anklicken & JTextfield mit Text aus MySQL füllen? (Screenshot dabei) AWT, Swing, JavaFX & SWT 8
R JList: auf den selektierten Eintrag reagieren AWT, Swing, JavaFX & SWT 4
hdi JFrame ohne Eintrag in der Taskleiste AWT, Swing, JavaFX & SWT 12
V JComboBox Eintrag nicht anwählbar machen? AWT, Swing, JavaFX & SWT 3
G JList - Beim Mousehover Eintrag selektieren AWT, Swing, JavaFX & SWT 12
P Bei JComboBox einem Eintrag Wert zuweisen AWT, Swing, JavaFX & SWT 7
G JList eintrag "nicht anklickbar" machen AWT, Swing, JavaFX & SWT 3
M Jlist Eintrag mit suche selektieren AWT, Swing, JavaFX & SWT 4
H JComboBox mit nicht selektierbarem Eintrag AWT, Swing, JavaFX & SWT 7
E JComboBox: einen Eintrag "unselectable" setzen AWT, Swing, JavaFX & SWT 7
G JList Neuen Eintrag sofort anzeigen AWT, Swing, JavaFX & SWT 10
G JList einen Eintrag hinzufügen? AWT, Swing, JavaFX & SWT 8
A JComboBox erster Eintrag nicht auswählbar AWT, Swing, JavaFX & SWT 4
M Erster Eintrag der ComboBox reagiert nicht AWT, Swing, JavaFX & SWT 12
D FileFilter Default Eintrag AWT, Swing, JavaFX & SWT 4
K JList - selektierten Eintrag anzeigen AWT, Swing, JavaFX & SWT 11
R JTable zu einem bestimmten Eintrag automatisch scrollen? AWT, Swing, JavaFX & SWT 2
J Taskleisten-Eintrag: Ohne JDialog || JFrame möglich ? AWT, Swing, JavaFX & SWT 5
V Click auf JTable (Zeile) liefert den Eintrag? AWT, Swing, JavaFX & SWT 11
F [JList] mit addElement einen Eintrag hinzufügen AWT, Swing, JavaFX & SWT 3
T Shortcut für Eintrag aus MenuBar AWT, Swing, JavaFX & SWT 3
M JComboBox und selektierter Eintrag AWT, Swing, JavaFX & SWT 4
bernd Aus einem JTextArea einen Eintrag auswählen AWT, Swing, JavaFX & SWT 11
S Wie scrollt JScrollPane zu dem makierten Eintrag der JList? AWT, Swing, JavaFX & SWT 3
M Vokabelprogram - Schleife für Liste soll schrittweise durchlaufen werden AWT, Swing, JavaFX & SWT 3
H JList.setEnabled(false) - Text soll nicht grau sein AWT, Swing, JavaFX & SWT 2
berserkerdq2 Mein Rechteck hat 4 Seiten, ich soll je nach dem, welche Seite berührt wurde, etwas ausführen, wie prüfe ich das? AWT, Swing, JavaFX & SWT 12
Zeppi Swing Button soll Spiel zurücksetzen AWT, Swing, JavaFX & SWT 5
A Titelleiste soll Pfad ausgeben AWT, Swing, JavaFX & SWT 16
SvenPittelkow Programm soll auf JButton warten bis der geklickt wurde AWT, Swing, JavaFX & SWT 1
W JavaFX CSS - was soll mir das sagen? AWT, Swing, JavaFX & SWT 2
D JavaFX Menu soll nicht bei jedem Click verschwinden AWT, Swing, JavaFX & SWT 8
Zrebna Problem bei Eventhandling (Value soll nach jedem erneutem Klick gelöscht werden) AWT, Swing, JavaFX & SWT 4
O Soll ich einen JEditorPane verwenden ? AWT, Swing, JavaFX & SWT 5
J jButton soll nach klicken eine Variable um 1 erhöhen AWT, Swing, JavaFX & SWT 2
S JavaFX Node soll auch nach Skalierung zentriert platziert sein AWT, Swing, JavaFX & SWT 3
T JavaFX Dialog schließt ohne dass es schließen soll AWT, Swing, JavaFX & SWT 1
W Javafx - Image soll sich mit der Camera mitbewegen AWT, Swing, JavaFX & SWT 1
A JScrollPane soll JPanel mit JButtons enthalten und eine Scollbar anzeigen AWT, Swing, JavaFX & SWT 1
A Swing GUI - Button soll Frame verändern AWT, Swing, JavaFX & SWT 4
T Frage zu GUI - Button soll Objekt erfassen AWT, Swing, JavaFX & SWT 2
L Swing JButton soll link öffnen AWT, Swing, JavaFX & SWT 1
A JButton soll durch anklicken die Farbe wechseln AWT, Swing, JavaFX & SWT 8
S Zwei JTree, ein Model, bei Selection im ersten JTree soll der zweite die Inhlate anzeigen AWT, Swing, JavaFX & SWT 2
M JavaFX StackedBarChart y-Axis soll nur Integerwerte anzeigen AWT, Swing, JavaFX & SWT 1
A Slider soll einen Wert übergeben AWT, Swing, JavaFX & SWT 1
P JavaFX Slider soll Value erst ab einer bestimmten Bedinung aendern AWT, Swing, JavaFX & SWT 19
krgewb AWT JFrame soll sich wie Dialog verhalten AWT, Swing, JavaFX & SWT 9
V JScrollBar soll weiterscrollen, wenn Inhalt von JTextArea erweitert wird AWT, Swing, JavaFX & SWT 7
V Swing Button soll unter anderem Button sein AWT, Swing, JavaFX & SWT 2
P Fenstergröße ändern, Panel soll gleich bleiben AWT, Swing, JavaFX & SWT 2
F JavaFX Timeline Animation soll X- und Y-Position während Animation ändern AWT, Swing, JavaFX & SWT 2
I JTable: Doppelklick auf Table soll neues Fenster öffnen und Daten aus JTable anzeigen AWT, Swing, JavaFX & SWT 4
T MausClick soll TExt ändern AWT, Swing, JavaFX & SWT 6
J JavaFX Tabelle soll ganze Seite ausfüllen AWT, Swing, JavaFX & SWT 2
D Swing Schließen von JDialog soll auch JFrame schließen. AWT, Swing, JavaFX & SWT 4
T SWT SWTBot Test: Dialog soll sich öffnen,wenn button gedrückt AWT, Swing, JavaFX & SWT 3
T SWT Button soll nur sichbar sein,wenn im Textfeld der Focus ist AWT, Swing, JavaFX & SWT 4
J ActionListener soll auf paint() Methode zugreifen AWT, Swing, JavaFX & SWT 1
C 2D Grafik ein Bild soll permanent durchlaufen AWT, Swing, JavaFX & SWT 2
windl Warum soll ich zu JavaFX? AWT, Swing, JavaFX & SWT 18
H Java3D, ViewP Translattform soll sich nach einerformgroup richten. AWT, Swing, JavaFX & SWT 5
S Hauptfenster soll geöffnet bleiben AWT, Swing, JavaFX & SWT 4
M JDialog soll JFrame "blockieren" AWT, Swing, JavaFX & SWT 2
D Image soll langsam sichtbar werden AWT, Swing, JavaFX & SWT 4
F Swing JTextfield Beispieltext soll nach Klick verschwinden AWT, Swing, JavaFX & SWT 3
TheJavaKid DocumentListener soll Text in JTextField ändern AWT, Swing, JavaFX & SWT 4
J Zwei GUIs - Nach button-Klick soll ein Wert an die andere GUI übergeben werden AWT, Swing, JavaFX & SWT 15
J Swing String soll als Variable dienen AWT, Swing, JavaFX & SWT 11
M EditorPane Inhalt anders als er soll! AWT, Swing, JavaFX & SWT 2
C LayoutManager Grafik soll nicht im GridLayout Skalieren AWT, Swing, JavaFX & SWT 3
M Swing ActionEvent soll von Anderem ActionEvent abhängen AWT, Swing, JavaFX & SWT 3
J Button soll nach Klick Text ändern und Programm in 3 Sekunden beenden AWT, Swing, JavaFX & SWT 6
H Swing Button Klick soll "Untermenü-Buttons" erzeugen AWT, Swing, JavaFX & SWT 2
Z Swing JPanel soll größer werden als Parent Container (überlappen) AWT, Swing, JavaFX & SWT 5
D Swing jSlider soll selber weiterwandern, je nach zeit der musik AWT, Swing, JavaFX & SWT 5
A SWT Tooltip soll nicht verschwinden, solange User mit Maus auf Control ist AWT, Swing, JavaFX & SWT 5
D Swing JProgressBar soll ende erkennen AWT, Swing, JavaFX & SWT 4
S JVM von Oracle/Sun soll für AWT/SWING Elemente die die Optimierungen der NVidia Treiber verwenden AWT, Swing, JavaFX & SWT 3
J Swing JDialog blokiert mehrere JFrames - soll aber nur den aufrufenden blockieren AWT, Swing, JavaFX & SWT 4
N Applet JButton soll html Datei aus einem Ordner öffnen AWT, Swing, JavaFX & SWT 2
Z Bei Klick auf JButton soll ein anderer JButton erscheinen AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben