La clase JFileChooser (Requiere importar javax.swing.JFileChooser) permite abrir una ventana de diálogo en la que el usuario pueda seleccionar un archivo para realizar una acción sobre él (por ejemplo, abrirlo).

JFileChooser fc = new JFileChooser();
//Mostrar la ventana para abrir archivo y recoger la respuesta
//En el parámetro del showOpenDialog se indica la ventana
//  al que estará asociado. Con el valor this se asocia a la
//  ventana que la abre.
int respuesta = fc.showOpenDialog(this);
//Comprobar si se ha pulsado Aceptar
if (respuesta == JFileChooser.APPROVE_OPTION) {
    //Crear un objeto File con el archivo elegido
    File archivoElegido = fc.getSelectedFile();
    //Mostrar el nombre del archvivo en un campo de texto
    System.out.println("Archivo elegido: " + archivoElegido.getName());
}

Si en vez de utilizar la ventana de diálogo para abrir un archivo se desea utilizar la ventana para guardar un archivo se debe utilizar el método showSaveDialog en vez de showOpenDialog.

int respuesta = fc.showSaveDialog(this);

Para seleccionar directorios en vez de archivos hay que utilizar el siguiente método antes de llamar a ShowOpenDialog o ShowSaveDialog:

fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

Es posible modificar el directorio que se muestra al abrir la ventana utilizando el método setCurrentDirectory al que se le debe pasar por parámetro un objeto File con la ruta del directorio.

//Cambiar al directorio Windows
fc.setCurrentDirectory(new File("c:/windows/"));
//O bien usando dos barras invertidas
fc.setCurrentDirectory(new File("c:\\windows\\")); 

Es posible establecer filtros para que sólo se muestren archivos con una determinada extensión. Por ejemplo, si se desea mostrar únicamente los archivos con extensión ".bmp" se puede utilizar:

FileNameExtensionFilter filter = new FileNameExtensionFilter("Imágenes BMP", "bmp");
fc.setFileFilter(filter);

En el ejempo anterior se crea un objeto de la clase "FileNameExtensionFilter" utilizando como primer parámetro el nombre que se desea mostrar en la ventana de selección, y el segundo parámetro es la extensión que se desea filtrar. Es posible hacer un filtro para más de una extensión indicando en el constructor todos los nombres de las extensiones, cada uno como un String, separados por comas. por ejemplo:

FileNameExtensionFilter filter = new FileNameExtensionFilter("Imágenes", "bmp", "gif", "jpg", "png");
JFileChooser fc = new JFileChooser(); 
fc.setFileFilter(filter);
// Mostrar la ventana para abrir archivo y recoger la respuesta
// En el parámetro del showOpenDialog se indica la ventana 
// al que estará asociado. Con el valor this se asocia a la 
// ventana que la abre. 
int respuesta = fc.showOpenDialog(this); 
//Comprobar si se ha pulsado Aceptar 
if (respuesta == JFileChooser.APPROVE_OPTION) { 
    //Crear un objeto File con el archivo elegido. 
    File archivoElegido = fc.getSelectedFile(); 
    //Mostrar el nombre del archvivo en un campo de texto 
    System.out.println("Archivo elegido: " + archivoElegido.getName()); 
}