Guten Morgen Forengemeinde,
ich habe ein Problem mit einer JavaFX Editor Anwendung. Die Anwendung ist Teil eines Kurses gewesen, bei dem die Funktionen Öffnen/Speichern/Laden per Code vorgegeben waren und zu dem nun noch die Funktionen Cut/Copy und Paste ergänzt werden sollten. Den vollständigen Code (zunächst ohne Kommentierung der zusätzlichen Funktionen findet ihr unten.
Die Methoden Cut/Copy und Paste werden aus der Klasse TextArea genutzt. Das funktioniert auch soweit. Allerdings wird beim Starten des Programms wenn ich die Cut erstmalig aufrufe, das gewünschte zwar ausgeschnitten, allerdings beim Einfügen wird etwas aus der vorherigen Zwischenablage eingefügt... beim nochmaligen nutzen der Cut Funktion funktioniert es wie gewollt. Ich denke man müsste beim Aufruf des Programms vermutlich die Zwischenablage leeren. Aber wie mach ich das? oder liegt der Fehler möglicherweise ganz woanders?
hier der Code:
[CODE lang="java" title="FXML Controller"]package texteditor;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.TextArea;
import javafx.stage.FileChooser;
import javafx.stage.FileChooser.ExtensionFilter;
import javafx.stage.Stage;
public class FXMLControllerTest {
@FXML private TextArea editor ;
private Stage meineStage;
//die Methode zum Beenden
@FXML protected void beendenKlick(ActionEvent event) {
Platform.exit();
}
@FXML protected void ladenKlick(ActionEvent event) {
FileChooser oeffnenDialog = new FileChooser();
//oeffnenDialog.setInitialDirectory(new File(System.getProperty("user.home")));
//den Titel für den Dialog setzen
oeffnenDialog.setTitle("Datei öffnen");
//den Filter setzen
oeffnenDialog.getExtensionFilters().add(new ExtensionFilter("Textdateien", "*.txt"));
//den oeffnenDialog anzeigen und das Ergebnis beschaffen
File datei = oeffnenDialog.showOpenDialog(meineStage);
//wurde eine Datei ausgewählt
if (datei !=null)
//dann den Inhalt der Datei über eine eigene Methode lesen
editor.setText(datenLesen(datei));
}
@FXML protected void neuKlick(ActionEvent event) {
Alert meinDialog = new Alert (AlertType.INFORMATION, "Die Daten werden gelöscht");
meinDialog.setHeaderText("Bitte beachten");
meinDialog.showAndWait();
editor.clear();
}
//die Methode zum Laden der sie enthält die Datei die geladen werden soll
//und liefert eine Zeichenkette mit dem Inhalt zurück
private String datenLesen(File dateiLesen) {
//gelesen wird als INT!
int zeichen = 0;
StringBuilder text = new StringBuilder();
//eine Instanz mider Klasse FileReader mit der Datei erzeugen
try(FileReader tempDatei = new FileReader(dateiLesen)) {
//solange das Ende der Datei nicht erreicht ist, werden die
//Zeichen einzeln gelesen und in einem StringBuilder angehängt
zeichen = tempDatei.read();
while (zeichen !=-1) {
//zeichen werden in den Typ char umgewandelt
text.append((char)zeichen);
zeichen=tempDatei.read();
}
}
catch (IOException e) {
System.out.println("Beim Laden ist ein Problem aufgetreten");
}
return (text.toString());
}
//die Methode zum Anzeigen des Speicherndialogs
@FXML protected void speichernKlick (ActionEvent event) {
//eine neue Instanz der Klasse FileChooser erzeugen
FileChooser speichernDialog = new FileChooser();
//den Titel für den Dialog setzen
speichernDialog.setTitle("Datei speichern");
//den Filter setzen
speichernDialog.getExtensionFilters().addAll(new ExtensionFilter("Textdateien", "*.txt"));
//den Speichern Dialog anzeigen und das Ergebnis beschaffen
File datei = speichernDialog.showSaveDialog(meineStage);
//wurde eine Datei ausgewählt
if (datei!=null)
//dann den Inhalt über eine eigene Methode speichern
datenSchreiben(datei);
}
//die Methode zum schreiben
//sie enthält die Datei die geschrieben werden soll
private void datenSchreiben (File dateiSchreiben) {
//eine Instanz der Klasse FileWriter mit der Datei erzeugen
try (FileWriter tempDatei =new FileWriter (dateiSchreiben)) {
//der Inhalt des Textfeldes wird direkt in die Datei geschrieben
tempDatei.write(editor.getText());
}
catch (IOException e) {
System.out.println("Beim Schreiben ist ein Problem aufgetreten");
}
}
@FXML protected void ausschneidenKlick (ActionEvent e) {
editor.cut();
}
@FXML protected void kopierenKlick (ActionEvent e) {
editor.copy();
}
@FXML protected void einfügenKlick (ActionEvent e) {
editor.paste();
}
public void setMeineStage(Stage meineStage) {
this.meineStage = meineStage;
}
}
[/CODE]
und Launch des Programms:
[CODE lang="java" title="Launch"]package texteditor;
//Einsendeaufgabe 3
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class TextEditorLaunch extends Application{
@Override
public void start(Stage meineStage) throws Exception {
//eine Instanz von FXMLLoader erzeugen
FXMLLoader meinLoader = new FXMLLoader(getClass().getResource("TextEditor.fxml"));
//die Datei laden
Parent root = meinLoader.load();
//den Controller beschaffen
FXMLControllerTest meinController = meinLoader.getController();
//und die Bühne übergeben
meinController.setMeineStage(meineStage);
//die Szene erzeugen
//an den Konstruktor werden der oberste Knoten und die Größe übergeben
Scene meineScene = new Scene(root, 400, 400);
//den Titel über stage setzen
meineStage.setTitle("Editor");
//die Szene setzen
meineStage.setScene(meineScene);
//im Vollbild darstellen
meineStage.setMaximized(true);
//und anzeigen
meineStage.show();
}
public static void main(String[] args) {
//der Start
launch(args);
}
}
[/CODE]
ich habe ein Problem mit einer JavaFX Editor Anwendung. Die Anwendung ist Teil eines Kurses gewesen, bei dem die Funktionen Öffnen/Speichern/Laden per Code vorgegeben waren und zu dem nun noch die Funktionen Cut/Copy und Paste ergänzt werden sollten. Den vollständigen Code (zunächst ohne Kommentierung der zusätzlichen Funktionen findet ihr unten.
Die Methoden Cut/Copy und Paste werden aus der Klasse TextArea genutzt. Das funktioniert auch soweit. Allerdings wird beim Starten des Programms wenn ich die Cut erstmalig aufrufe, das gewünschte zwar ausgeschnitten, allerdings beim Einfügen wird etwas aus der vorherigen Zwischenablage eingefügt... beim nochmaligen nutzen der Cut Funktion funktioniert es wie gewollt. Ich denke man müsste beim Aufruf des Programms vermutlich die Zwischenablage leeren. Aber wie mach ich das? oder liegt der Fehler möglicherweise ganz woanders?
hier der Code:
[CODE lang="java" title="FXML Controller"]package texteditor;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.TextArea;
import javafx.stage.FileChooser;
import javafx.stage.FileChooser.ExtensionFilter;
import javafx.stage.Stage;
public class FXMLControllerTest {
@FXML private TextArea editor ;
private Stage meineStage;
//die Methode zum Beenden
@FXML protected void beendenKlick(ActionEvent event) {
Platform.exit();
}
@FXML protected void ladenKlick(ActionEvent event) {
FileChooser oeffnenDialog = new FileChooser();
//oeffnenDialog.setInitialDirectory(new File(System.getProperty("user.home")));
//den Titel für den Dialog setzen
oeffnenDialog.setTitle("Datei öffnen");
//den Filter setzen
oeffnenDialog.getExtensionFilters().add(new ExtensionFilter("Textdateien", "*.txt"));
//den oeffnenDialog anzeigen und das Ergebnis beschaffen
File datei = oeffnenDialog.showOpenDialog(meineStage);
//wurde eine Datei ausgewählt
if (datei !=null)
//dann den Inhalt der Datei über eine eigene Methode lesen
editor.setText(datenLesen(datei));
}
@FXML protected void neuKlick(ActionEvent event) {
Alert meinDialog = new Alert (AlertType.INFORMATION, "Die Daten werden gelöscht");
meinDialog.setHeaderText("Bitte beachten");
meinDialog.showAndWait();
editor.clear();
}
//die Methode zum Laden der sie enthält die Datei die geladen werden soll
//und liefert eine Zeichenkette mit dem Inhalt zurück
private String datenLesen(File dateiLesen) {
//gelesen wird als INT!
int zeichen = 0;
StringBuilder text = new StringBuilder();
//eine Instanz mider Klasse FileReader mit der Datei erzeugen
try(FileReader tempDatei = new FileReader(dateiLesen)) {
//solange das Ende der Datei nicht erreicht ist, werden die
//Zeichen einzeln gelesen und in einem StringBuilder angehängt
zeichen = tempDatei.read();
while (zeichen !=-1) {
//zeichen werden in den Typ char umgewandelt
text.append((char)zeichen);
zeichen=tempDatei.read();
}
}
catch (IOException e) {
System.out.println("Beim Laden ist ein Problem aufgetreten");
}
return (text.toString());
}
//die Methode zum Anzeigen des Speicherndialogs
@FXML protected void speichernKlick (ActionEvent event) {
//eine neue Instanz der Klasse FileChooser erzeugen
FileChooser speichernDialog = new FileChooser();
//den Titel für den Dialog setzen
speichernDialog.setTitle("Datei speichern");
//den Filter setzen
speichernDialog.getExtensionFilters().addAll(new ExtensionFilter("Textdateien", "*.txt"));
//den Speichern Dialog anzeigen und das Ergebnis beschaffen
File datei = speichernDialog.showSaveDialog(meineStage);
//wurde eine Datei ausgewählt
if (datei!=null)
//dann den Inhalt über eine eigene Methode speichern
datenSchreiben(datei);
}
//die Methode zum schreiben
//sie enthält die Datei die geschrieben werden soll
private void datenSchreiben (File dateiSchreiben) {
//eine Instanz der Klasse FileWriter mit der Datei erzeugen
try (FileWriter tempDatei =new FileWriter (dateiSchreiben)) {
//der Inhalt des Textfeldes wird direkt in die Datei geschrieben
tempDatei.write(editor.getText());
}
catch (IOException e) {
System.out.println("Beim Schreiben ist ein Problem aufgetreten");
}
}
@FXML protected void ausschneidenKlick (ActionEvent e) {
editor.cut();
}
@FXML protected void kopierenKlick (ActionEvent e) {
editor.copy();
}
@FXML protected void einfügenKlick (ActionEvent e) {
editor.paste();
}
public void setMeineStage(Stage meineStage) {
this.meineStage = meineStage;
}
}
[/CODE]
und Launch des Programms:
[CODE lang="java" title="Launch"]package texteditor;
//Einsendeaufgabe 3
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class TextEditorLaunch extends Application{
@Override
public void start(Stage meineStage) throws Exception {
//eine Instanz von FXMLLoader erzeugen
FXMLLoader meinLoader = new FXMLLoader(getClass().getResource("TextEditor.fxml"));
//die Datei laden
Parent root = meinLoader.load();
//den Controller beschaffen
FXMLControllerTest meinController = meinLoader.getController();
//und die Bühne übergeben
meinController.setMeineStage(meineStage);
//die Szene erzeugen
//an den Konstruktor werden der oberste Knoten und die Größe übergeben
Scene meineScene = new Scene(root, 400, 400);
//den Titel über stage setzen
meineStage.setTitle("Editor");
//die Szene setzen
meineStage.setScene(meineScene);
//im Vollbild darstellen
meineStage.setMaximized(true);
//und anzeigen
meineStage.show();
}
public static void main(String[] args) {
//der Start
launch(args);
}
}
[/CODE]