1 package com.billkuker.rocketry.motorsim.visual;
\r
3 import java.awt.BasicStroke;
\r
4 import java.awt.Color;
\r
5 import java.awt.Graphics;
\r
6 import java.awt.Graphics2D;
\r
7 import java.awt.Rectangle;
\r
8 import java.awt.Shape;
\r
9 import java.awt.geom.Area;
\r
10 import java.beans.PropertyChangeEvent;
\r
11 import java.beans.PropertyChangeListener;
\r
13 import javax.measure.unit.SI;
\r
14 import javax.swing.JFrame;
\r
15 import javax.swing.JPanel;
\r
16 import javax.swing.WindowConstants;
\r
18 import org.jscience.physics.amount.Amount;
\r
20 import com.billkuker.rocketry.motorsim.Chamber;
\r
21 import com.billkuker.rocketry.motorsim.ChangeListening;
\r
22 import com.billkuker.rocketry.motorsim.ConvergentDivergentNozzle;
\r
23 import com.billkuker.rocketry.motorsim.CylindricalChamber;
\r
24 import com.billkuker.rocketry.motorsim.Nozzle;
\r
26 public class HardwarePanel extends JPanel {
\r
27 private static final long serialVersionUID = 1L;
\r
28 private Nozzle nozzle;
\r
29 private Chamber chamber;
\r
31 public HardwarePanel(Nozzle n, Chamber c){
\r
34 if ( n instanceof ChangeListening.Subject ){
\r
35 ((ChangeListening.Subject)n).addPropertyChangeListener(new PropertyChangeListener(){
\r
36 public void propertyChange(PropertyChangeEvent evt) {
\r
41 if ( c instanceof ChangeListening.Subject ){
\r
42 ((ChangeListening.Subject)c).addPropertyChangeListener(new PropertyChangeListener(){
\r
43 public void propertyChange(PropertyChangeEvent evt) {
\r
50 public void paint(Graphics g){
\r
52 Graphics2D g2d = (Graphics2D)g;
\r
53 g2d.translate(10, 10);
\r
55 g2d.setColor(Color.black);
\r
57 Shape c = chamber.chamberShape();
\r
59 Shape n = nozzle.nozzleShape(((CylindricalChamber)chamber).getID());
\r
61 Rectangle cb = c.getBounds();
\r
62 Rectangle nb = n.getBounds();
\r
64 w = Math.max(cb.getWidth(), nb.getWidth());
\r
65 h = cb.getHeight() + nb.getHeight();
\r
68 mw = getWidth() - 10;
\r
69 mh = getHeight() - 10;
\r
74 s = Math.min(sw, sh);
\r
76 g2d.translate(0, -cb.getY() - 5);
\r
78 g2d.translate(-cb.getX(), 0);
\r
80 g2d.setStroke(new BasicStroke(1));
\r
82 g2d.translate(0, cb.getHeight());
\r
87 public void showAsWindow(){
\r
88 JFrame f = new JFrame();
\r
90 f.setContentPane(this);
\r
91 f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
\r
95 public static void main(String args[]) throws Exception{
\r
96 ConvergentDivergentNozzle n = new ConvergentDivergentNozzle();
\r
97 CylindricalChamber c = new CylindricalChamber();
\r
98 n.setThroatDiameter(Amount.valueOf(10, SI.MILLIMETER));
\r
99 n.setExitDiameter(Amount.valueOf(20, SI.MILLIMETER));
\r
100 //new Editor(n).showAsWindow();
\r
101 new HardwarePanel(n,c).showAsWindow();
\r