Я создал простое Java-приложение, которое каждую секунду в течение 10 секунд подряд добавляет новую строку в JTable
.Он состоит из трех классов.
Основной класс, который вызывается при запуске программы
public class JarBundlerProblem {
public static void main(String[] args)
{
System.err.println("Initializing controller");
new Controller();
}
}
Контроллер, который создает графический интерфейс и изменяет егочерез 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();
}
}
}
}
И, наконец, графический интерфейс
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
файл в APP
, используя Apple Jar Bundler .Я сделал это успешно, мое приложение открывается, считает до десяти, выписывая каждую секунду.
Теперь для решения проблемы
По умолчанию дважды щелкните .jarbundlerproblem
и сопоставьтефайл с моим приложением, не будет передавать файл, который я дважды щелкнул в качестве аргумента приложения.По-видимому, это просто Java на OS X работает.
Так как мне нужно, чтобы увидеть, какой файл был дважды кликнул, я использую OSXAdapter , который является библиотекой Java, созданнойApple для этой цели.Это я реализовал, изменив конструктор моего 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?