Re: Using JFileChooser from modal dialog
In article <c713853a-73c4-4bf3-9e9a-7abf98a52677@googlegroups.com>,
gosmith666@gmail.com wrote:
On Thursday, February 9, 2012 12:59:29 PM UTC-5, FredK wrote:
How do I pop up and use a JFileChooser from a modal dialog?
I find the methods setModalExclusionType and setModalityType,
but they are methods of Window and Dialog; when I pop the file
chooser using showDialog(), how do I get access to the window
or frame used to display it so that I can set its modality?
[...]
aFrame.setAlwaysOnTop(true);
[...]
This makes sure the File Chooser is Modal and AlwaysOnTop
I've addressed some issues with the fragment shown in the complete
example below:
- Rather than multiple frames, use a modeless dialog for the
chooser.
- Consider AbstractAction to encapsulate functionality.
- "Note: some platforms might not support always-on-top windows." [1]
- Swing GUI objects should be constructed and manipulated _only_ on
the event dispatch thread. [2]
- Instead of getAbsolutePath(), use the FileReader constructor that
accepts a file [not shown].
SSCCE:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.io.File;
import javax.swing.AbstractAction;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JTextArea;
public class Test {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Test().display();
}
});
}
private void display() {
JFileChooser chooser = new JFileChooser();
chooser.setDialogType(JFileChooser.OPEN_DIALOG);
chooser.setApproveButtonText("Select");
JTextArea text = new JTextArea(16, 40);
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationByPlatform(true);
f.add(text, BorderLayout.CENTER);
f.pack();
f.setVisible(true);
JDialog d = new JDialog();
d.add(chooser, BorderLayout.CENTER);
d.pack();
d.setLocationRelativeTo(null);
d.setAlwaysOnTop(true);
d.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
chooser.addActionListener(new SelectAction(chooser, text));
d.setVisible(true);
}
private static class SelectAction extends AbstractAction {
private JFileChooser chooser;
private JTextArea text;
public SelectAction(JFileChooser chooser, JTextArea text) {
this.chooser = chooser;
this.text = text;
}
@Override
public void actionPerformed(ActionEvent e) {
if ((e.getActionCommand())
.equals(JFileChooser.APPROVE_SELECTION)) {
File file = chooser.getSelectedFile();
text.append(file.getPath() + "\n");
}
}
}
}
[1] <http://docs.oracle.com/javase/7/docs/api/java/awt/Window.html>
[2] <http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html>
--
John B. Matthews
trashgod at gmail dot com
<http://sites.google.com/site/drjohnbmatthews>