/*
* -------------------------------------------------------------------------
* $Id: Strip.java,v 1.3 2004/05/26 19:15:34 estewart Exp $
* -------------------------------------------------------------------------
* Copyright (c) 1999 Visual Numerics Inc. All Rights Reserved.
*
* This software is confidential information which is proprietary to
* and a trade secret of Visual Numerics, Inc. Use, duplication or
* disclosure is subject to the terms of an appropriate license
* agreement.
*
* VISUAL NUMERICS MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE
* SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING
* BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. VISUAL
* NUMERICS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
* AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR
* ITS DERIVATIVES.
*--------------------------------------------------------------------------
*/
package com.imsl.demo.Strip;
import com.imsl.chart.*;
import com.imsl.demo.gallery.Describe;
import java.awt.Font;
import javax.swing.*;
/**
* Strip Chart
*/
public class Strip extends JFrameChart implements Runnable {
static private String title[] = {"Red", "Dark Green", "Magenta"};
static private String color[] = {"Red", "DarkGreen", "Magenta"};
private double y[][];
private Data label;
/**
* Creates a strip chart.
*/
public Strip(boolean exitOnClose) {
setTitle("Strip Chart");
if (!exitOnClose) {
// remove the WindowListener, installed by JFrameChart, that
// exits the application when the window is closed.
Object l[] = getListeners(java.awt.event.WindowListener.class);
for (int k = 0; k < l.length; k++) {
removeWindowListener((java.awt.event.WindowListener)l[k]);
}
}
Describe des = new Describe(this, "/com/imsl/demo/Strip/Strip.html");
des.show();
java.awt.Dimension ds = des.getSize();
java.awt.Dimension ss = getToolkit().getScreenSize();
int h = Math.min(ss.width/2, ss.height-ds.height-32);
int w = (int)(h/0.8);
setSize(w, h);
setLocation(ss.width-ds.width, ds.height);
/*
* Create the chart
*/
Chart chart = getChart();
AxisXY axis = new AxisXY(chart);
// axis titles
axis.getAxisX().getAxisTitle().setTitle("Time Offset");
axis.getAxisX().getAxisTitle().setFontStyle(Font.BOLD | Font.ITALIC);
axis.getAxisX().getAxisTitle().setTextColor("mediumblue");
axis.getAxisY().getAxisTitle().setTitle("Amplitude");
axis.getAxisY().getAxisTitle().setFontStyle(Font.BOLD | Font.ITALIC);
axis.getAxisY().getAxisTitle().setTextColor("mediumblue");
// turn off autoscaling so that the window does not jump during updates
// fix y-axis range to [-1, +1]
axis.getAxisY().setAutoscaleInput(AxisXY.AUTOSCALE_OFF);
axis.getAxisY().setWindow(-1,1);
// initial raw data
double x[] = new double[100];
y = new double[3][100];
for (int k = 1; k < x.length; k++) {
x[k] = 0.01*k;
for (int i = 0; i < y.length; i++) {
y[i][k] = y[i][k-1] + 0.10*Math.random() - 0.05;
}
}
// data lines
axis.setDataType(AxisXY.DATA_TYPE_LINE);
final int count = 3;
final Data data[] = new Data[count];
for (int i = 0; i < count; i++) {
data[i] = new Data(axis, x, y[i]);
data[i].setLineColor(color[i%color.length]);
data[i].setLineWidth(2.0);
data[i].setTitle(title[i]);
new ToolTip(data[i]);
}
// current time label
label = new Data(axis, new double[]{x[20]},new double[]{0.8});
label.setDataType(0);
label.setLabelType(Data.LABEL_TYPE_TITLE);
label.setTextColor("blue");
label.setFontName("serif");
label.setFontStyle(java.awt.Font.BOLD);
/*
* Add "Lines" menu to main menubar
*/
JMenuBar jMenuBar = getJMenuBar();
JMenu jMenuLines = new JMenu("Lines");
jMenuLines.setMnemonic('L');
jMenuBar.add(jMenuLines);
for (int k = 0; k < 3; k++) {
final int index = k;
final JCheckBoxMenuItem jMenuItem = new JCheckBoxMenuItem(title[index]);
jMenuLines.add(jMenuItem);
jMenuItem.setState(true);
jMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
data[index].setPaint(jMenuItem.getState());
}
});
}
}
/**
* Updates the strip chart.
* This method is designed to run in a different thread than the
* Java Swing thread.
*/
public void run() {
int n = y[0].length;
float t = 0;
while (true) {
synchronized(this) {
t += 1.0f;
label.setTitle("Current Time "+t);
for (int i = 0; i < y.length; i++) {
for (int k = n-1; k > 0; k--) {
y[i][k] = y[i][k-1];
}
y[i][0] += 0.10*Math.random() - 0.05;
if (Math.abs(y[i][0]) > 1) y[i][0] = 0.0;
}
}
repaint();
try {
Thread.sleep(50);
} catch (Exception e) {
}
}
}
/**
* Synchronize the paint method so it waits for the
* updates in run() to be ready.
*/
synchronized public void paint(java.awt.Graphics g) {
super.paint(g);
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
boolean exitOnClose = true;
if (args.length > 0 && args[0].equals("-noexit")) exitOnClose = false;
Strip strip = new Strip(exitOnClose);
strip.setVisible(true);
// Create thread to continually update chart
Thread thread = new Thread(strip);
thread.setDaemon(true);
thread.start();
}
}