Я пытаюсь использовать этот код, чтобы изменить непрозрачность некоторых вершин, связанных с вершиной, щелкнутой в jgraphx, и когда вы нажимаете где-то за пределами вершин, она будет менять непрозрачность. Когда щелкнула вершина, запрашивается ее значение/строка, и я получаю все связанные с ней объекты, добавленные в новый список объектов. Затем я обрабатываю этот список объектов, чтобы выбрать, что будет выделено, а что нет. Однако я продолжаю получать ошибки и не могу исправить это. Насколько я проверял. Если кто-то может помочь, это будет действительно оценено.NullPointerException и MouseListener в графе
Ошибка относится к линии:
graph.getView().getState(myCell).getStyle().put(mxConstants.STYLE_OPACITY, OPACITY_HL);
Вот код:
public void MassCellHighlight() {
int OPACITY_PALE = 15;
int OPACITY_HL = 100;
graphComponent.getGraphControl().addMouseListener(new MouseAdapter() {
public void mouseReleased (MouseEvent e1) {
if (e1.getButton() == 1 && e1.getClickCount() == 1) {
long x = e1.getX();
long y = e1.getY();
Object cell = graphComponent.getCellAt((int) x, (int)y);
String usecell = graph.convertValueToString(cell);
PropertyConfigurator.configure("\\jena-log4j.properties");
OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
FileManager.get().readModel(model, "file");
String queryString =
"PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> " +
"PREFIX owl: <http://www.w3.org/2002/07/owl#> " +
"PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> " +
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> " +
"PREFIX bi: <#> " +
" SELECT ?Path " +
" WHERE { bi:"+usecell+" bi:can_lead_to ?Path } " ;
Query query = QueryFactory.create(queryString);
QueryExecution qe= QueryExecutionFactory.create(query, model);
ResultSet resultset = qe.execSelect();
ResultSet results = ResultSetFactory.copyResults(resultset);
List<Object> values = new ArrayList<Object>();
while (results.hasNext()) {
values.add(results.next().get("Path"));
}
String s = values.toString();
Pattern p = Pattern.compile("(?<=#)([^,]*)(?=(,|\\]))");
Matcher m = p.matcher(s);
List<String> listhl = new ArrayList<String>() ;
while (m.find()) {
listhl.add(m.group(1));
}
listhl.add(usecell);
List<Object> objectlist = new ArrayList<Object>(listhl);
System.out.println(objectlist);
Object[] allCells = mxGraphModel.getChildren(graph.getModel(), graph.getDefaultParent());
if (cell != null) {
if (graph.getModel().isVertex(cell)) {
for(Object myCell : objectlist) {
graph.getView().getState(myCell).getStyle().put(mxConstants.STYLE_OPACITY, OPACITY_HL);
graph.getView().getState(myCell).getStyle().put(mxConstants.STYLE_TEXT_OPACITY, OPACITY_HL);
}
for (Object myCell: allCells) {
graph.getView().getState(myCell).getStyle().put(mxConstants.STYLE_OPACITY, OPACITY_PALE);
graph.getView().getState(myCell).getStyle().put(mxConstants.STYLE_TEXT_OPACITY, OPACITY_PALE);
}
}else {
for(Object myCell: allCells) {
graph.getView().getState(myCell).getStyle().put(mxConstants.STYLE_OPACITY, OPACITY_HL);
graph.getView().getState(myCell).getStyle().put(mxConstants.STYLE_TEXT_OPACITY, OPACITY_HL);
}
}
mxRectangle bounds = graph.getBoundsForCells(allCells, true, true, true);
graph.repaint(bounds);
}
}
}
});
}
Ошибка:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at GUIquery$14.mouseReleased(GUIquery.java:1087)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Когда я использую Тхи который выделяет только дочерние элементы родительской вершины, он работает правильно. Мне просто нужно, чтобы развернуть его так, чтобы больше клеток выделены, в зависимости от списка объектов, который происходит из запроса:
public void CellHighlight() {
graphComponent.getGraphControl().addMouseListener(new MouseAdapter() {
public void mouseReleased (MouseEvent e1) {
if (e1.getButton() == 1 && e1.getClickCount() == 2) {
final Object selectedCell = graphComponent.getCellAt(e1.getX(), e1.getY());
Object[] allCells = mxGraphModel.getChildren(graph.getModel(), graph.getDefaultParent());
if (selectedCell != null) {
if (graph.getModel().isVertex(selectedCell)) {
for(Object myCell: allCells) {
graph.getView().getState(myCell).getStyle().put(mxConstants.STYLE_OPACITY, OPACITY_PALE);
graph.getView().getState(myCell).getStyle().put(mxConstants.STYLE_TEXT_OPACITY, OPACITY_PALE);
}
List<Object> cellList = new ArrayList<Object>();
cellList.add(selectedCell);
Object[] outgoingEdges = mxGraphModel.getOutgoingEdges(graph.getModel(), selectedCell);
for(Object edge: outgoingEdges) {
cellList.add(graph.getModel().getTerminal(edge, false));
}
cellList.addAll(Arrays.asList(outgoingEdges));
for(Object myCell: cellList) {
graph.getView().getState(myCell).getStyle().put(mxConstants.STYLE_OPACITY, OPACITY_HL);
graph.getView().getState(myCell).getStyle().put(mxConstants.STYLE_TEXT_OPACITY, OPACITY_HL);
}
} else {
for(Object myCell: allCells) {
graph.getView().getState(myCell).getStyle().put(mxConstants.STYLE_OPACITY, OPACITY_HL);
graph.getView().getState(myCell).getStyle().put(mxConstants.STYLE_TEXT_OPACITY, OPACITY_HL);
}
}
mxRectangle bounds = graph.getBoundsForCells(allCells, true, true, true);
graph.repaint(bounds);
}
}
}
});
}
Как грубое предположение, я думаю, что функция 'getState (myCell)' может возвращать 'null'. В общем, попробуйте разделить линию NPE на несколько вызовов, чтобы вы могли видеть, что именно возвращает «null». – Flavio
Да, это проблема, но я не понимаю почему. objectlist isnt null. @Flavio – user2598911
Я нашел ошибку – user2598911