Java program that enables the user to specify the location and size of the recta
ID: 672052 • Letter: J
Question
Java program that enables the user to specify the location and size of the rectangles and displays weather the two rectangles intersect. Enable the user to point the mouse inside a rectangle and drag it. As the rectangle is being dragged, the rectangle's center coordinates in the text fields are updated.
this is an example by every text field should be displayed in the gui
import java.awt.Color;
import java.awt.Graphics;
import java.util.Scanner;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class RectangleIntersect extends JPanel{
static int x1,x2,y1,y2,w1,w2,h1,h2;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Enter Details for Rectangle 1... ");
System.out.print("Center Co-ordinate 'X': ");
x1 = in.nextInt();
System.out.print("Center Co-ordinate 'Y': ");
y1 = in.nextInt();
System.out.print("Width: ");
w1 = in.nextInt();
System.out.print("Height: ");
h1 = in.nextInt();
System.out.println("Enter Details for Rectangle 2... ");
System.out.print("Center Co-ordinate 'X': ");
x2 = in.nextInt();
System.out.print("Center Co-ordinate 'Y': ");
y2 = in.nextInt();
System.out.print("Width: ");
w2 = in.nextInt();
System.out.print("Height: ");
h2 = in.nextInt();
in.close();
JFrame window = new JFrame("Exercise 14_23");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setSize(300, 300);
window.getContentPane().setLayout(null);
String message;
if(x2> x1+w1 && y2> y1+h1){
message = "The Rectangles do not overlap";
}
else if(x1> x2+w2 && y1> y2+h2){
message = "The Rectangles do not overlap";
}
else if(x2>x1 && x2+w2<x1+w1){
message = "One Rectangle is contained in another";
}
else if(x1>x2 && x1+w1<x2+w2){
message = "One Rectangle is contained in another";
}
else{
message = "The Rectangles overlap";
}
JPanel panel = new RectangleIntersect();
panel.setBounds(10, 10, 265, 210);
panel.setBackground(Color.WHITE);
window.getContentPane().add(panel);
JLabel label = new JLabel(message);
label.setBounds(10, 230, 265, 20);
window.getContentPane().add(label);
window.setVisible(true);
}
public void paint(Graphics g){
g.drawRect(x1, y1, w1, h1);
g.drawRect(x2, y2, w2, h2);
}
}
Explanation / Answer
import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.RenderingHints; import java.awt.Shape; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.geom.Ellipse2D; import java.awt.geom.Line2D; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Iterator; import java.util.Scanner; import javax.imageio.ImageIO; import javax.swing.Box; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JColorChooser; import javax.swing.JComponent; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JSeparator; import javax.swing.JSlider; import javax.swing.JTextField; import javax.swing.SwingConstants; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.filechooser.FileNameExtensionFilter; public class Lesson49_1 extends JFrame { private static final long serialVersionUID = -140274271716086522L; JMenuBar menubar; JMenu File, Exit; JMenuItem New, Open; JComponent DrawingBoard; JButton lineBut, ellipseBut, rectBut, strokeBut; DecimalFormat dec = new DecimalFormat("#.##"); // Contains all of the rules for drawing Graphics2D graphSettings; int currentAction = 1; // Transparency of the shape Color strokeColor = Color.BLACK; public static void main(String[] args) { new Lesson49_1(); } public Lesson49_1() { this.setSize(800, 600); this.setTitle("ERD BUILDER"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setJMenuBar(menubar); JMenuBar menuBar = new JMenuBar(); setJMenuBar(menuBar); JMenu fileMenu = new JMenu("File"); JMenu editMenu = new JMenu("Edit"); JMenu dbMenu = new JMenu("Database"); JMenu ToolsMenu = new JMenu("Tools"); JMenu HelpMenu = new JMenu("Help"); menuBar.add(fileMenu); menuBar.add(editMenu); menuBar.add(dbMenu); menuBar.add(ToolsMenu); menuBar.add(HelpMenu); // Create and add simple menu item to one of the drop down menu JMenuItem newAction = new JMenuItem("New Project"); JMenuItem openAction = new JMenuItem("Open File"); JMenuItem exitAction = new JMenuItem("Quit"); JMenuItem cutAction = new JMenuItem("Cut"); JMenuItem copyAction = new JMenuItem("Copy"); JMenuItem pasteAction = new JMenuItem("Paste"); JMenuItem UndoAction = new JMenuItem("Undo"); JMenuItem RedoAction = new JMenuItem("Redo"); JMenuItem clearAction = new JMenuItem("Clear"); JMenuItem saveAction = new JMenuItem("Save"); JMenuItem exportAction = new JMenuItem("Export"); JMenuItem printAction = new JMenuItem("Print"); JMenuItem ConvertAction = new JMenuItem("Convert To Tables"); JMenuItem ColorAction = new JMenuItem("Color Picker"); JMenuItem ZoomAction = new JMenuItem("Zoom"); JMenuItem EntityAction = new JMenuItem("Entity & Attributes"); JMenuItem RelationshipAction = new JMenuItem("Relationship Attributes"); JMenuItem HelpAction = new JMenuItem("Help"); JMenuItem AboutAction = new JMenuItem("About"); fileMenu.add(newAction); fileMenu.addSeparator(); fileMenu.add(openAction); fileMenu.addSeparator(); fileMenu.add(saveAction); fileMenu.addSeparator(); fileMenu.add(exportAction); fileMenu.addSeparator(); fileMenu.add(printAction); fileMenu.addSeparator(); fileMenu.add(exitAction); editMenu.add(UndoAction); editMenu.addSeparator(); editMenu.add(RedoAction); editMenu.addSeparator(); editMenu.add(cutAction); editMenu.addSeparator(); editMenu.add(copyAction); editMenu.addSeparator(); editMenu.add(pasteAction); editMenu.addSeparator(); editMenu.add(clearAction); dbMenu.add(ConvertAction); ToolsMenu.add(ColorAction); ToolsMenu.addSeparator(); ToolsMenu.add(ZoomAction); ToolsMenu.addSeparator(); ToolsMenu.add(EntityAction); ToolsMenu.addSeparator(); ToolsMenu.add(RelationshipAction); HelpMenu.add(HelpAction); HelpMenu.addSeparator(); HelpMenu.add(AboutAction); exitAction.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { }} ); ConvertAction.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { new ConvertForm().setVisible(true); }} ); newAction.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { new Lesson49_1().setVisible(true); } }); JPanel buttonPanel = new JPanel(); JPanel FieldPanel = new JPanel(); // Swing box that will hold all the buttons Box theBox = Box.createVerticalBox(); Box theBoxs = Box.createVerticalBox(); // Make all the buttons in makeMeButtons by passing the // button icon. lineBut = makeMeButtons("./src/line.png", 2); ellipseBut = makeMeButtons("./src/ellipse.png", 3); rectBut = makeMeButtons("./src/rectangle.png", 4); strokeBut = makeMeColorButton("./src/stroke.png", 5, true); //theBox.add(brushBut); theBox.add(lineBut); theBox.add(ellipseBut); theBox.add(rectBut); theBox.add(strokeBut); buttonPanel.add(theBox); FieldPanel.add(theBoxs); this.add(buttonPanel, BorderLayout.WEST); this.add(FieldPanel, BorderLayout.EAST); buttonPanel.setPreferredSize(new Dimension(200,480)); FieldPanel.setPreferredSize(new Dimension(200,480)); // Make the drawing area take up the rest of the frame // this.add(new DrawingBoard(), BorderLayout.CENTER); final DrawingBoard drawPanel = new DrawingBoard(); this.add(drawPanel, BorderLayout.CENTER); this.getContentPane().setBackground(Color.WHITE); exportAction.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { BufferedImage image = new BufferedImage(drawPanel.getWidth(), drawPanel.getHeight(), BufferedImage.TYPE_INT_ARGB); Graphics2D g = image.createGraphics(); drawPanel.paint(g); g.dispose(); JFileChooser fileChooser = new JFileChooser(); File theDirectory = new File("C:/Users/Wenda/Desktop"); fileChooser.setCurrentDirectory(theDirectory); FileNameExtensionFilter pngFilter = new FileNameExtensionFilter( "PNG file (*.png)", "png"); fileChooser.addChoosableFileFilter(pngFilter); fileChooser.setFileFilter(pngFilter); int status = fileChooser.showSaveDialog(Lesson49_1.this); if (status == JFileChooser.APPROVE_OPTION) { try { ImageIO.write(image, "png", fileChooser.getSelectedFile()); JOptionPane.showMessageDialog(null, "Image saved to " + fileChooser.getSelectedFile().getName()); } catch (Exception ex) { ex.printStackTrace(); } } } }); // Show the frame this.setVisible(true); } public JButton makeMeButtons(String iconFile, final int actionNum) { JButton theBut = new JButton(); Icon butIcon = new ImageIcon(iconFile); theBut.setIcon(butIcon); theBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { currentAction = actionNum; } }); return theBut; } // Spits out buttons based on the image supplied and // whether a stroke or fill is to be defined public JButton makeMeColorButton(String iconFile, final int actionNum, final boolean stroke) { JButton theBut = new JButton(); Icon butIcon = new ImageIcon(iconFile); theBut.setIcon(butIcon); theBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (stroke) { // JColorChooser is a popup that lets you pick a color strokeColor = JColorChooser.showDialog(null, "Pick a Stroke", Color.BLACK); } else { } } }); return theBut; } public class DrawingBoard extends JComponent { private static final long serialVersionUID = -4431176095451940075L; // ArrayLists that contain each shape drawn along with // that shapes stroke and fill ArrayList shapes = new ArrayList(); ArrayList shapeStroke = new ArrayList(); Point drawStart, drawEnd; // Monitors events on the drawing area of the frame public DrawingBoard() { this.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { if (currentAction != 1) { // When the mouse is pressed get x & y position drawStart = new Point(e.getX(), e.getY()); drawEnd = drawStart; repaint(); } } public void mouseReleased(MouseEvent e) { if (currentAction != 1) { Shape aShape = null; if (currentAction == 2) { aShape = drawLine(drawStart.x, drawStart.y, e.getX(), e.getY()); shapes.add(aShape); shapeStroke.add(strokeColor); drawStart = null; drawEnd = null; repaint(); } else if (currentAction == 3) { aShape = drawEllipse(drawStart.x, drawStart.y, e.getX(), e.getY()); shapes.add(aShape); shapeStroke.add(strokeColor); drawStart = null; drawEnd = null; repaint(); new AttributeForm().setVisible(true); } else if (currentAction == 4) { // Create a new rectangle using x & y coordinates aShape = drawRectangle(drawStart.x, drawStart.y, e.getX(), e.getY()); shapes.add(aShape); shapeStroke.add(strokeColor); drawStart = null; drawEnd = null; repaint(); new EntityForm().setVisible(true); } // Add shapes, fills and colors to there ArrayLists } } }); this.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent me) { JTextField name = new JTextField(15); super.mouseClicked(me); for (Shape s : shapes) { if (s.contains(me.getPoint())) {//check if mouse is clicked within shape //we can either just print out the object class name System.out.println("Clicked a "+s.getClass().getName()); //or check the shape class we are dealing with using instance of with nested if if (s instanceof Rectangle2D) { //create table } else if (s instanceof Ellipse2D) { } } } } }); this.addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { // If this is a brush have shapes go on the screen quickly if (currentAction == 1) { int x = e.getX(); int y = e.getY(); Shape aShape = null; shapes.add(aShape); shapeStroke.add(strokeColor); // Add the transparency value } // Get the final x & y position after the mouse is dragged drawEnd = new Point(e.getX(), e.getY()); repaint(); } }); } public void paint(Graphics g) { // Class used to define the shapes to be drawn graphSettings = (Graphics2D) g; // Antialiasing cleans up the jagged lines and defines rendering // rules graphSettings.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // Defines the line width of the stroke graphSettings.setStroke(new BasicStroke(4)); // Iterators created to cycle through strokes and fills Iterator strokeCounter = shapeStroke.iterator(); for (Shape s : shapes) { // Grabs the next stroke from the color arraylist graphSettings.setPaint(strokeCounter.next()); graphSettings.draw(s); } // Guide shape used for drawing if (drawStart != null && drawEnd != null) { // Makes the guide shape transparent graphSettings.setComposite(AlphaComposite.getInstance( AlphaComposite.SRC_OVER, 0.40f)); // Make guide shape gray for professional look graphSettings.setPaint(Color.LIGHT_GRAY); Shape aShape = null; if (currentAction == 2) { aShape = drawLine(drawStart.x, drawStart.y, drawEnd.x, drawEnd.y); } else if (currentAction == 3) { aShape = drawEllipse(drawStart.x, drawStart.y, drawEnd.x, drawEnd.y); } else if (currentAction == 4) { // Create a new rectangle using x & y coordinates aShape = drawRectangle(drawStart.x, drawStart.y, drawEnd.x, drawEnd.y); } graphSettings.draw(aShape); } } private Rectangle2D.Float drawRectangle(int x1, int y1, int x2, int y2) { // Get the top left hand corner for the shape // Math.min returns the points closest to 0 int x = Math.min(x1, x2); int y = Math.min(y1, y2); // Gets the difference between the coordinates and int width = Math.abs(x1 - x2); int height = Math.abs(y1 - y2); return new Rectangle2D.Float(x, y, width, height); } private Ellipse2D.Float drawEllipse(int x1, int y1, int x2, int y2) { int x = Math.min(x1, x2); int y = Math.min(y1, y2); int width = Math.abs(x1 - x2); int height = Math.abs(y1 - y2); return new Ellipse2D.Float(x, y, width, height); } private Line2D.Float drawLine(int x1, int y1, int x2, int y2) { return new Line2D.Float(x1, y1, x2, y2); } } }Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.