Я пытаюсь создать приложение Swing для просмотра структур JSON на этапе отладки / разработки более крупного приложения. Подход прост - (1) пройти по дереву JSON в режиме глубины сначала (b) для каждого узла создать соответствующий DefaultMutableTreeNode (c) вставить эти узлы в JTree и (d) поместить JTree в JScrollPane. Работает нормально для файла JSON / String размером до нескольких КБ.
Проблема: При использовании файлов JSON размером в несколько сотен КБ, я получаю графический интерфейс на экране в порядке, но после этого,Eclipse вылетает со следующим сообщением. Я подозреваю, что причина в том, как я создаю графический интерфейс. Это с Eclipse Neon, с Java 8, работающим на MacOS 10.14.6. Я попробовал модификацию - используйте метод createGUI () из потока Swing invokeLater (комментарий в закомментированных строках в коде для этого), но результаты те же.
Может кто-нибудь помочь с правильныммеханизм использования потока SwingWorker? Я не использовал Swing в течение долгого и долгого времени и, возможно, пропустил некоторые из последних событий. Еще одним источником путаницы является то, что я могу экспортировать проект из eclipse для создания исполняемого файла jar, и при вызове из командной строки (приглашение оболочки) приложение работает нормально.
Далее добавляется исходный код. Чтобы поместить его в свою собственную среду IDE и запустить его, требуется только внешняя библиотека "java-json.jar". Спасибо за вашу помощь.
Процесс: eclipse [50201] Путь:
/Applications/Eclipse.app/Contents/MacOS/eclipse Идентификатор:
org.eclipse.platform.ideВерсия: 4.6.0 (4.6.0.I20160606-1100) Тип кода: X86-64 (собственный) Родительский процесс: ??? [1] Ответственный: eclipse [50201] ИД пользователя: 1117050623
Дата / Время: 2019-10-06 11: 19: 55.970 -0700 Версия ОС:
Mac OS X 10.14.6 (18G95)Версия отчета: Версия 12 Bridge OS: 3.6 (16P6571) Анонимный UUID: 44A65B77-4733-DCB5-94D3-A96597022662
UUID сна / пробуждения: 0653A25E-D236-44CF-86ED-DB63F08A987A
1018 * *1017* 1018Время пробуждения с момента загрузки: 560000 секунд Время с пробуждения: 1900 секунд
Защита целостности системы: включено
Сбой потока: 0 Очередь отправки: com.apple.main-thread
Тип исключения: EXC_BAD_ACCESS (SIGABRT) Коды исключений:
KERN_INVALID_ADDRESS в 0x000000018e40cf7b Примечание об исключении:
EXC_CORPSE_NOTIFY
ВМ VM: 0x18e400000000000000000 - 3000000000000000* -> сопоставленный файл 000000018e464000-000000018e46c000 [32K] r - / rx SM = PRV Object_id = 3fca339b
Информация о приложении: проверка буфера: CGBlt_copyBytes: проверка буфера:
abort () называется
Нить 0 Crashed :: Очередь отправки: com.apple.main-thread 0
libsystem_kernel.dylib 0x00007fff607b82c6 __pthread_kill + 10 1 libsystem_pthread.dylib 0x00007fff60873bf1 pthread_kill + 284 2lib0000000000000000XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXBS запомнить до 2007(bool) + 25 4 libjvm.dylib 0x000000010858479e VMError :: report_and_die () + 2304 5 libjvm.dylib
0x0000000108461dfe JVM_handle_bsd_signal + 1131 6 libjvm.dylib *00000000000000000000000000000000000000000000000000000000000000000000 (0) * 0001 (0) * 0001 (0) * 0 (0) * 070 * 0 (0) * 0: 0 * * 0 (0) * * * * * * * * * * * * * 0 * 030
libsystem_platform.dylib 0x00007fff60868b5d _sigtramp + 29 8
??? 0x00007fff8906e670 sp3_gfx10_a_operand + 818512 9 com.apple.CoreGraphics 0x00007fff34b95391 CGBlt_copyBytes + 385 10 com.apple.CoreGraphics
0x00007fff34b722b4 argb32_image + 5324 11 com.apple.CoreGraphics
0x00007fff34b70ddf ripl_Mark + 22 12 com.apple.CoreGraphics
0x00007fff34b70db4 RIPLayerBltImage + 1018 13 com.apple.CoreGraphics 0x00007fff34b706f6 ripc_RenderImage + 228 14 com.apple.CoreGraphics 0x00007fff34b64371 ripc_DrawImage + 812 15 com.apple.CoreGraphics
0x00007fff34b64036 CGContextDelegateDrawImage + 41 16 com.apple.AppKit 0x00007fff31f25397 __backing_store_DrawImage_block_invoke + 55 17 ком. apple.AppKit 0x00007fff31f24260 backing_store_delegate + 893 18 com.apple.AppKit 0x00007fff32240665 backing_store_DrawImage.llvm.2329424099933660171 + 509 19 com.apple.CoreGraphics 0x00007fff34b64036 CGContextDelegateDrawImage + 41 20 com.apple.AppKit
0x00007fff322414e6 backing_store_DrawWindowContents.llvm.2329424099933660171 + 1075 21 ком.apple.CoreGraphics 0x00007fff34be1e52 CGContextDelegateDrawWindowContents + 59 22 com.apple.SkyLight * * 0x00007fff59a64507 одна тысяча сорок пять SLContextCopyWindowContentsToRect + 163 23 com.apple.AppKit 0x00007fff32153858 _NXScroll + 1463 24 libswt-пи-какао-4623.jnilib 0x0000000159937139 Java_org_eclipse_swt_internal_cocoa_OS_NSCopyBits + 187 25 ???
0x0000000120018427 0 + 4831937575 26 ???
0x0000000120007ffd 0 + 4831870973 27 ???
0x0000000120007ffd 0 + 4831870973 28 ???
0x0000000120007ffd 0 + 4831870973 29 ?? ??? + 4831870973 34 ???
0x0000000120007ffd 0 + 4831870973 35 ???
0x0000000120007ffd 0 + 4831870973 36 ???
0x0000000120008042 0 + 4831871042 37 ???
0x000000012317 08000706 000 080 800 0* * 0x0000000120a39674 тысяча пятьдесят-девять 0 + 4842559092 39 ???
0x0000000120008042 0 + 4831871042 40 ???
0x0000000120007ffd 0 + 4831870973 41 ???
0x0000000120007e54 0 + 4831870548 42 ???
0x0000000120007ffd 0 +4831870973 43 ???
0x0000000120008042 0 + 4831871042 44 ???
0x0000000120007ffd 0 + 4831870973 45 ???
0x0000000120007a40 0+ 4831869504 46 ???
0x0000000120007a40 0 + 4831869504 47 ???
0x0000000120007e54 0 + 4831870548 48 ???
0x0000000120007e54 0 + 4831870548 49 ???
0x000000012000 070 800702000
0x0000000120007d80 0 + 4831870336 51 ???
0x0000000120007d80 0 + 4831870336 52 ???
0x00000001200004e7 0 + 4831839463 53 libjvm.dylib
0x00000001algualls, Thread *) + 1710 54 libjvm.dylib
0x00000001084a80c4 Reflection :: invoke (instanceKlassHandle, methodHandle, дескриптор, bool, objArrayHandle, BasicType, objArrayHandle, bool, Thread *) + 3602 55 libjvm.dyb * 10000084000000000000000000000000000000000000000000000000000000000000000000000000000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0055555 всех всех всех всех всех всех * всех 0: invoke_method (oopDesc *, Handle, objArrayHandle, Thread *) + 364 56 libjvm.dylib
0x000000010831de40 JVM_InvokeMethod + 358 57 ???
0x0000000120018427 0 + 4831937575 0310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000??
0x0000000120007d80 0 + 4831870336 60 ???
0x0000000120007e54 0 +4831870548 61 ???
0x0000000120007d80 0 + 4831870336 62 ???
0x0000000120007ffd 0 + 4831870973 63 ???
0x0000000120007ffd 0 + 4831870973 64 ???
0x00000046003131jb01086 * 0x00000001082e255a JavaCalls :: call_helper (JavaValue *, methodHandle *, JavaCallArguments *, Thread *) + 1710 66 libjvm.dylib
0x00000001082fcf6a jni_invoke_nonstatic (JNIEn_jpg_jpg)JNI_ArgumentPusher *, Thread *) + 748 67 libjvm.dylib 0x00000001082ee5e2 jni_CallIntMethod + 363 68 eclipse_1615.so
0x0000000100586bb2 startJavaJNI + 2138 69 eclipse_1615.so
0x0000000100585597 startJavaVM + 9 70 eclipse_1615.so
0x00000001005835a5 _run + 4196 71 eclipse_1615.so 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000+ 1819 73 org.eclipse. 0x00007fff6087456e _pthread_cond_wait + 722 2 libjvm.dylib
0x000000010845c75a os :: PlatformEvent :: park () + 192 3 libjvm.dylib
0x000000010843a776 ParkCommon (4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 (400000000000000000 (1 000-й)Thread *, long) + 168 5
libjvm.dylib 0x000000010843b2d2 Monitor :: wait (bool, long, bool) + 390 6 libjvm.dylib
0x0000000108598b8b GangWorker :: loop () + 179 7 libjvm.dylib
0x00000001084609ea java_start (Тема *) + 246 8
libsystem_pthread.dylib 0x00007fff608712eb _pthread_body + 126 9 libsystem_pthread.dylib 0x00007fff60874249 _pthread_start + 66 10 libsystem_pthread.dylib 0x00007fff6087040d thread_start + 13
резьбы 2: 0 libsystem_kernel.dylib 0x00007fff607b586a __psynch_cvwait + 10 1 libsystem_pthread.dylib 0x00007fff6087456e _pthread_cond_wait + 722 2 libjvm.dylib
0x000000010845c75a os :: PlatformEvent :: park () + 192 3 libjvm.dylib
0x000000010843a776 ParkCommon (ParkEvent *, long) + 42 4 libjvm.dylib 0x000000010843b05a Monitor (поток), IWait168 5
libjvm.dylib 0x000000010843b2d2 Monitor :: wait (bool, long, bool) + 390 6 libjvm.dylib
0x0000000108598b8b GangWorker :: loop () + 179 7 libjvm.dylib
0x0000 (0x0000). *
package com.efe.fqa;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.tree.DefaultMutableTreeNode;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class JsonView extends JSplitPane {
private static final long serialVersionUID = 0xEFECAFE2BL;
private JSONObject job;
private String rootName;
public JsonView (String title, String jsonAsString) throws JSONException {
this (title, new JSONObject(jsonAsString));
}
public JsonView (String rootNodeName, JSONObject job) throws JSONException {
super (HORIZONTAL_SPLIT);
rootName = rootNodeName;
this.job = job;
// }
//
// public void createGUI () throws JSONException {
add (getTextPane (job), LEFT);
add (getTreePane (rootName, job), RIGHT);
}
private JScrollPane getTextPane (JSONObject job) throws JSONException {
JTextArea ta = new JTextArea(job.toString(4));
JScrollPane sp = new JScrollPane (ta);
sp.setPreferredSize(new Dimension(720,400));
return sp;
}
private JScrollPane getTreePane (String title, JSONObject job) throws JSONException {
int n = job.length();
DefaultMutableTreeNode jsonRoot=new DefaultMutableTreeNode(title + " (" + n + ")");
expandUnitTree (jsonRoot, job);
JTree jsonTree = new JTree(jsonRoot);
JScrollPane sp = new JScrollPane (jsonTree);
sp.setPreferredSize(new Dimension(720,400));
return sp;
}
private void expandArrayTree (DefaultMutableTreeNode parent, JSONArray jarray) throws JSONException {
int n = jarray.length();
for (int i = 0 ; i < n ; i++) {
DefaultMutableTreeNode jsonNode = new DefaultMutableTreeNode("[" + i + "]");
Object child = jarray.get(i);
System.out.println ("Child class: " + child.getClass().getName());
if (child instanceof JSONArray) {
expandArrayTree(jsonNode, jarray.getJSONArray(i));
} else if (child instanceof JSONObject) {
expandUnitTree(jsonNode, jarray.getJSONObject(i));
} else if (child instanceof String) {
jsonNode.add (new DefaultMutableTreeNode ("\"" + child + "\""));
} else {
jsonNode.add (new DefaultMutableTreeNode (child.toString()));
}
parent.add(jsonNode);
}
}
private void expandUnitTree (DefaultMutableTreeNode parent, JSONObject job) throws JSONException {
//JSONArray names = job.names();
//System.out.println ("[expandUnitTree] names has " + names.length() + " elements");
//for (int i = 0 ; i < names.length() ; i++)
System.out.println (job);
Iterator<?> keys = job.keys();
List<String> jobKeys = new ArrayList<String>();
while (keys.hasNext()) {
jobKeys.add(keys.next().toString());
//System.out.println (keys.next());
}
Collections.sort(jobKeys);
for (String jsonKey : jobKeys) {
Object child = job.get(jsonKey);
Class<?> cls = child.getClass();
System.out.println ("\t" + jsonKey + " -> " + cls.getName());
DefaultMutableTreeNode jsonNode = null;
if (job.isNull(jsonKey)) {
jsonNode = new DefaultMutableTreeNode("\"" + jsonKey + "\" : null");
} else if (child instanceof JSONArray) {
JSONArray jsonChild = job.getJSONArray(jsonKey);
int n = jsonChild.length();
jsonNode = new DefaultMutableTreeNode("\"" + jsonKey + "\" [" + n + "]");
expandArrayTree (jsonNode, jsonChild);
} else if (child instanceof JSONObject) {
JSONObject jsonChild = job.getJSONObject(jsonKey);
int n = jsonChild.length();
jsonNode = new DefaultMutableTreeNode("\"" + jsonKey + "\" (" + n + ")");
expandUnitTree (jsonNode, jsonChild);
} else if (child instanceof Boolean) {
boolean bool = job.getBoolean(jsonKey);
jsonNode = new DefaultMutableTreeNode("\"" + jsonKey + "\" : " + bool);
} else if (child instanceof Integer) {
int iNumber = job.getInt(jsonKey);
jsonNode = new DefaultMutableTreeNode("\"" + jsonKey + "\" : " + iNumber);
} else if (child instanceof Double) {
double dNumber = job.getDouble(jsonKey);
jsonNode = new DefaultMutableTreeNode("\"" + jsonKey + "\" : " + dNumber);
} else {
String str = job.getString(jsonKey);
jsonNode = new DefaultMutableTreeNode("\"" + jsonKey + "\" : \"" + str + "\"");
}
parent.add(jsonNode);
}
}
public static JSONObject readJsonFile (File file) throws IOException, JSONException {
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader (new FileReader (file));
for (String s = br.readLine() ; s != null ; s = br.readLine())
sb.append(s);
br.close();
return new JSONObject(sb.toString());
}
public static void main(String[] args) {
JFileChooser fc = new JFileChooser(System.getProperty("user.home"));
if (fc.showOpenDialog(new JFrame()) == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
try {
JSONObject job = readJsonFile (file);
String fileName = file.getName();
JFrame fr = new JFrame ("JsonView: " + file.getAbsolutePath());
JsonView jv = new JsonView ("[JsonView] File: " + fileName, job);
fr.getContentPane().add(jv);
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// try {
// jv.createGUI();
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
int height = screenSize.height;
int width = screenSize.width;
fr.pack();
Dimension pfSize = fr.getSize();
fr.setLocation((width - pfSize.width)/2, (height - pfSize.height)/2 - 200);
fr.setVisible(true);
// } catch (JSONException jex) {
// jex.printStackTrace();
// }
}
});
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}