我已经创建了一个简单的Java应用程序,每秒钟连续10秒向
一个控制器创建 GUI 并通过
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
(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
)关联起来,所以我需要使用苹果Jar Bundler将我的JAR
文件打包成APP
文件。我已经成功完成了这个过程,我的应用程序能够打开并运行,每秒钟都会计数。
现在是问题
默认情况下,在OS X中双击一个.jarbundlerproblem
文件并将其关联到我的应用程序时,不会将我双击的文件作为参数传递给应用程序。显然,这是由于 Java 在 OS X 上的工作方式。
因为我需要能够看到双击的文件,所以我使用了OSXAdapter库,这是苹果专门为此目的制作的 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();
}
}
但是在这个(小)修改后,我的应用开始出现问题。有时候,它不会打开,即使我可以在控制台中看到它刚刚启动了(正在初始化控制器
已经被写入),但经过几次尝试后,它最终会启动,但窗口在前10秒钟内完全空白,在此之后,10行将被添加。
帮助
现在,我已经为此苦苦挣扎了很长时间,似乎没有关于OSXAdapter或Jar Bundler的文档。我做错了什么?或者我一开始就不应该使用OSXAdapter或Jar Bundler吗?
OSXAdapter
是如何工作的,我只是熟悉它而已。如果你想了解更多关于它的信息,可以在 http://developer.apple.com/library/mac/#samplecode/OSXAdapter/Listings/src_OSXAdapter_java.html#//apple_ref/doc/uid/DTS10000685-src_OSXAdapter_java-DontLinkElementID_5 找到它的源代码。 - kbarun()
中的所有工作都已经被我移动到了doInBackground()
中,并且在run()
中添加了execute()
。doWork()
已经完全删除。每当Controller.doInBackground()
中的一个迭代完成时,它只是调用publish()
。 - kbarun()
方法中完成了所有的工作,然后调用doWork()
方法并让它调用doInBackground()
方法。其实不需要三个方法,一个就足够了。此外,如果从doInBackground()
方法中删除Thread.sleep()
,那么while
循环可能会停止,doInBackground()
方法终止,因此最后几行不会被发布到GUI上。这也不再发生。 - kba