我创建了一个简单的 Java 应用程序,该应用程序每秒连续 10 秒添加一个新行到JTable
. 它由三个类组成。
程序启动后调用的主类
public class JarBundlerProblem {
public static void main(String[] args)
{
System.err.println("Initializing controller");
new Controller();
}
}
一个创建 GUI 并通过它改变它的控制器doWork()
public class Controller {
public Controller()
{
doWork(null);
}
public static void doWork(String s)
{
GUI gui = new GUI();
for (int i=0; i<10; i++)
{
gui.addRow("Line "+(i+1));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
最后,GUI
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class GUI {
private JFrame frame = new JFrame();
private DefaultTableModel model = new DefaultTableModel();
private JTable table = new JTable(model);
private JScrollPane pane = new JScrollPane(table);
public GUI()
{
model.addColumn("Name");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(pane);
frame.pack();
frame.setVisible(true);
}
public void addRow(String name)
{
model.addRow(new Object[]{name});
}
}
由于我正在为 OS X 开发,并且我需要能够将我的应用程序与某种文件类型(比如说)相关联,我必须将我的文件.jarbundlerproblem
捆绑到使用Apple Jar Bundler中。我已经成功地做到了,我的应用程序打开,数到十,每秒写出。JAR
APP
现在,对于问题
默认情况下,双击 a.jarbundlerproblem
并将文件与我的应用程序相关联,不会将我双击的文件作为参数传递给应用程序。显然,这只是 OS X 上的 Java 作品。
由于我需要能够查看双击了哪个文件,因此我使用的是OSXAdapter,它是 Apple 为此目的制作的 Java 库。这一点,我通过改变我的Controller
类的构造函数并添加了另一个方法来实现registerForMacOSXEvents()
:
public Controller()
{
registerForMacOSXEvents();
//doWork(null);
}
public void registerForMacOSXEvents() {
try {
OSXAdapter.setFileHandler(this, getClass().getDeclaredMethod("doWork", new Class[] { String.class }));
} catch (Exception e) {
System.err.println("Error while loading the OSXAdapter:");
e.printStackTrace();
}
}
但是在这个(微小的)修改之后,我的应用程序开始起作用。有时,它不会打开,即使我可以在控制台中看到它刚刚启动(Initializing controller
已写入),但经过几次尝试后,它最终会启动,但前 10 秒窗口将完全空白,并且之后,将添加 10 行。
帮助
现在,我一直在为此苦苦挣扎,而且似乎没有很多关于 OSXAdapter 和 Jar Bundler 的文档。我究竟做错了什么?还是我不应该首先使用 OSXAdapter 或 Jar Bundler?