Omet navegació

6.2.- JFileChooser

El component JFileChooser és capaç d'obrir un diàleg per a poder seleccionar un fitxer permetent navegar pel sistema de fitxers. Té dues variants: showOpenDialog i showSaveDialog, amb alguna diferència que ara comentarem.

showOpenDialog()

És un mètode de JFileChooser que obre un diàleg per a seleccionar un fitxer. Posteriorment:

  • El fitxer seleccionat l'obtindrem amb getSelectedFile(), que torna directament el file.
  • El mètode retorna un valor dient si s'ha seleccionat o no un fitxer (podria haver-se cancel·lat o tancat el diàleg). Aquest valor el podem comparar amb la constant JFileChooser.APPROVE_OPTION

El següent codi tan senzill ens permet seleccionar un fitxer, i traure el seu nom. Com veieu es fa l'acció quan s'apreta el botó utilitzat en exemples anteriors:

		boto1.addActionListener {
			val fc = JFileChooser()
			val r = fc.showOpenDialog(this)
			if (r == JFileChooser.APPROVE_OPTION) {
				println("Fitxer seleccionat: " + fc.getSelectedFile().getName());
			} else
				println("No s'ha seleccionat res");
		}

Comodíssim, però encara el podem fer més còmode. Si observeu, quan apreteu el botó, se situa en el directori principal de l'usuari. Podem navegar pel sistema de fitxers i seleccionar un determinat fitxer. Però si tornem a apretar el botó, torna a situar-se al directori principal de l'usuari. Això és perquè si no ho especifiquem, se situa en aquest directori cada vegada que es cree un objecte de la classe JFileChooser. I ara estem creant un nou objectecada vegada que apretem.

Anem a evitar crear un objecte cada vegada. Si ens definim l'objecte JFileChooser com una variable que es puga accedir tota l'estona, d'una vegada a l'altra podrem mantenir el fitxer seleccionat. Així doncs, en el següent exemple, si anem navegant per a seleccionar un determinat fitxer, i si apretem el botó una altra vegada per a navegar, mantindrà el subdirectori seleccionat la primera vegada, ja que el JFileChooser és el mateix i no s'ha definit una altra vegada. Fins i tot mantindrà el fitxer seleccionat la primera vegada, cosa que és molt útil en moltes ocasions.

class Finestra : JFrame() {
	val boto1 = JButton("Botó 1")
	val fc = JFileChooser()

	init {
		defaultCloseOperation = JFrame.EXIT_ON_CLOSE
		setTitle("Exemple de JDialog")
		setSize(400, 300)
		setLocationRelativeTo(null)
		setLayout(GridLayout(2, 1))
		val panell1 = JPanel(FlowLayout())
		val panell2 = JPanel(FlowLayout())
		add(panell1)
		add(panell2)

		panell1.add(JLabel("Programa principal. Per anar al diàleg apreta el botó"))
		panell2.add(boto1)

		boto1.addActionListener {
			val r = fc.showOpenDialog(this)
			if (r == JFileChooser.APPROVE_OPTION) {
				println("Fitxer seleccionat: " + fc.getSelectedFile().getName());
			} else
				println("No s'ha seleccionat res");
		}
	}
}

showSaveDialog()

És un diàleg idèntic a l'anterior, excepte que el títol de la finestra de diàleg i el botó principal diran Guardar en compte d'Obrir.

Recordeu que aquestos dos procediments no obren ni guarden el fitxer, únicament el seleccionen.