JFileChooser из программы командной строки и появляется под всеми окнами
Ive реализовал jFileChooser в моей программе командной строки, и он работает, как и должен, только с одной раздражающей проблемой. Кажется, что он открывается под каждым окном без какого-либо предупреждения. На самом деле я даже пропустил его пару раз, сначала заставив меня поверить, что я реализовал его неправильно.
я реализовал это следующим образом:
System.out.println("Please select the file");
JFileChooser fc = new JFileChooser();
int retValue = fc.showOpenDialog(new JPanel());
if(retValue == JFileChooser.APPROVE_OPTION){
g.inputFile = fc.getSelectedFile();
}else {
System.out.println("Next time select a file.");
System.exit(1);
}
по существу, я хочу только jFileChooser, чтобы пользователь выбрал файл в качестве входного файла. Это единственный компонент, который нуждается в реализации GUI, поэтому, если я могу избежать написания GUI, это было бы полезно.
3 ответов
поэтому, попробовав различные вещи из разных тем переполнения стека, я получил результат, который последовательно и надежно открывается над каждым окном в Windows 7.
public class ChooseFile {
private JFrame frame;
public ChooseFile() {
frame = new JFrame();
frame.setVisible(true);
BringToFront();
}
public File getFile() {
JFileChooser fc = new JFileChooser();
if(JFileChooser.APPROVE_OPTION == fc.showOpenDialog(null)){
frame.setVisible(false);
return fc.getSelectedFile();
}else {
System.out.println("Next time select a file.");
System.exit(1);
}
return null;
}
private void BringToFront() {
frame.setExtendedState(JFrame.ICONIFIED);
frame.setExtendedState(JFrame.NORMAL);
}
}
как он стоит в моей программе, это внутренний класс и вызывается вызовом:
System.out.println("Please select the file");
g.inputFile = g.new ChooseFile().getFile();
Я думаю о двух возможных причинах чего-то подобного:
- вы пытаетесь смешать AWT и Swing GUI в одной программе, или
- вы пытаетесь смешать консольную программу (т. е. использовать систему.из.метод println(...) и получение ввода через объект сканера) с помощью Swing GUI.
Если вы делаете любую из этих двух вещей, то вы должны упростить и сделать это только программой типа Swing GUI. Если эта информация не помогает, то вы можете пожелать дать нам больше информации о вашей проблеме.
изменить 1
Я только что заметил детали твоего кода. Новая часть JPanel () ниже является проблемой:
int retValue = fc.showOpenDialog(new JPanel());
чтобы JFileChooser действовал как в окно верхнего уровня (которое в настоящее время не выполняется и является вашей главной проблемой) вы должны вместо этого передать компонент, который находится в Родительском окне верхнего уровня, например JPanel или JButton, который удерживается внутри вашего JFrame или JApplet.
Изменить 2
Хорошо, вы пытаетесь смешать консольную программу Java с программой Swing GUI, которая похожа на поедание мороженого с солеными огурцами - они просто не идут хорошо вместе. Нет окна верхнего уровня, чтобы предложить методу showOpenDialog JFileChooser, чтобы он действовал как истинный диалог.
лучшее решение-не делать этого, а вместо этого переписать приложение, чтобы быть полным GUI Swing.
в моем коде, я могу просто использовать null и это работает. Я использую Java 7 в Windows 7.
JFileChooser chooser = new JFileChooser(System.getProperty("java.class.path"));
FileNameExtensionFilter filter = new FileNameExtensionFilter("CSV files", "csv");
chooser.setFileFilter(filter);
int returnVal = chooser.showOpenDialog(null);
if(returnVal == JFileChooser.APPROVE_OPTION) {
try {
Scanner inputFile= new Scanner(new File(chooser.getSelectedFile().getAbsolutePath()));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}