import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.Point; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.WindowConstants; public class Visualizer extends JFrame { private static final long serialVersionUID = -6754436015453195809L; private static final int RANGE = 512; JProgressBar panX, panY, tiltX, tiltY, twist, zoom; JPanel panXY, tiltXY, twistZoomXY; JLabel leftButton; JLabel rightButton; public Visualizer() { super("SpaceNavigator PE Visualizer"); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); initComponents(); pack(); setPreferredSize(new Dimension(640, 480)); setVisible(true); } public void setPanXValue(int value) { // pan left/right axis panX.setValue(value); drawCrossHair(panXY, panX.getValue(), panY.getValue() * -1, "Pan"); } public void setPanYValue(int value) { // pan fwd/back axis panY.setValue(value); drawCrossHair(panXY, panX.getValue(), panY.getValue() * -1, "Pan"); } public void setZoomValue(int value) { // push/pull axis zoom.setValue(value); drawCrossHair(twistZoomXY, twist.getValue(), zoom.getValue() * -1, "Zoom/Twist"); } public void setTiltYValue(int value) { // tilt fwd/back axis tiltY.setValue(value); drawCrossHair(tiltXY, tiltX.getValue(), tiltY.getValue() * -1, "Tilt"); } public void setTiltXValue(int value) { // tilt left/right axis tiltX.setValue(value); drawCrossHair(tiltXY, tiltX.getValue(), tiltY.getValue() * -1, "Tilt"); } public void setTwistValue(int value) { // twist axis twist.setValue(value); drawCrossHair(twistZoomXY, twist.getValue(), zoom.getValue(), "Zoom/Twist"); } public void setButtonsValue(int buttons_mask) { if (buttons_mask == 1 || buttons_mask == 3) { leftButton.setText("ON"); } else { leftButton.setText("OFF"); } if (buttons_mask == 2 || buttons_mask == 3) { rightButton.setText("ON"); } else { rightButton.setText("OFF"); } } private void drawCrossHair(JPanel panel, int x, int y, String text) { clearPanel(panel); Point point = calcualteCoordinates(panel, x, y); Graphics g = panel.getGraphics(); g.setColor(Color.GREEN); g.drawString(text, 5, 10); g.drawLine(point.x - 3, point.y, point.x + 3, point.y); g.drawLine(point.x, point.y - 3, point.x, point.y + 3); } private Point calcualteCoordinates(JPanel panel, int x, int y) { int width = panel.getWidth(); int halfWidth = (int) ((double) width / (double) 2); double xMultiplier = halfWidth / (double) RANGE; if (x == 0) { x = halfWidth; } else { x = (int) (x * xMultiplier + halfWidth); } int height = panel.getHeight(); int halfHeight = (int) ((double) height / (double) 2); double yMultiplier = halfHeight / (double) RANGE; if (y == 0) { y = halfHeight; } else { y = (int) (y * yMultiplier + halfHeight); } return new Point(x, y); } private void clearPanel(JPanel panel) { Graphics g = panel.getGraphics(); g.setColor(Color.BLACK); g.fillRect(0, 0, panel.getWidth(), panel.getHeight()); } private void initComponents() { Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); Container pan = new Container(); pan.setLayout(new BorderLayout()); Container tilt = new Container(); tilt.setLayout(new BorderLayout()); Container twistZoom = new Container(); twistZoom.setLayout(new BorderLayout()); Container valuesContainer = new Container(); valuesContainer.setLayout(new FlowLayout()); JLabel leftButtonLabelText = new JLabel("Left Button: "); leftButton = new JLabel("OFF"); JLabel spaceLabelText = new JLabel(" "); JLabel rightButtonLabelText = new JLabel("Right Button: "); rightButton = new JLabel("OFF"); valuesContainer.add(leftButtonLabelText); valuesContainer.add(leftButton); valuesContainer.add(spaceLabelText); valuesContainer.add(rightButtonLabelText); valuesContainer.add(rightButton); panXY = new JPanel(); tiltXY = new JPanel(); twistZoomXY = new JPanel(); contentPane.add(valuesContainer, BorderLayout.NORTH); contentPane.add(pan, BorderLayout.WEST); contentPane.add(tilt, BorderLayout.CENTER); contentPane.add(twistZoom, BorderLayout.EAST); panX = new JProgressBar(JProgressBar.HORIZONTAL, -RANGE, RANGE); panX.setValue(0); panY = new JProgressBar(JProgressBar.VERTICAL, -RANGE, RANGE); panY.setValue(0); pan.add(panX, BorderLayout.SOUTH); pan.add(panY, BorderLayout.WEST); pan.add(panXY, BorderLayout.CENTER); tiltX = new JProgressBar(JProgressBar.HORIZONTAL, -RANGE, RANGE); tiltX.setValue(0); tiltY = new JProgressBar(JProgressBar.VERTICAL, -RANGE, RANGE); tiltY.setValue(0); tilt.add(tiltX, BorderLayout.SOUTH); tilt.add(tiltY, BorderLayout.WEST); tilt.add(tiltXY, BorderLayout.CENTER); twist = new JProgressBar(JProgressBar.HORIZONTAL, -RANGE, RANGE); twist.setValue(0); zoom = new JProgressBar(JProgressBar.VERTICAL, -RANGE, RANGE); zoom.setValue(0); twistZoom.add(twist, BorderLayout.SOUTH); twistZoom.add(zoom, BorderLayout.WEST); twistZoom.add(twistZoomXY, BorderLayout.CENTER); } }