JavaFX Verständnisfrage mit parametrisierten Methoden und FXML

Gregorio

Mitglied
Hallo zusammen,

habe eine Frage bzgl. springen in Methoden in Verbindung mit FXML.

Java:
protected void reloadKlick (MouseEvent event, File datei) {
            if (event.getClickCount() == 2)
                dateiLaden(datei);
    }

Möchte von der Methode zur Methode dateiLaden(File datei) springen,
reloadKlick hat 2 Parameter, wenn ich das Programm starte meckert Eclipse und sagt
"Error resolving onMouseClicked='#listeAuswahlKlick', either the event handler is not in the Namespace or there is an error in the script."

Kann man das so programmieren?, falls nicht wie könnte ich das umschreiben?

Vielen Dank
 
G

Gelöschtes Mitglied 65838

Gast
woher bekommst du denn den Namen der datei?

bzw in welcher form
 

Gregorio

Mitglied
Aus der Methode ladenKlick

Java:
//die Methode zum Laden
    @FXML protected void ladenKlick(ActionEvent event) {
        FileChooser oeffnenDialog = new FileChooser();
        oeffnenDialog.setTitle("Datei öffnen");
        oeffnenDialog.getExtensionFilters().add(new ExtensionFilter("Texte", "*.txt"));

        oeffnenDialog.setInitialDirectory(new File(System.getProperty("user.home")));
        File datei = oeffnenDialog.showOpenDialog(meineStage);
        if (datei != null)
            dateiLaden(datei);
    }
 
G

Gelöschtes Mitglied 65838

Gast
Das kommt in dein Model
Java:
    private SimpleStringProperty datei = new SimpleStringProperty();
    public EventHandler<MouseEvent> ladeHandler= event -> {
        dateiLaden(datei.getValue())
    };
In deinen Controller kommt
Java:
view.getDateiNameStringProperty().bind(model.datei);
view.buttonclick.addEventHandler(MouseEvent.MOUSE_CLICKED, model.ladeHandler);
damit hättest du das MVVC model von javafx umgesetzt was sehr einfach ist ...wie du an das zeug der view kommst hängt an dir

du musst es noch ummurksen dass es für dich passt


das problem ist ein Eventhandler hat keine parameter ausser das was für das event nötig is
 
G

Gelöschtes Mitglied 65838

Gast
es ist sehr nice das mvvc model umzusetzen in javafx es ist dann wirklich einfach eine anwendung zu bauen und man sollte sich daran halten weil die propertys sind echt ne fantastische sache
 
G

Gelöschtes Mitglied 65838

Gast
ich kann dir aber nicht sagen wie es geht mit fxml aber an die properties solltest du ran kommen..


EDIT: kann sein dass du die Properties umtauschne musst oder bidirectional machen musst...aber das bekommst du sicher hin ;)
 

Gregorio

Mitglied
Hierbei meckert Eclipse, ich sollte hinter " dateiLaden(datei.getValue())" ";" einfügen, füge ich das ein da bekomme ich folgende Meldung:
"Die Methode dateiLaden(File) im Typ FXMLController ist für die Argumente nicht anwendbar (String)"

Java:
   public EventHandler<MouseEvent> ladeHandler= event -> {
        dateiLaden(datei.getValue())
    };
 
G

Gelöschtes Mitglied 65838

Gast
hab semicolon vergessen


es wird ja Eine Datei erwartet, hatte das erst später mitbekommen... dachte es wäre ein String

Java:
private SimpleObjectProperty<File> datei= new SimpleObjectProperty<File>();


das musst du an das Ergebnis deines File Openers binden
 
G

Gelöschtes Mitglied 65838

Gast
falls du es mit dem binding NICHT hinbekommst kannst du es auch so machen

dein ActionEvent setzt deinen Datei Namen( jetzt keine property) und imfalle eines action events vom anderen button wird auf die Datei zugeriffen

also einfahc ausgedrückt :
deklariere Datei ausserhalb im Model
beide greifen auf this.datei zu
 
G

Gelöschtes Mitglied 65838

Gast
Java:
public class Model {
public File datei ;

// Eventhandler {
// datei Laden (this.datei)
//}

// 2ter Eventhandler{
// datei Laden ( this .datei)
// }

// onAction {
// open File handler
// this.datei = openedFile
// }
}
dann musst du nur noch die datei im Model richtig setzen


So wird immer die letzte datei gespeichert dann musst gar nicht mehr reload klick machen


Die letztere Lösung ist sinnvoller .. da der File Opener keine Schicke Property Liefert
 

Gregorio

Mitglied
Hallo und vielen Dank,

habe versucht übers Wochenende das mir beizubringen und habs gelassen weil es noch zu kompliziert für mich ist, irgendwannmal kann ich das aber es ist noch zu früh :)

Wenn man nen Sprung in einer anderen Methode macht ohne Parameter ist es ja sehr einfach zu Programmieren, aber sobald man den Sprung in einer Methode macht wo man auf 2 Events angewiesen ist dann ist es zu hoch für mich.

Welche "einfache" Möglichkeiten habe ich noch?
Ich dachte an Variable datei in der Methode dateiLaden(datei) erzeugen, dann im Speicher kopieren und in der neuen Methode aufrufen

Bei deinem Code konnte ich nach Recherchen im Netz bis folgendes kommen:

Java:
private SimpleObjectProperty<File> datei= new SimpleObjectProperty<File>();
public EventHandler<MouseEvent> ladeHandler= event -> {
        dateiLaden(datei.getValue())
    };

mit den 2 Zeilen darunter mit "view...." kam ich net mehr klar.
Dann habe ich die Variable datei deklariert zum testen und beim draufklicken konnte ich zu der Methode zwar springen aber natürlich bekam ich eine null Exception.
 
G

Gelöschtes Mitglied 65838

Gast
Java:
public class Main extends Application {
        public static void main(String[] args) {
            launch(null);
        }
        public void start(Stage sta) throws Exception {
         
            Button load = new Button("laden");

            Model meinModel = new Model(sta);
            load.addEventHandler(MouseEvent.MOUSE_CLICKED,     meinModel.load);
            Scene scene = new Scene(load,700,700);
            sta.setScene(scene);
 
            sta.show();
            sta.setTitle("NEXcardGame");
        }
     
     
     
        class Model{
            private File datei ;
            Stage meineStage;
            public Model(Stage meineStage) {
                this.meineStage = meineStage;
            }
            EventHandler<MouseEvent> load = event ->{
                FileChooser oeffnenDialog = new FileChooser();
                if(event.getClickCount() < 2) {
                    oeffnenDialog.setTitle("Datei öffnen");
                    oeffnenDialog.getExtensionFilters().add(new ExtensionFilter("Texte", "*.txt"));
 
                    oeffnenDialog.setInitialDirectory(new File(System.getProperty("user.home")));
                    this.datei = oeffnenDialog.showOpenDialog(meineStage);
                    if (datei != null)
                        dateiLaden();
                    }
                    else {
                        dateiLaden();
                    }
                };
                EventHandler<MouseEvent> reload = event ->{
                    //.....
                };
             
                private void dateiLaden() {
                   // this.datei...
                }
        }

so pi mal wurschtfinger hatte ich es gedacht
einfach datei nicht übergeben sondern im gleichen Objekt bleiben und auf "this.datei" zugreifen
 
Zuletzt bearbeitet von einem Moderator:
G

Gelöschtes Mitglied 65838

Gast
jetzt musst halt den fall abdecken in datei Laden
if datei == null -> öffne dialog
ansonsten -> lade die datei die schon da ist ...vllt dann auch wieder leeren
 

Gregorio

Mitglied
Ich kriege es net gebacken, ich lass es sein, sehe den Wald vor lauter Bäumen net mehr.

Danke Dir trotzdem Mann.. ich feier Dich für deine Hilfe.
 

thecain

Top Contributor
Das heisst MVVM oder MVC, aber nicht MVVC, ausser das ist etwas ganz neues. Ausserdem hat mMn ein MouseEvent und ein Dialog nichts im Model verloren.
 
G

Gelöschtes Mitglied 65838

Gast
Das heisst MVVM oder MVC, aber nicht MVVC, ausser das ist etwas ganz neues. Ausserdem hat mMn ein MouseEvent und ein Dialog nichts im Model verloren.
es ging um die this.datei...dass er nichts mehr übergeben muss und das problem löst



PowerPoint Presentation (lmu.de)

hier wird in der MyView der handler "button.setOnAction ( model.changeLabel() )
gesetzt da kann ich dann auch
button.addEventHandler ( actionevent.action , changeLabelhandlerSchreiben )
ist gleichwertig nur dass ich im labelHandler mich auf in diesem fall "this.datei" beziehen kann weil das MyView nicht für die View braucht
 
Zuletzt bearbeitet von einem Moderator:

thecain

Top Contributor
Ja, aber es bringt doch nichts die ganze Zeit vom "nicen MVVC" zu sprechen und dann ein halbgares zu Beispiel präsentieren.
Zumindest hätte ich es dann nicht Model genannt.
 

Gregorio

Mitglied
@Gregorio ist dir bei deinem Problem schon irgendwie geholfen oder macht es Sinn, dir noch mal von vorn bei dem Problem aus dem Ausgangspost zu helfen.




Die Präsentation ist halt auch einfach schlecht.
Nein, die Ansätze waren gut gemeint und bestimmt helfen die auch aber ich peile es noch net.. bin noch "Anfänger".
ich poste den ganzen Code hier vielleicht wird ja jemand daraus schlau.
in der Methode dateiLaden(datei) wird die Datei geladen und in die Listview gepackt, in der Methode reloadKlick muß ich den Eintrag in der Listview anklicken, wenn die Datei vorhanden ist, soll sie nochmal geladen werden, aber ich weiß net so recht wie ich es hinkriegen soll
daß ich ich von von reloadKlick auf dateiLaden(datei) springen kann da ich in der Methode nur (MouseEvent event) weitergeben kann und nich wie gewünscht (MouseEvent event, File datei).

Java:
import java.io.File;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import javafx.application.Platform;
import javafx.beans.Observable;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.geometry.Point2D;
import javafx.scene.Scene;
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.util.Callback;
import javafx.collections.ObservableSet;
import javafx.collections.SetChangeListener;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseButton;
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 symbolLautstaerke;
   
    //für die ImageView mit dem Symbol für Pause und Play
    @FXML private ImageView symbolPlayPause;
   
    //für die ImageView mit dem Symbol für Pause und Play
    @FXML private ImageView symbolStop;
   
    //für das Listenfeld
    @FXML private ListView<String> liste;
   

    //die Methode setzt die Bühne auf den übergebenen Wert
    public void setMeineStage(Stage meineStage) {
        symboleDeaktivieren();
        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);
//        symboleAktivieren();
    }

    //die Methode zum reload  
    @FXML protected void reloadKlick(MouseEvent event) {
         if (event.getClickCount() == 2)
                 dateiLaden(datei);
            //Testen
             System.out.println("XXX");
                }


    //die Methode zum Stoppen
    @FXML protected void stoppKlick(ActionEvent event) {
        String dateiname;
        //gibt es überhaupt einen Mediaplayer?
        if (mediaplayer != null)
            //und das "play" Symbol setzen
            //dann anhalten
            mediaplayer.stop();
            dateiname = "icons/stop.gif";
       
        //das Bild erzeugen und anzeigen
        File bilddatei = new File(dateiname);
        Image bild = new Image(bilddatei.toURI().toString());
        symbolStop.setImage(bild);
    }
   
    //die Methode für die Wiedergabe und die Pause
    @FXML protected void playpauseKlick(ActionEvent event) {
        String dateiname;
            //gibt es überhaupt einen Mediaplayer?
        if (mediaplayer != null) {
            //Status des Mediaplayers holen          
            if (mediaplayer.getStatus() == MediaPlayer.Status.PLAYING) {
                //song pausieren
                mediaplayer.pause();
                //und das "play" Symbol setzen
                dateiname = "icons/play.gif";
            } else {
                //song starten
                mediaplayer.play();
                //und das "pause" Symbol setzen
                dateiname = "icons/pause.gif";
               
            }
            //das Bild erzeugen und anzeigen
            File bilddatei = new File(dateiname);
            Image bild = new Image(bilddatei.toURI().toString());
            symbolPlayPause.setImage(bild);
        }

    }

    //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());
            symbolLautstaerke.setImage(bild);  
        }
    }

    //Symbole Deaktivieren
    private void symboleDeaktivieren() {
        symbolPlayPause.setVisible(false);
        symbolStop.setVisible(false);
        symbolPlayPause.setDisable(true);
        symbolStop.setDisable(true);
    }

    //Symbole wieder Aktivieren
    private void symboleAktivieren() {
        symbolPlayPause.setVisible(true);
        symbolStop.setVisible(true);
        symbolPlayPause.setDisable(false);
        symbolStop.setDisable(false);
    }

   
    //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 soll nicht automatisch starten
//            mediaplayer.play();

            //den Pfad in das Listenfeld eintragen
            ObservableList<String> multimedia = liste.getItems();
            if (!multimedia.contains(datei.toString()))
                multimedia.add(datei.toString());
            symboleAktivieren();
           
            //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();
        }
    }
}
 

Gregorio

Mitglied
Habs anders gelöst..

Mein Problem war:
Java:
protected void reloadKlick (MouseEvent event, File datei) {
            if (event.getClickCount() == 2)
                dateiLaden(datei);
    }

habe folgendes gemacht und es funktioniert:

Java:
protected void reloadKlick (MouseEvent event) {
    File dateiNeu = new File(liste.getSelectionModel().getSelectedItem());
            if (event.getClickCount() == 2)
                dateiLaden(dateiNeu);
    }

Danke an alle
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B JavaFX Verständnisfrage EventHandler<ActionEvent> Implementierung in meiner Klasse AWT, Swing, JavaFX & SWT 2
B JavaFX Grundlegende Verständnisfrage JavaFX<->Scene Builder AWT, Swing, JavaFX & SWT 12
L JavaFX Verständnisfrage zu JavaFX FXML und Controller-Klasse AWT, Swing, JavaFX & SWT 1
M Swing JButton-Konstruktor Icon-Parameter (Verständnisfrage) AWT, Swing, JavaFX & SWT 7
S Verständnisfrage EventListener AWT, Swing, JavaFX & SWT 6
S Verständnisfrage anonye Klasse ActionListener AWT, Swing, JavaFX & SWT 4
E EINFACHE Verständnisfrage zu repaint(), paintComponent(), usw. AWT, Swing, JavaFX & SWT 16
hdi Swing Erstmaliges setVisible - Verständnisfrage AWT, Swing, JavaFX & SWT 5
hdi Verständnisfrage: Container vs. Component AWT, Swing, JavaFX & SWT 3
V Verständnisfrage: Welche Positionierungskonstanten? AWT, Swing, JavaFX & SWT 4
V Verständnisfrage Text und anschließende Bildausgabe? AWT, Swing, JavaFX & SWT 6
R Verständnisfrage BufferStrategy: g.dispose() AWT, Swing, JavaFX & SWT 3
K Verständnisfrage zum CellRenderer AWT, Swing, JavaFX & SWT 4
A Verständnisfrage zur Ereignisbehandlung AWT, Swing, JavaFX & SWT 5
U was bewirkt die methode fill und unterschied zu anderen fill Methoden in 2dgraphics? (Java)? AWT, Swing, JavaFX & SWT 6
J Genutzte Methoden in einen Frame einbauen AWT, Swing, JavaFX & SWT 21
xYurisha ActionListener Methoden Buttons zuweisen! AWT, Swing, JavaFX & SWT 16
I JAVAFX - CSS - automatische Property- und Methoden-Vorlagen in Eclipse AWT, Swing, JavaFX & SWT 17
P X extends TreeView - eigene Methoden AWT, Swing, JavaFX & SWT 5
D JavaFX Java Methoden mit JavaFX Methode kommunizieren lassen? AWT, Swing, JavaFX & SWT 3
J JavaFX Mehrfache Benutzung von Methoden einer Klasse AWT, Swing, JavaFX & SWT 17
M ActionListener und mathematische Methoden AWT, Swing, JavaFX & SWT 13
S 2 Paint-Methoden in einer Klasse ? AWT, Swing, JavaFX & SWT 2
M Swing Vorgehen beim Aufruf der Klassen/Methoden AWT, Swing, JavaFX & SWT 7
L Rekursive Methoden -> Error: StackOverFlow AWT, Swing, JavaFX & SWT 2
J zwei Paint methoden in einer Klasse AWT, Swing, JavaFX & SWT 3
S 2 paint-Methoden in einer Klasse ? AWT, Swing, JavaFX & SWT 2
K Stundenplan, Kalender Methoden AWT, Swing, JavaFX & SWT 2
P Actionlistener - 3 klassen - kompliziert - auf methoden zugreifen AWT, Swing, JavaFX & SWT 3
B Ablauf der paint-Methoden von JComponents AWT, Swing, JavaFX & SWT 20
B Zu welchem Zeitpunkt sind Methoden anwendbar AWT, Swing, JavaFX & SWT 3
F JPanel mit zwei Methoden her beschreiben. AWT, Swing, JavaFX & SWT 8
B Eigene Methoden in TABs einfügen AWT, Swing, JavaFX & SWT 8
F Initialisieren von Fenstern über Methoden AWT, Swing, JavaFX & SWT 3
R eigene Methoden für Buttons? AWT, Swing, JavaFX & SWT 11
M Alle Frame Methoden AWT, Swing, JavaFX & SWT 2
B Bedeutung der Methoden von Klasse WindowListener AWT, Swing, JavaFX & SWT 4
J eclipse/Visual Editor: Auf Felder/Methoden vom Hauptframe zugreifen AWT, Swing, JavaFX & SWT 4
S paint() in anderen Methoden AWT, Swing, JavaFX & SWT 5
G Großbuchstaben abfragen mit Keycode Methoden AWT, Swing, JavaFX & SWT 5
A TreeNode abgeleitet -> Wie komme ich an meine Methoden? AWT, Swing, JavaFX & SWT 2
S Methoden implementieren AWT, Swing, JavaFX & SWT 7
P add Methoden bei Swing AWT, Swing, JavaFX & SWT 2
M Zugriff auf Methoden aus einem ActionListener AWT, Swing, JavaFX & SWT 2
B fire methoden auch bei defaultTableModel? AWT, Swing, JavaFX & SWT 5
G Probleme mit static Methoden in JFrame/JDialog AWT, Swing, JavaFX & SWT 7
G jcombo-box getters und setters methoden AWT, Swing, JavaFX & SWT 5
G Grafik auf mehrere Methoden/Klassen zerlegen AWT, Swing, JavaFX & SWT 2
J JTree/TreeModel add/delete Methoden AWT, Swing, JavaFX & SWT 2
S Methoden return wert? AWT, Swing, JavaFX & SWT 7
N JDK1.4- Überladen d. Methoden getValue setValue von JSpinner AWT, Swing, JavaFX & SWT 2
J instanceof von einem Interface und aufrufen der Methoden AWT, Swing, JavaFX & SWT 5
G Grafik auf JComponent ohne Überschreiben von Paint-Methoden AWT, Swing, JavaFX & SWT 4
G ActionListener und Methoden-Aufruf aus anderen Klassen AWT, Swing, JavaFX & SWT 3
B ActionListener und Statische Methoden AWT, Swing, JavaFX & SWT 3
D Methoden zentral in einer Datei ablegen AWT, Swing, JavaFX & SWT 2
G zeitkontrollierte Methoden ??? AWT, Swing, JavaFX & SWT 6
M methoden.... AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben