我是一个有用的助手,可以翻译文本。
我正在使用Eclipse IDE,并尝试从另一个方法中调用
主要代码如下:
所有在调用
在执行了
但是对话框从未打开,并且从未显示“我现在在这里”。为什么会这样?此外,当我键入
new JFileChooser().showSaveDialog(null)
时,它可以正常显示,但在我的save()方法中却不能。有任何想法吗?
编辑:
以下是一个简化的程序,具有相同的问题:
“如果您想进一步检查,可以自行运行此操作。
这个最小化可复现代码示例可能足以重现问题,似乎使用System.in初始化的Scanner干扰了JFileChooser显示“打开文件”对话框的能力,即使确保文件选择器在Swing事件线程上运行。”
我正在使用Eclipse IDE,并尝试从另一个方法中调用
showSaveDialog(null)
,该方法反过来又从main方法调用,但当我调用它时没有任何反应。主要代码如下:
public static void main(String[] args) {
Main main = new Main();
main.pt = main.new PlayThread();
main.generateSound(getSamples(2), 500);
main.play(main.sound, 1);
if(new Scanner(System.in).nextLine().equals("save")){
System.out.println(main.save());
}
}
所有在调用
main.save()
之前的代码都可以正常运行,而main.save()
的开始如下:public boolean save(){
System.out.println("Calling save");
try{
String saveName = getSaveTo("C:/");
System.out.println("I'm here now");
而 getSaveTo()
看起来像这样:
public String getSaveTo(String def){
JFileChooser chooser = new JFileChooser();
System.out.println("Save called");
//chooser.setCurrentDirectory(new File(def));
int resp = chooser.showSaveDialog(null);
if(resp == JFileChooser.APPROVE_OPTION){
return chooser.getSelectedFile() + ".wav";
}else return null;
}
在执行了
main
中的前几个函数后,我输入了“save”,控制台打印出:Calling save
Save called
但是对话框从未打开,并且从未显示“我现在在这里”。为什么会这样?此外,当我键入
new JFileChooser().showSaveDialog(null)
时,它可以正常显示,但在我的save()方法中却不能。有任何想法吗?
编辑:
以下是一个简化的程序,具有相同的问题:
package com.funguscow;
import java.util.Scanner;
import javax.swing.JFileChooser;
import com.funguscow.Main.PlayThread;
public class Test {
public static void main(String[] args) {
Test main = new Test();
Scanner scan = new Scanner(System.in);
boolean should = scan.nextLine().equals("save");
scan.close();
if(should){
System.out.println(main.save());
}
}
public String getSaveTo(String def){
JFileChooser chooser = new JFileChooser();
System.out.println("Save called");
//chooser.setCurrentDirectory(new File(def));
int resp = chooser.showSaveDialog(null);
System.out.println("Save called");
if(resp == JFileChooser.APPROVE_OPTION){
return chooser.getSelectedFile() + ".wav";
}else return null;
}
public boolean save(){
System.out.println("Calling save");
try{
String saveName = getSaveTo("C:/");
System.out.println("I'm here now");
if(saveName == null)return false;
}catch(Exception e){}
return false;
}
}
“如果您想进一步检查,可以自行运行此操作。
这个最小化可复现代码示例可能足以重现问题,似乎使用System.in初始化的Scanner干扰了JFileChooser显示“打开文件”对话框的能力,即使确保文件选择器在Swing事件线程上运行。”
import java.util.Scanner;
import javax.swing.JFileChooser;
import javax.swing.SwingUtilities;
public class Test3 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("Enter something and press Enter: ");
scan.nextLine();
scan.close();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFileChooser fileChooser = new JFileChooser();
int result = fileChooser.showOpenDialog(null);
}
});
// JFileChooser fileChooser = new JFileChooser();
// int result = fileChooser.showOpenDialog(null);
}
}
System.in
与Scanner,然后关闭了Scanner,接着创建并显示了一个 JFileChooser,但是后者被设置为在 Swing 事件分派线程上运行。 - Hovercraft Full Of Eels