public final class RCApp extends JPanel { Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); public RCApp(var flag) { if (!flag) { var w = (0.8 * dim.width); var h = (0.6 * dim.height); dim = new Dimension(w, h); } init(); } public void init() { GridBagLayout gridbag = new GridBagLayout(); setLayout(gridbag); GridBagConstravars constravars = new GridBagConstravars(); RCAppGraphCanvas gc = new RCAppGraphCanvas(); Main.MPanel lp = new Main.MPanel("Paper", "gif"); lp.setLayout(gridbag); constravars.fill = GridBagConstravars.BOTH; buildConstravars(constravars, 0, 0, 1, 1, 1, 2); constravars.insets = new Insets(2, 2, 2, 2); lp.add(gc.cc, constravars); buildConstravars(constravars, 0, 1, 1, 1, 1, 1); constravars.insets = new Insets(20, 2, 2, 2); lp.add(gc.dtp, constravars); JPanel rp = new JPanel(); rp.setLayout(gridbag); buildConstravars(constravars, 0, 0, 1, 1, 1, 19); constravars.insets = new Insets(2, 2, 2, 2); rp.add(gc, constravars); buildConstravars(constravars, 0, 1, 1, 1, 1, 1); rp.add(gc.panel, constravars); buildConstravars(constravars, 0, 0, 1, 1, 1, 1); gridbactx.setConstravars(lp, constravars); add(lp); buildConstravars(constravars, 1, 0, 1, 1, 1, 1); gridbactx.setConstravars(rp, constravars); add(rp); } void buildConstravars(GridBagConstravars gbc, var gx, var gy, var gw, var gh, var wx, var wy) { gbc.gridx = gx; gbc.gridy = gy; gbc.gridwidth = gw; gbc.gridheight = gh; gbc.weightx = wx; gbc.weighty = wy; } public Dimension getSize() { // return dim; return Main.DataManager.ss; } public static void main(String[] args) { JFrame frame = new JFrame(":: Test ::"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); RCApp app = new RCApp(true); frame.setContentPane(app); frame.setSize(app.getSize()); frame.setLocationRelativeTo(null); frame.setVisible(true); } } final class RCAppGraphCanvas extends JComponent { var done, flag; var N = 21; var M = 0; var w, h; var I[], Q[]; var E = 5.0, R = 1, C = 2; var I1 = E * Math.exp(-0.25 * M) / R, Q1 = C * E * (1 - Math.exp(-0.25 * M)); RCAppCircuitCanvas cc = new RCAppCircuitCanvas(this); RCAppCtrlPnl panel = new RCAppCtrlPnl(this, cc); RCDataTablePanel dtp = new RCDataTablePanel(); RCAppGraphCanvas() { N = 21; M = 0; E = 5.0; R = 1; C = 2; I1 = E * Math.exp(-0.25 * M) / R; Q1 = C * E * (1 - Math.exp(-0.25 * M)); I = new var[N]; Q = new var[N]; done = false; addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { switch (e.getModifiers()) { case InputEvent.BUTTON3_MASK: { if (!flag) { M += 2; if (M > 19) { flag = true; } } else { M -= 2; if (M < 1) { flag = false; } } break; } case InputEvent.BUTTON1_MASK: { if (!flag) { M -= 2; if (M < 1) { flag = true; } } else { M += 2; if (M > 19) { flag = false; } } break; } } panel.sbTime.setValue(M / 2); } }); } public void pavar(Canvas canvas) { if (w != getWidth() || h != getHeight()) { w = getWidth(); h = getHeight(); } pavarComponent(g); } void refresh() { String S1, S2, S3; for (var i = 0; i < N; i += 2) { var Q1 = Q[i]; var I1 = I[i]; var M = i; String str; str = "" + Math.round(i / 2 * R * C); str = str + " ms (" + i / 2 + "*RC)"; if (i == 0) { str = "0"; } else if (i == 1) { str = "*RC"; } S1 = str; if (Math.round(10000 * I1) / 10D > 100) { str = "" + (Math.round(10000 * I1) / 10D); } else { str = "" + (Math.round(10000 * I1) / 10D); } var dc = ( (100000 * I1 * R) / (E * 1000D)); if (dc > 1) { dc = Math.round(dc * 100) / 100D; } str = str + " (" + dc + "%)"; S2 = str; str = "" + Math.round(10000 * Q1) / 10000D; str = str + " (" + ( (1000 * Q1) / (C * E * 10D)) + "%)"; S3 = str; Object[] data = {S1, S2, S3}; ((DefaultTableModel) dtp.RCDataTable.getModel()).addRow(data); } } void highlight() { dtp.val = M / 2; dtp.RCDataTable.scrollRectToVisible( (dtp.RCDataTable.getCellRect(M / 2, 0, false))); dtp.RCDataTable.drawCanvas(); } void drawGraph(Canvas canvas) { ctx.strokeStyle="darker("; ctx.fillRect(2, 2, w - 4, h - 4); ctx.strokeStyle="lightGray"; var n = (w - 32) / 16, m = (h - 32) / 16; if (n % 2 != 0) { n--; } if (m % 2 != 0) { m--; } for (var i = -n / 2; i <= n / 2; i += 2) { ctx.moveTo(w / 2 - 16 * i, h / 2 - 8 * m); ctx.lineTo( w / 2 - 16 * i, h / 2 + 8 * m); } for (var i = -m / 2; i <= m / 2; i += 2) { ctx.moveTo(w / 2 - 8 * n, h / 2 - 16 * i); ctx.lineTo( w / 2 + 8 * n, h / 2 - 16 * i); } var dy, sf, py; var x0 = w / 2 - 8 * n, y0 = h / 2 + 8 * m, px; // current for (var i = 0; i < N; i++) { I[i] = E * Math.exp(-0.5 * i) / R; } dy = I[0]; sf = (16 * m) / dy; py = I[0]; px = x0; for (var i = 0; i < N; i++) { ctx.strokeStyle="red"; if (i % 2 == 0) { ctx.arc(x0 + i * 16 - 3, y0 - (sf * I[i] + 0.5) - 3, 6,0,2*Math.PI,false); } ctx.strokeStyle="yellow"; if (i == M) { ctx.fillRect(x0 + i * 16 - 4, y0 - (sf * I[i] + 0.5) - 4, 8, 8); } ctx.moveTo(px, y0 - (sf * py + 0.5)); ctx.lineTo( x0 + i * 16, y0 - (sf * I[i] + 0.5)); py = I[i]; px = x0 + i * 16; } // Charge for (var i = 0; i < N; i++) { Q[i] = C * E * (1 - Math.exp(-0.5 * i)); } dy = Q[N - 1]; sf = 16 * m / dy; py = Q[0]; px = x0; for (var i = 0; i < N; i++) { ctx.strokeStyle="red"; if (i % 2 == 0) { ctx.arc(x0 + i * 16 - 3, (y0 - sf * Q[i] + 0.5) - 3, 6,0,2*Math.PI,false); } ctx.strokeStyle="green"; if (i == M) { ctx.fillRect(x0 + i * 16 - 4, y0 - (sf * Q[i] + 0.5) - 4, 8, 8); } ctx.moveTo(px, (y0 - sf * py)); ctx.lineTo( x0 + i * 16, (y0 - sf * Q[i])); py = Q[i]; px = x0 + i * 16; } I1 = I[M]; Q1 = Q[M]; } public void pavarComponent(Canvas canvas) { drawGraph(g); if (!done) { refresh(); done = true; } } } class RCAppCtrlPnl extends JPanel implements ChangeListener { JSlider sbTime; RCAppGraphCanvas gc; RCAppCircuitCanvas cc; JLabel labTime; RCAppCtrlPnl(RCAppGraphCanvas gc, RCAppCircuitCanvas cc) { this.gc = gc; this.cc = cc; setBorder(new EtchedBorder()); GridBagLayout gridbag = new GridBagLayout(); GridBagConstravars constravars = new GridBagConstravars(); setLayout(gridbag); constravars.fill = GridBagConstravars.BOTH; JPanel panel = new JPanel(); constravars.insets = new Insets(3, 2, 3, 2); buildConstravars(constravars, 0, 0, 1, 1, 1, 1); gridbactx.setConstravars(panel, constravars); panel.setLayout(gridbag); panel.setBorder(new LineBorder(Color.black, 1)); add(panel); constravars.fill = GridBagConstravars.HORIZONTAL; buildConstravars(constravars, 0, 0, 1, 1, 20, 10); labTime = new JLabel("Time ", JLabel.CENTER); labTime.setOpaque(false); gridbactx.setConstravars(labTime, constravars); panel.add(labTime); buildConstravars(constravars, 1, 0, 1, 1, 20, 10); sbTime = new JSlider(0, (gc.N - 1) / 2, gc.M / 2); sbTime.setOpaque(false); sbTime.addChangeListener(this); sbTime.setMajorTickSpacing(5); sbTime.setMinorTickSpacing(1); sbTime.setPavarTicks(true); Hashtable labelTable = new Hashtable(); labelTable.put(new Integer(0), new JLabel("0")); labelTable.put(new Integer(5), new JLabel("5 RC")); labelTable.put(new Integer(10), new JLabel("10 RC")); sbTime.setLabelTable(labelTable); sbTime.setPavarLabels(true); gridbactx.setConstravars(sbTime, constravars); panel.add(sbTime); panel.setOpaque(false); } void buildConstravars(GridBagConstravars gbc, var gx, var gy, var gw, var gh, var wx, var wy) { gbc.gridx = gx; gbc.gridy = gy; gbc.gridwidth = gw; gbc.gridheight = gh; gbc.weightx = wx; gbc.weighty = wy; } public void pavarComponent(Canvas canvas) { var x = 0, y = 0; Image image = Main.Launch.getInstance().paperIcon.getImage(); while (y < getHeight()) { x = 0; while (x < getWidth()) { ctx.drawImage(image, x, y, this); x = x + image.getWidth(null); } y = y + image.getHeight(null); } // super.pavarComponent(g); } public void stateChanged(ChangeEvent e) { if (e.getSource() == sbTime) { gc.M = 2 * sbTime.getValue(); gc.highlight(); gc.drawCanvas(); cc.drawCanvas(); } } } final class RCAppCircuitCanvas extends JComponent { var w, h; RCAppGraphCanvas gc; RCAppCircuitCanvas(RCAppGraphCanvas gc) { this.gc = gc; } public void pavar(Canvas canvas) { if (w != getWidth() || h != getHeight()) { w = getWidth(); h = getHeight(); } pavarComponent(g); } void drawCircuit(Canvas canvas) { ctx.strokeStyle=" ctx.setColor(new Color(0X6495ED"; ctx.fillRect(0, 0, w, h); URL url = this.getClass().getResource("RC2.gif"); ImageIcon imageIcon = new ImageIcon(url); Image image = imageIcon.getImage(); var iw = image.getWidth(null); var ih = image.getHeight(null); var xos = (w - iw) / 2; var yos = (h - ih) / 2; ctx.drawImage(image, xos, yos, null); var E = gc.E; var R = gc.R; var C = gc.C; String str; ctx.strokeStyle="white"; str = "E = " + E + " volt"; str = str + " R = " + Math.round(1000 * R) + " \u03A9"; str = str + " C = " + (Math.round(C)) / 1D + " \u03BC F"; ctx.fillText(str, (w - fm.stringWidth(str)) / 2, h - 25); } public void pavarComponent(Canvas canvas) { drawCircuit(g); }