Archiv für Dezember, 2010

Datei überschreiben durch JFileChooser nur über Bestätigung

Posted in Programmierung on 3. Dezember 2010 by redxorange

Möchte man in einer Java-Applikation eine Datei speichern, so bietet sich dafür der JFileChooser an. Für den Anwender kann es jedoch ein wenig ärgerlich werden, wenn er eine falsche Datei zum Überschreiben ausgewählt hat oder einen Dateinamen eingegeben hat, der in dem Ordner bereits existiert, denn: Die Datei wird direkt überschrieben.

Also möchte man einen Dialog anzeigen lassen, der um die Bestätigung des Anwenders bittet. Dafür bietet sich JOptionPane.showConfirmDialog() gut an.

JFileChooser fileChooser = new JFileChooser();
if (fileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION)
	if (JOptionPane.showConfirmDialog(this, fileChooser.getSelectedFile().getName() + " ist bereits vorhanden." +
		System.getProperty("line.separator") + "Möchten Sie sie ersetzen?", "Speichern bestätigen",
		JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION)
		//speichern

[paste]

Und wenn der Anwender sich nun umentscheidet und „Nein“ wählt? Der JFileChooser muss nun neu geöffnet werden, weil er sich durch das Klicken auf „Speichern“ schließt.
Das erste Problem ließe sich durch eine Schleife lösen. Dies behebt jedoch nicht das zweite Problem: Klickt man auf „Speichern“, so schließt sich der JFileChooser und dann öffnet sich der Dialog. Erst beim Klick auf „Nein“ öffnet sich der JFileChooser wieder. Nicht gerade ein natürliches Verhalten (und unschön ist es allemal).

Für dieses Dilemma gibt es jedoch eine einfache Lösung. JFileChooser’s approveSelection() muss überschrieben werden. Dies lässt sich schnell in einer anonymen Klasse erledigen.

JFileChooser fileChooser = new JFileChooser() {
	@Override
	public void approveSelection() {
		File file = getSelectedFile();
		if (file.exists()) {
			if (JOptionPane.showConfirmDialog(this, file.getName() + " ist bereits vorhanden." +
					System.getProperty("line.separator") + "Möchten Sie sie ersetzen?", "Speichern bestätigen",
					JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION)
				super.approveSelection();
		} else super.approveSelection();
	}
};
if (fileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION)
	//speichern

[paste]

Wird nun auf „Speichern“ geklickt, so schließt sich der JFileChooser nicht, sondern es wird nur der Dialog geöffnet. Beim Klick auf „Nein“ schließt sich dieser einfach wieder, der JFileChooser bleibt jedoch sichtbar. Wird jedoch auf „Ja“ geklickt, so wird die ursprüngliche Methode von approveSelection() aufgerufen (JFileChooser wird unsichtbar gemacht und das ActionEvent JFileChooser.APPROVE_SELECTION wird gefeuert).

Das gewünschte Verhalten ist erreicht – ein weiterer Tag gerettet! 🙂

Advertisements