/** @author Scott Marshall @author University of Glasgow, MSc IT Project 2001 @author Building an OnLine Course in Computing Fundamentals */ package ukacgla_ATT; import javax.swing.*; import javax.swing.border.Border; import javax.swing.event.*; import java.awt.*; import java.awt.event.*; /** Provides drawing instruction for logic gates. */ abstract public class circuitGraphics extends JPanel{ private int scale = 30; public JInternalFrame graphicsFrame; protected frameMaker gui; protected TTRandom random; protected JPanel host; public circuitGraphics(frameMaker g, TTRandom r){ gui = g; random = r; host = this; graphicsFrame = gui.mkFrame("Circuit Diagram", false, true,5,gui.getInternalFrameHeight()+10, 500, 275); graphicsFrame.getContentPane().add(host); gui.addFrame(graphicsFrame); graphicsFrame.setVisible(true); graphicsFrame.revalidate(); } /** Gate 1 to be drawn at point 50,35 Gate 2 to be drawn at point 50,165 Gate 3 to be drawn at point 300,100 */ public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; //Instantiate graphics object } /** Draws an Inverter gate at specified location */ protected void drawInverter(Graphics g, int xStart, int yStart) { int[] xPoints = { xStart,xStart,xStart+scale }; int[] yPoints = { yStart,yStart+scale,yStart+(scale/2)}; int nPoints = 3; //draw and fill polygon g.setColor(Color.white); g.fillPolygon(xPoints,yPoints,nPoints); g.setColor(Color.black); //draw triangle to complete the border g.drawLine(xStart,yStart,xStart,yStart+scale); g.drawLine(xStart,yStart+scale,xStart+scale,yStart+(scale/2)); g.drawLine(xStart+scale,yStart+(scale/2),xStart,yStart); //draw circle at the end of the triangle drawInverterCircle(g, xStart-15, yStart); } /** Draws an And gate at specified location */ protected void drawAndGate(Graphics g, int xStart, int yStart){ //draw basic white shapes g.setColor(Color.white); g.fillRect(xStart,yStart,scale,scale); g.fillArc(xStart+(scale/2),yStart,scale,scale,0,360); //draw borders g.setColor(Color.black); g.drawArc(xStart+(scale/2),yStart,scale,scale,0,90); g.drawArc(xStart+(scale/2),yStart,scale,scale,0,-90); g.drawLine(xStart,yStart,xStart+scale,yStart); g.drawLine(xStart,yStart,xStart,yStart+scale); g.drawLine(xStart,yStart+scale,xStart+scale,yStart+scale); } /** Draws a Nand gate at specified location */ protected void drawNandGate(Graphics g, int xStart, int yStart){ drawAndGate(g, xStart, yStart); drawInverterCircle(g, xStart, yStart); } /** Draws an Or gate at specified location */ protected void drawOrGate(Graphics g, int xStart, int yStart) { int[] xPoints = {xStart,xStart+5,xStart+10,xStart+15,xStart+20,xStart+25, xStart+30,xStart+25,xStart+20,xStart+15,xStart+10,xStart+5, xStart,xStart+2,xStart+4,xStart+5,xStart+4,xStart+2,xStart }; int[] yPoints = {yStart,yStart,yStart+1,yStart+3,yStart+6,yStart+10, yStart+15,yStart+20,yStart+24,yStart+27,yStart+29,yStart+30,yStart+30,yStart+25, yStart+20,yStart+15,yStart+10,yStart+5,yStart }; int nPoints = 19; g.setColor(Color.white); g.fillPolygon(xPoints,yPoints,nPoints); g.setColor(Color.black); g.drawPolygon(xPoints,yPoints,nPoints); } /** Draws an ExclusiveOr gate at specified location */ protected void drawXOrGate(Graphics g, int xStart, int yStart){ //draw body int[] xPoints = {xStart,xStart+5,xStart+10,xStart+15,xStart+20,xStart+25, xStart+30,xStart+25,xStart+20,xStart+15,xStart+10,xStart+5, xStart,xStart+2,xStart+4,xStart+5,xStart+4,xStart+2,xStart }; int[] yPoints = {yStart,yStart,yStart+1,yStart+3,yStart+6,yStart+10, yStart+15,yStart+20,yStart+24,yStart+27,yStart+29,yStart+30,yStart+30,yStart+25, yStart+20,yStart+15,yStart+10,yStart+5,yStart }; int nPoints = 19; g.setColor(Color.white); g.fillPolygon(xPoints,yPoints,nPoints); g.setColor(Color.black); g.drawPolygon(xPoints,yPoints,nPoints); // draw rear line int rearStart = xStart-scale; g.drawArc(rearStart,yStart,scale,scale,0,2 * scale); g.drawArc(rearStart,yStart,scale,scale,0,-2 * scale); } /** Draws a circle at the end of a symbol at specified location */ protected void drawInverterCircle(Graphics g, int xStart, int yStart){ int diameter = 10; g.setColor(Color.white); g.fillOval(xStart + scale + scale/2, yStart+(scale/2)-(diameter/2),diameter,diameter); g.setColor(Color.black); g.drawOval(xStart + scale + scale/2, yStart+(scale/2)-(diameter/2),diameter,diameter); } /** Closes JInternalFrame holding the circuit diagram */ public void closeFrame(){ gui.closeFrame(graphicsFrame); } }//ends class