我试图在我的LibGDX scene2d项目中使用Javas scene2d,但是一旦启动JFileChooser,我的程序就会冻结。
下面是我用来启动文件选择器的代码:
private String getPath(){
String path = "";
fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnVal = fc.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
file = fc.getSelectedFile();
try {
path = file.getAbsolutePath();
} catch (Exception ex) {
System.out.println("problem accessing file" + file.getAbsolutePath() + "\n" + ex.getMessage());
}
} else {
System.out.println("File access cancelled by user.");
}
return path;
}是swing和libgdx可弥补性问题,还是我缺少了什么?同样的代码可以很好地工作在nativa java项目中。除了:fc.showOpenDialog(null);之外,我使用:fc.showOpenDialog(button); //按钮是触发事件的JButton。
知道我做错什么了吗?
编辑:我并不介意它在除之外的其他平台上不起作用。
但是,如果我选择使用跨平台解决方案,并使用LibGDX的方法,我是否必须自己创建带有UI的文件选择器类呢?
发布于 2013-10-23 07:01:43
好的,基于您从上面的答案中得到的评论,我感觉到您要做的是在您的LibGDX游戏窗口中调用一个swing窗口,这是一个打开的GL渲染场景。
让我在那里阻止你。swing工具箱调用它自己的呈现引擎,因为它根本不打算用于这个目的--它是为桌面应用程序设计的。因此,当您实例化对话时,所有其他oracle内容都会被实例化,比如Graphics2D类。您不能仅仅将这个类添加到scene2D阶段并期望它绘制。它们不实现相同的接口或继承相同的基类。您的Graphics2D实现的绘图(SomeClass图形)方法与SomeClass类实现的任何绘图(SomeClass foo)方法不一样。
因此,如果您想要创建一个文件选择器窗口,您需要开始查看libGDX小部件库。也许已经有人把一些东西组合在一起了,但是我下一个libGDX项目的方法是为我自己的UI库扩展这些类。我不知道您的项目是什么,也不知道您的时间线是什么样子,但这无疑是一种更好的方法,然后尝试调整swing工具包以在OpenGL呈现场景中呈现。
编辑
在快速阅读之后,我将进一步猜测swing工具箱的呈现方式完全取决于针对特定平台的JVM实现。这就是我的CS知识开始受到限制的地方,但我还要猜测,通过使用Java for C库,这与OpenGl的LWJGL实现有很大不同。
发布于 2017-03-27 09:50:01
就我个人而言,我不喜欢LibGDX中现有的LibGDX UI。因此,我创建了一个使用JFileChooser工作的解决方案。下面是一些快速而肮脏的代码:
new Thread(new Runnable() {
@Override
public void run() {
JFileChooser chooser = new JFileChooser();
JFrame f = new JFrame();
f.setVisible(true);
f.toFront();
f.setVisible(false);
int res = chooser.showSaveDialog(f);
f.dispose();
if (res == JFileChooser.APPROVE_OPTION) {
//Do some stuff
}
}
}).start();这将在不阻塞主线程的情况下在FileChooser窗口前面打开LibGDX。刚刚在Windows 7,8,10上测试过,它只在窗口模式ofc中工作。
发布于 2017-07-06 20:57:16
来晚了,但如果问题的重点是援引“本地人”,即。来自libgdx项目的非gdx文件选择器我在这里创建了一个库:https://github.com/spookygames/gdx-nativefilechooser。
来自自述的示例:
// Configure
NativeFileChooserConfiguration conf = new NativeFileChooserConfiguration();
// Starting from user's dir
conf.directory = Gdx.files.absolute(System.getProperty("user.home"));
// Filter out all files which do not have the .ogg extension and are not of an audio MIME type - belt and braces
conf.mimeFilter = "audio/*";
conf.nameFilter = new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith("ogg");
}
};
// Add a nice title
conf.title = "Choose audio file";
fileChooser.chooseFile(conf, new NativeFileChooserCallback() {
@Override
public void onFileChosen(FileHandle file) {
// Do stuff with file, yay!
}
@Override
public void onCancellation() {
// Warn user how rude it can be to cancel developer's effort
}
@Override
public void onError(Exception exception) {
// Handle error (hint: use exception type)
}
});在桌面上,这个示例当前将启动一个AWT FileDialog (不完全是询问的内容),但是Swing版本目前在主分支上,应该合并到库的下一个版本中。
https://stackoverflow.com/questions/19479877
复制相似问题