package spectral; import java.awt.FontMetrics; import java.awt.Graphics; public class SpectrumChart { private Spectrum spectrum; public SpectrumChart() { this.spectrum = null; } public SpectrumChart(Spectrum spectrum) { this.spectrum = spectrum; } public void setSpectrum(Spectrum spectrum) { this.spectrum = spectrum; } public void paint(Graphics g, int w, int h) { if (this.spectrum == null) return; int signalHeight = h / 2; int layerHeight = 10; int layerIndex = 0; int previousX = 0; FontMetrics fm = g.getFontMetrics(); double maxSignal = 0; for (Signal signal : this.spectrum.getSignals()) { if (signal.getShift() > maxSignal) maxSignal = signal.getShift(); } maxSignal += 10; // fudge factor to get text boxes in FIXME double scale = w / maxSignal; for (Signal signal : this.spectrum.getSignals()) { int signalPos = w - (int) (signal.getShift() * scale); g.drawLine(signalPos, signalHeight, signalPos, h); String signalLabel = String.valueOf((int)signal.getShift()); // TODO : center label double stringWidth = fm.getStringBounds(signalLabel, g).getWidth(); int halfWidth = (int)(stringWidth / 2); int currentX = signalPos - halfWidth; if (previousX >= currentX) { layerIndex++; } else { layerIndex = 0; } int labelHeight = signalHeight - (layerHeight * layerIndex); g.drawString(signalLabel, signalPos - halfWidth, labelHeight); previousX = signalPos + halfWidth; } } public static void main(String[] args) { // test String spectrum = "30;0|31;0|32;0|51;0|52;0|"; javax.swing.JFrame frame = new javax.swing.JFrame(); SpectrumPanel panel = new SpectrumPanel(new Spectrum(spectrum, 1)); frame.add(panel); frame.setSize(new java.awt.Dimension(400, 400)); frame.setVisible(true); } }