How do you stop this behavior in JFileChooser?

I got to try this new GIF video player. Never saw this before when I returned 4 days ago.

When I double-click on a file or a folder, the text field pointed out by the red rectangle will be filled in with the full absolute path to that file/directory. I would like to remove that behavior.

This is my attempt:


JFileChooser opener = new JFileChooser();
opener.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
opener.setCurrentDirectory(FileControl.lastSavedDirectory);
opener.setFileFilter(new FileNameExtensionFilter("PNG files", "png"));
opener.addPropertyChangeListener(new PropertyChangeListener(){
	public void propertyChange(PropertyChangeEvent event){
		if (JFileChooser.SELECTED_FILE_CHANGED_PROPERTY.equals(event.getPropertyName())){
			JFileChooser chooser = (JFileChooser) event.getSource();
			File selectedFile = chooser.getSelectedFile();
			MetalFileChooserUI chooserUI = (MetalFileChooserUI) chooser.getUI();
			if (selectedFile != null && chooserUI instanceof BasicFileChooserUI){
				chooserUI.setFileName(selectedFile.getName());
			}
		}
	}
});
opener.setVisible(true);

It works when I click on a file or directory folder 1 mouse button click at a time, but when I double-click it, the issue remains unsolved. Can anyone help me fix this?

Okay, I figured it out. I got myself a clue to fix this, thanks to this post here.

First, you need to have a method capable of returning a JList full of all Components in JFileChooser:


@SuppressWarnings("unchecked")
private JList<Class<?>> findFileList(Component comp){
	if (comp instanceof JList){
		return (JList<Class<?>>) comp;
	}
	if (comp instanceof Container){
		for (Component c : ((Container) comp).getComponents()){
			JList<Class<?>> list = findFileList(c);
			if (list != null){
				return list;
			}
		}
	}
	return null;
}

Next, you can then remove all MouseListeners, including MouseListeners associated with double-clicks. Unfortunately, this will also remove the ability to double-click on files you actually want to open. I added back in a custom MouseListener that you can use to handle those scenarios.


final JFileChooser opener = new JFileChooser();
JList<Class<?>> list = findFileList(opener);
LOOP_TEMP1: for (MouseListener l : list.getMouseListeners()){
	if (l.getClass().getName().indexOf("FilePane") >= 0){
		list.removeMouseListener(l);
		list.addMouseListener(new MouseListener(){
			@Override
			public void mouseClicked(MouseEvent e) {
				if (e.getClickCount() == 1){
					File file = opener.getSelectedFile();
					if (file != null){
						MetalFileChooserUI ui = (MetalFileChooserUI) opener.getUI();
						ui.setFileName(file.getName());
					}
				}
				else if (e.getClickCount() == 2){
					File file = opener.getSelectedFile();
					if (file != null){
						if (file.isDirectory()){
							opener.setCurrentDirectory(file);
						}
						else if (file.isFile()){
							opener.setSelectedFile(file);
						}
						BasicFileChooserUI ui = (BasicFileChooserUI) opener.getUI();
						ui.setFileName(file.getName());	
					}
				}
			}
			@Override
			public void mouseEntered(MouseEvent e) {
			}
			@Override
			public void mouseExited(MouseEvent e) {
			}
			@Override
			public void mousePressed(MouseEvent e) {
			}
			@Override
			public void mouseReleased(MouseEvent e) {
			}
		});
		break LOOP_TEMP1;
	}
}


That fixes the issue. Now, the user has to press the “Open” or “Save” button, depending on what dialog was shown by JFileChooser, and it’s all good to go.