gpt4 book ai didi

java - OS X + Java + 初始图像 + fileDialog : no files in dialog file open

转载 作者:行者123 更新时间:2023-11-29 08:52:20 25 4
gpt4 key购买 nike

当我创建并运行带有启动画面的可运行 Java 应用程序 (JAR) 时,当激活“打开文件”对话框时,对话框中未加载任何文件。搜索轮一直在转动,没有任何反应。但是,当我省略启动图像(来自 Manifest.mf)文件时,“文件打开”对话框运行良好。在 Windows 上我也没有问题。只有在 OS X 上我有这个问题。在 10.8 和 10.9 上对其进行了测试。

顺便说一句,我故意使用较旧的 FileDialog 类而不是 JFileChooser,因为在 OS X 上,fileDialog 看起来更像原生 OS X。

顺便说一句,当我使用 AppBundler 创建 OS X 应用程序并将启动画面指定为时,同样的行为存在:

我创建了一个非常简单的测试程序来进行说明。

我错过了什么?谁能帮忙?这是错误吗?

1) 示例 Java 代码。

package fileDialog_Sample;

import java.awt.FileDialog;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.SwingUtilities;
import javax.swing.plaf.metal.MetalIconFactory;

public class TestSwing extends JFrame {

Frame frame = null;

public TestSwing() {

initUI();
frame = this;
}

private void initUI() {

JMenuBar menubar = new JMenuBar();
ImageIcon icon = new ImageIcon("exit.png");

JMenu file = new JMenu("File");
file.setMnemonic(KeyEvent.VK_F);

JMenuItem oMenuItem = new JMenuItem("Open", icon);
oMenuItem.setMnemonic(KeyEvent.VK_O);
oMenuItem.setToolTipText("Open file");
oMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
System.out.println("In File - Open");
openFileMenu();
}
});
file.add(oMenuItem);

JMenuItem eMenuItem = new JMenuItem("Exit", icon);
eMenuItem.setMnemonic(KeyEvent.VK_E);
eMenuItem.setToolTipText("Exit application");
eMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
System.exit(0);
}
});

file.add(eMenuItem);

menubar.add(file);

setJMenuBar(menubar);

String lcOSName = System.getProperty("os.name").toLowerCase();
Boolean IS_MAC = lcOSName.startsWith("mac os x");
Boolean IS_WINDOWS = lcOSName.startsWith("windows");

if (IS_MAC) {

// take the menu bar off the jframe
System.setProperty("apple.laf.useScreenMenuBar", "true");

// set the name of the application menu item
// System.setProperty("com.apple.mrj.application.apple.menu.about.name", translations.getString("application.title"));
System.setProperty("com.apple.mrj.application.apple.menu.about.name", "LightroomStatistics Viewer");
}


setTitle("Simple menu");
setSize(300, 200);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}

private static void openFileMenu() {
Frame frame = new Frame();
FileDialog fc;
fc = new FileDialog(frame, "Choose a file", FileDialog.LOAD);
fc.setDirectory(System.getProperty("user.home"));

fc.setVisible(true);
String fn = fc.getFile();
if (fn == null)
System.out.println("You cancelled the choice");
else
System.out.println("You chose " + fn);
}

public static void main(String[] args) {

try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TestSwing ex = new TestSwing();
ex.setVisible(true);
}
});
}
}

2) 没有为 Manifest.mf 文件设置启动画面的 build.xml 文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project default="create_run_jar" name="Create Runnable Jar for Project FileDialog_Sample with Jar-in-Jar Loader">
<!--ANT 1.7 is required -->
<target name="create_run_jar">
<jar destfile="D:/Temp/LRS_Viewer/FileDialog.jar">
<manifest>
<attribute name="Main-Class" value="fileDialog_Sample.TestSwing"/>
<attribute name="Class-Path" value="."/>
<attribute name="Rsrc-Class-Path" value="./"/>
</manifest>
<fileset dir="D:/Eclipse/FileDialog_Sample/bin"/>
</jar>
</target>
</project>

3) build_Splash.xml,相同的构建文件,但现在带有启动画面

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project default="create_run_jar" name="Create Runnable Jar for Project FileDialog_Sample with Jar-in-Jar Loader">
<!--ANT 1.7 is required -->
<target name="create_run_jar">
<jar destfile="D:/Temp/LRS_Viewer/FileDialog_Splash.jar">
<manifest>
<attribute name="Main-Class" value="fileDialog_Sample.TestSwing"/>
<attribute name="Class-Path" value="."/>
<attribute name="Rsrc-Class-Path" value="./"/>
<attribute name="SplashScreen-Image" value="splash.png"/>
</manifest>
<fileset dir="D:/Eclipse/FileDialog_Sample/bin"/>
</jar>
</target>
</project>

最后,splash.png 图片在Java 项目的resources 目录下。我用 Eclipse 构建它。

最佳答案

是的,这是一个错误

https://bugs.openjdk.java.net/browse/JDK-8009203

奇怪的是,他们推迟了对 JDK9 的修复,因为

It is unlikely that the client would notice the problem as it's quite unusual to open the FileChooser immediately after the application loads.

但是,您在加载后没有立即打开 FileDialog 时遇到了这个错误。在创建 FileDialog 之前,您可以在启动关闭后等待很长时间,它仍然会被破坏。

非常想解决这个问题,因为在 OSX 上没有工作的可再发行 jvm 可以在同一个应用程序中有一个 splash 和一个 FileDialog。

关于java - OS X + Java + 初始图像 + fileDialog : no files in dialog file open,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22154389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com