From 8b38fe3354d98b46c8cb5d70af62067ebaba7352 Mon Sep 17 00:00:00 2001 From: Alexandre Gobbo Date: Fri, 22 Aug 2014 09:29:25 +0200 Subject: [PATCH] Fixed bugs on MatrixPlotArray 7 LinePlotArray & Non-continuous mode on JZY3d --- ch.psi.plot/pom.xml | 2 +- .../main/java/ch/psi/plot/LinePlotBase.java | 1 + .../src/main/java/ch/psi/plot/PlotBase.java | 29 +++++--- .../src/main/java/ch/psi/plot/PlotSeries.java | 3 +- .../java/ch/psi/plot/jzy3d/MatrixPlot.java | 69 ++++++++++++++----- .../ch/psi/plot/utils/MonitoredPanel.java | 4 ++ ch.psi.plot/src/test/java/LinePlotTest.java | 3 +- 7 files changed, 81 insertions(+), 30 deletions(-) diff --git a/ch.psi.plot/pom.xml b/ch.psi.plot/pom.xml index 33b7cc5..3658ea8 100644 --- a/ch.psi.plot/pom.xml +++ b/ch.psi.plot/pom.xml @@ -2,7 +2,7 @@ 4.0.0 ch.psi plot - 2.0-SNAPSHOT + 2.1-SNAPSHOT jzy3d-releases diff --git a/ch.psi.plot/src/main/java/ch/psi/plot/LinePlotBase.java b/ch.psi.plot/src/main/java/ch/psi/plot/LinePlotBase.java index 76781fc..0108ee9 100644 --- a/ch.psi.plot/src/main/java/ch/psi/plot/LinePlotBase.java +++ b/ch.psi.plot/src/main/java/ch/psi/plot/LinePlotBase.java @@ -128,6 +128,7 @@ abstract public class LinePlotBase extends PlotBase implements L frame.pack(); SwingUtils.centerOnScreen(frame); frame.setVisible(true); + frame.requestFocus(); } catch (Exception ex) { SwingUtils.showException(getChartPanel(), ex); } diff --git a/ch.psi.plot/src/main/java/ch/psi/plot/PlotBase.java b/ch.psi.plot/src/main/java/ch/psi/plot/PlotBase.java index 89641e6..6d38793 100644 --- a/ch.psi.plot/src/main/java/ch/psi/plot/PlotBase.java +++ b/ch.psi.plot/src/main/java/ch/psi/plot/PlotBase.java @@ -11,6 +11,8 @@ import java.awt.image.BufferedImage; import java.io.IOException; import java.lang.reflect.Array; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.logging.Level; import java.util.logging.Logger; @@ -182,6 +184,7 @@ abstract public class PlotBase implements Plot { //Series list support final HashMap seriesList = new HashMap<>(); + volatile int seriesID=1; @Override public void addSeries(T series) { @@ -199,6 +202,7 @@ abstract public class PlotBase implements Plot { seriesList.put(series.name, series); } series.setPlot(this); + series.id=seriesID++; series.setToken(onAddedSeries(series)); } @@ -211,12 +215,14 @@ abstract public class PlotBase implements Plot { @Override public void removeSeries(T series) { - if (series.getPlot() == this) { - series.setPlot(null); - } - onRemovedSeries(series); - synchronized (seriesList) { - seriesList.remove(series.name); + if (series!=null){ + if (series.getPlot() == this) { + series.setPlot(null); + } + onRemovedSeries(series); + synchronized (seriesList) { + seriesList.remove(series.name); + } } } @@ -227,14 +233,13 @@ abstract public class PlotBase implements Plot { } } - //TODO: Not respecting order @Override public T getSeries(int index) { synchronized (seriesList) { if ((index < 0) || (index >= seriesList.size())) { return null; } - return seriesList.get(getAllSeries()[index]); + return getAllSeries()[index]; } } @@ -243,6 +248,13 @@ abstract public class PlotBase implements Plot { return seriesList.size(); } + public class SeriesComparator implements Comparator { + @Override + public int compare(T o1, T o2) { + return Integer.valueOf(o1.id).compareTo(Integer.valueOf(o2.id)); + } + } + @Override public T[] getAllSeries() { synchronized (seriesList) { @@ -250,6 +262,7 @@ abstract public class PlotBase implements Plot { for (T series : seriesList.values()) { list.add(series); } + Collections.sort(list, new SeriesComparator()); return list.toArray((T[]) Array.newInstance(seriesType, 0)); } } diff --git a/ch.psi.plot/src/main/java/ch/psi/plot/PlotSeries.java b/ch.psi.plot/src/main/java/ch/psi/plot/PlotSeries.java index 8f7f96e..33e02e5 100644 --- a/ch.psi.plot/src/main/java/ch/psi/plot/PlotSeries.java +++ b/ch.psi.plot/src/main/java/ch/psi/plot/PlotSeries.java @@ -9,6 +9,7 @@ package ch.psi.plot; public abstract class PlotSeries { volatile boolean updating = false; + volatile int id; protected PlotSeries() { this(""); @@ -28,7 +29,7 @@ public abstract class PlotSeries { return token; } - private T plot; + private T plot; void setPlot(T plot) { this.plot = plot; diff --git a/ch.psi.plot/src/main/java/ch/psi/plot/jzy3d/MatrixPlot.java b/ch.psi.plot/src/main/java/ch/psi/plot/jzy3d/MatrixPlot.java index b72aaf6..6547cf7 100644 --- a/ch.psi.plot/src/main/java/ch/psi/plot/jzy3d/MatrixPlot.java +++ b/ch.psi.plot/src/main/java/ch/psi/plot/jzy3d/MatrixPlot.java @@ -11,6 +11,7 @@ import ch.psi.plot.utils.SwingUtils; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; +import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; @@ -25,6 +26,7 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.media.opengl.GLAnimatorControl; +import javax.media.opengl.awt.GLCanvas; import javax.swing.ButtonGroup; import javax.swing.JCheckBoxMenuItem; import javax.swing.JMenu; @@ -65,6 +67,8 @@ public class MatrixPlot extends MatrixPlotBase { JPanel panel; private Chart chart; + GLAnimatorControl animatorControl; + IScreenCanvas screenCanvas; private Mapper mapper; private Shape surface; private MatrixPlotSeries series; @@ -86,11 +90,13 @@ public class MatrixPlot extends MatrixPlotBase { if ((chart == null) && (series != null)) { createGraph(); } - checkBounds(true); + checkBounds(true); } protected void onHidden() { - if (chart != null) { + if (chart != null) { + chart.stopAnimator(); + panel.removeAll(); chart.dispose(); chart = null; } @@ -276,7 +282,6 @@ public class MatrixPlot extends MatrixPlotBase { createGraph(); } } - public boolean getContinuousRendering() { return continuousRendering; } @@ -430,6 +435,7 @@ public class MatrixPlot extends MatrixPlotBase { final JCheckBoxMenuItem menuShowLegend = new JCheckBoxMenuItem("Show Legend"); final JCheckBoxMenuItem menuShowFace = new JCheckBoxMenuItem("Show Face"); final JCheckBoxMenuItem menuShowFrame = new JCheckBoxMenuItem("Show Frame"); + //final JCheckBoxMenuItem menuContinuous = new JCheckBoxMenuItem("Continuous Rendering"); JMenuItem frameColor = new JMenuItem("Set Frame Color"); final JMenu menuColormap = new JMenu("Colormap"); @@ -440,6 +446,7 @@ public class MatrixPlot extends MatrixPlotBase { menuPopup.add(menuShowLegend); menuPopup.add(menuShowFace); menuPopup.add(menuShowFrame); + //menuPopup.add(menuContinuous); menuPopup.add(frameColor); menuPopup.add(menuColormap); menuPopup.add(menuMode); @@ -484,7 +491,20 @@ public class MatrixPlot extends MatrixPlotBase { } }); menuShowFrame.setSelected(getShowFrame()); - +/* + menuContinuous.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + setContinuousRendering(!getContinuousRendering()); + menuContinuous.setSelected(getContinuousRendering()); + } + }); + } + }); + menuContinuous.setSelected(getShowFrame()); +*/ menuShowLegend.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setShowLegend(!getShowLegend()); @@ -656,16 +676,14 @@ public class MatrixPlot extends MatrixPlotBase { } }; - GLAnimatorControl ac = null; - Component canvas = (Component) chart.getCanvas(); + animatorControl = null; + screenCanvas=null; + Component canvas = (Component) chart.getCanvas(); if (canvas instanceof IScreenCanvas) { - ac = ((IScreenCanvas) canvas).getAnimator(); - } - final GLAnimatorControl animatorControl = ac; - - if (!getContinuousRendering() && (animatorControl != null)) { - animatorControl.pause(); + screenCanvas=(IScreenCanvas) canvas; + animatorControl = screenCanvas.getAnimator(); } + panel.removeAll(); panel.add(canvas); @@ -692,21 +710,22 @@ public class MatrixPlot extends MatrixPlotBase { public void mouseWheelMoved(com.jogamp.newt.event.MouseEvent me) { if (!getContinuousRendering() && (animatorControl != null)) { if (animatorControl.isPaused()) { - ((IScreenCanvas) canvas).display(); + screenCanvas.display(); } } } @Override public void mouseReleased(com.jogamp.newt.event.MouseEvent e) { - if (e.getButton() == com.jogamp.newt.event.MouseEvent.BUTTON3) { + if ((e.getButton() == com.jogamp.newt.event.MouseEvent.BUTTON3) && + (!e.isAltDown())&&(!e.isControlDown())&&(!e.isShiftDown()) ){ menuPopup.show(panel, e.getX(), e.getY()); } if (!getContinuousRendering() && (animatorControl != null)) { if ((e.getClickCount() != 2) && (e.getButtonsDown().length <= 1)) { animatorControl.pause(); - ((IScreenCanvas) canvas).display(); + screenCanvas.display(); } } } @@ -719,7 +738,7 @@ public class MatrixPlot extends MatrixPlotBase { if (!getContinuousRendering() && (animatorControl != null)) { if ((e.getClickCount() != 2) ) { animatorControl.pause(); - ((IScreenCanvas) canvas).display(); + screenCanvas.display(); } } } @@ -727,7 +746,7 @@ public class MatrixPlot extends MatrixPlotBase { public void mouseWheelMoved(MouseWheelEvent e){ if (!getContinuousRendering() && (animatorControl != null)) { if (animatorControl.isPaused()) { - ((IScreenCanvas) canvas).display(); + screenCanvas.display(); } } } @@ -742,7 +761,8 @@ public class MatrixPlot extends MatrixPlotBase { } private void checkPopup(MouseEvent e) { - if (e.isPopupTrigger()) { + if (e.isPopupTrigger() && + (!e.isAltDown())&&(!e.isControlDown())&&(!e.isShiftDown()) ) { menuPopup.show(e.getComponent(), e.getX(), e.getY()); } } @@ -751,6 +771,17 @@ public class MatrixPlot extends MatrixPlotBase { chart.getCanvas().addMouseController(listener); updateGraph(true); + + + if (!getContinuousRendering() && (animatorControl != null)) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + animatorControl.pause(); + } + }); + } + } if (formerChart != null) { formerChart.dispose(); @@ -758,7 +789,7 @@ public class MatrixPlot extends MatrixPlotBase { } } - + private void updateGraph(final boolean newSeries) { if (!SwingUtilities.isEventDispatchThread()) { SwingUtilities.invokeLater(new Runnable() { diff --git a/ch.psi.plot/src/main/java/ch/psi/plot/utils/MonitoredPanel.java b/ch.psi.plot/src/main/java/ch/psi/plot/utils/MonitoredPanel.java index ccb8e19..bf144ce 100644 --- a/ch.psi.plot/src/main/java/ch/psi/plot/utils/MonitoredPanel.java +++ b/ch.psi.plot/src/main/java/ch/psi/plot/utils/MonitoredPanel.java @@ -5,6 +5,8 @@ package ch.psi.plot.utils; */ import java.awt.event.HierarchyEvent; import java.awt.event.HierarchyListener; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.swing.JPanel; /** @@ -21,11 +23,13 @@ public class MonitoredPanel extends JPanel { try { onShown(); } catch (Exception ex) { + Logger.getLogger(MonitoredPanel.class.getName()).log(Level.FINE, null, ex); } } else { try { onHidden(); } catch (Exception ex) { + Logger.getLogger(MonitoredPanel.class.getName()).log(Level.FINE, null, ex); } } } diff --git a/ch.psi.plot/src/test/java/LinePlotTest.java b/ch.psi.plot/src/test/java/LinePlotTest.java index c1ce3db..2f61e54 100644 --- a/ch.psi.plot/src/test/java/LinePlotTest.java +++ b/ch.psi.plot/src/test/java/LinePlotTest.java @@ -77,7 +77,8 @@ public class LinePlotTest { } } } - +// plot.removeSeries(plot.getSeries(0)); +// plot.removeSeries(plot.getSeries(1)); System.out.println("DONE: " + (System.currentTimeMillis() - start)); } });