0% found this document useful (0 votes)
169 views

Programming Assignment Unit 6 1

This document describes modifications made to the DrawTextPanel.java file to allow it to store and display multiple text strings rather than just one. Key changes include: - Replacing the DrawTextItem variable that stored a single string with an ArrayList that can hold multiple DrawTextItem objects. - Updating methods like doMousePress() that add a new string to add it to the ArrayList rather than overwriting the single variable. - Adding menu options and methods to support loading/saving multiple strings from files and clearing all strings from the canvas. The class is used to display user-entered text on a canvas, allowing formatting options for each string, and maintains an ArrayList of DrawTextItem objects

Uploaded by

Majd Haddad
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
169 views

Programming Assignment Unit 6 1

This document describes modifications made to the DrawTextPanel.java file to allow it to store and display multiple text strings rather than just one. Key changes include: - Replacing the DrawTextItem variable that stored a single string with an ArrayList that can hold multiple DrawTextItem objects. - Updating methods like doMousePress() that add a new string to add it to the ArrayList rather than overwriting the single variable. - Adding menu options and methods to support loading/saving multiple strings from files and clearing all strings from the canvas. The class is used to display user-entered text on a canvas, allowing formatting options for each string, and maintains an ArrayList of DrawTextItem objects

Uploaded by

Majd Haddad
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 13

lOMoARcPSD|6755758

Programming Assignment Unit 6 1

Programming 2 (University of the People)

StuDocu is not sponsored or endorsed by any college or university


Downloaded by Majd Haddad (majdhaddad83@gmail.com)
lOMoARcPSD|6755758

Programming Assignment Unit 6

/**
* It is modified File DrawTextPanel.java
*/
package textcollage;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Scanner;

import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.JColorChooser;
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.JTextField;
import javax.swing.KeyStroke;

/**
* The panel that contains a large drawing area where strings
* it can be drawn. The strings are represented by objects of
* the type DrawTextItem. An input box under the panel allows
* of the user to specify what string will be drawn when the
* the user clicks on the drawing area of it.
*/
public class DrawTextPanel extends JPanel {

// It is now stands, this class can only show one string at


// the time! The data for that string is in the DrawTextItem object
// is the named theString. (If it's null, nothing is shown. This
// is variable should be replaced by a variable of type of an
// ArrayList<DrawStringItem> that can store multiple items on it.

Downloaded by Majd Haddad (majdhaddad83@gmail.com)


lOMoARcPSD|6755758

private ArrayList<DrawTextItem> theString = new ArrayList<DrawTextItem>();


// it change to an ArrayList<DrawTextItem> !

private Color currentTextColor = Color.BLACK;


// the color applied to new strings.

private Canvas canvas; // the drawing area.


private JTextField input; // where the user inputs the string that will be added
to the canvas
private SimpleFileChooser fileChooser; // for letting the user select files
private JMenuBar menuBar; // a menu bar with command that affect this panel
private MenuHandler menuHandler; // a listener that responds whenever the user
selects a menu command
private JMenuItem undoMenuItem; // the "Remove Item" command from the edit menu

/**
* An object of type Canvas is used for the drawing area.
* The canvas simply displays all the DrawTextItems that
* are stored in the ArrayList, strings.
*/
private class Canvas extends JPanel {
Canvas() {
setPreferredSize( new Dimension(800,600) );
setBackground(Color.LIGHT_GRAY);
setFont( new Font( "Serif", Font.BOLD, 24 ));
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
if (theString != null) {
for (DrawTextItem thisString: theString) {
thisString.draw(g);
}
}
}
}

/**
* An object of type MenuHandler is registered as the ActionListener
* for all the commands in the menu bar. The MenuHandler object
* simply calls doMenuCommand() when the user selects a command
* from the menu.
*/
private class MenuHandler implements ActionListener {
public void actionPerformed(ActionEvent evt) {
doMenuCommand( evt.getActionCommand());
}
}

/**
* Creates a DrawTextPanel. The panel has a large drawing area and

Downloaded by Majd Haddad (majdhaddad83@gmail.com)


lOMoARcPSD|6755758

* a text input box where the user can specify a string. When the
* user clicks the drawing area, the string is added to the drawing
* area at the point where the user clicked.
*/
public DrawTextPanel() {
fileChooser = new SimpleFileChooser();
undoMenuItem = new JMenuItem("Remove Item");
undoMenuItem.setEnabled(false);
menuHandler = new MenuHandler();
setLayout(new BorderLayout(3,3));
setBackground(Color.BLACK);
setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
canvas = new Canvas();
add(canvas, BorderLayout.CENTER);
JPanel bottom = new JPanel();
bottom.add(new JLabel("Text to add: "));
input = new JTextField("Hello I love the Univeristy of the People!", 40);
bottom.add(input);
add(bottom, BorderLayout.SOUTH);
canvas.addMouseListener( new MouseAdapter() {
public void mousePressed(MouseEvent e) {
doMousePress( e );
}
} );
}

/**
* This method is called when the user clicks the drawing area.
* A new string is added to the drawing area. The center of
* the string is at the point where the user clicked.
* @param e the mouse event that was generated when the user clicked
*/
public void doMousePress( MouseEvent e ) {
String text = input.getText().trim();
if (text.length() == 0) {
input.setText("Hello I love the Univeristy of the People!");
text = "Hello I love the Univeristy of the People!";
}
DrawTextItem s = new DrawTextItem( text, e.getX(), e.getY() );
s.setTextColor(currentTextColor); // Default is null, meaning default color of
the canvas (black).

// SOME OTHER OPTIONS THAT CAN BE APPLIED TO TEXT ITEMS:


// s.setFont( new Font( "Serif", Font.ITALIC + Font.BOLD, 12 )); //
Default is null, meaning font of canvas.
// s.setMagnification(3); // Default is 1, meaning no magnification.
// s.setBorder(true); // Default is false, meaning don't draw a border.
// s.setRotationAngle(25); // Default is 0, meaning no rotation.
// s.setTextTransparency(0.3); // Default is 0, meaning text is not at
all transparent.
// s.setBackground(Color.BLUE); // Default is null, meaning don't draw a
background area.
// s.setBackgroundTransparency(0.7); // Default is 0, meaning background
is not transparent.

Downloaded by Majd Haddad (majdhaddad83@gmail.com)


lOMoARcPSD|6755758

theString.add(s); // Set this string as the ONLY string to be drawn on the


canvas!
undoMenuItem.setEnabled(true);
canvas.repaint();
}

/**
* Returns a menu bar containing commands that affect this panel. The menu
* bar is meant to appear in the same window that contains this panel.
*/
public JMenuBar getMenuBar() {
if (menuBar == null) {
menuBar = new JMenuBar();

String commandKey; // for making keyboard accelerators for menu commands


if (System.getProperty("mrj.version") == null)
commandKey = "control "; // command key for non-Mac OS
else
commandKey = "meta "; // command key for Mac OS

JMenu fileMenu = new JMenu("File");


menuBar.add(fileMenu);
JMenuItem saveItem = new JMenuItem("Save...");
saveItem.setAccelerator(KeyStroke.getKeyStroke(commandKey + "N"));
saveItem.addActionListener(menuHandler);
fileMenu.add(saveItem);
JMenuItem openItem = new JMenuItem("Open...");
openItem.setAccelerator(KeyStroke.getKeyStroke(commandKey + "O"));
openItem.addActionListener(menuHandler);
fileMenu.add(openItem);
fileMenu.addSeparator();
JMenuItem saveImageItem = new JMenuItem("Save Image...");
saveImageItem.addActionListener(menuHandler);
fileMenu.add(saveImageItem);

JMenu editMenu = new JMenu("Edit");


menuBar.add(editMenu);
undoMenuItem.addActionListener(menuHandler); // undoItem was created in
the constructor
undoMenuItem.setAccelerator(KeyStroke.getKeyStroke(commandKey + "Z"));
editMenu.add(undoMenuItem);
editMenu.addSeparator();
JMenuItem clearItem = new JMenuItem("Clear");
clearItem.addActionListener(menuHandler);
editMenu.add(clearItem);

JMenu optionsMenu = new JMenu("Options");


menuBar.add(optionsMenu);
JMenuItem colorItem = new JMenuItem("Set Text Color...");
colorItem.setAccelerator(KeyStroke.getKeyStroke(commandKey + "T"));
colorItem.addActionListener(menuHandler);
optionsMenu.add(colorItem);
JMenuItem bgColorItem = new JMenuItem("Set Background Color...");
bgColorItem.addActionListener(menuHandler);
optionsMenu.add(bgColorItem);

Downloaded by Majd Haddad (majdhaddad83@gmail.com)


lOMoARcPSD|6755758

}
return menuBar;
}

/**
* Carry out one of the commands from the menu bar.
* @param command the text of the menu command.
*/
private void doMenuCommand(String command) {
if (command.equals("Save...")) { // save all the string info to a file
//JOptionPane.showMessageDialog(this, "Sorry, the Save command is not
implemented.");

File textFile = fileChooser.getOutputFile(this, "Select Text File Name",


"text.txt");
if (textFile == null)
return;
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(textFile));

// write bg color
bw.write(canvas.getHeight() + "~"+ canvas.getWidth()
+"~"+canvas.getBackground().getRGB());

for (DrawTextItem dti : theString) {


bw.write(System.lineSeparator());
bw.write(dti.getString()+"~"+dti.getX()+"~"+dti.getY()
+"~"+dti.getTextColor().getRGB()+"~"+dti.getRotationAngle());
}

bw.close();
}
catch (Exception e) {
JOptionPane.showMessageDialog(this,
"Sorry, an error occurred while trying to save the image
details:\n" + e);
}

}
else if (command.equals("Open...")) { // read a previously saved file, and
reconstruct the list of strings
//JOptionPane.showMessageDialog(this, "Sorry, the Open command is not
implemented.");
File textFile = fileChooser.getInputFile(this, "Select Text File Name");
if (textFile == null)
return;
try {
Scanner sc = new Scanner(textFile);
String meta = sc.nextLine();
canvas.setSize(Integer.parseInt(meta.split("~")[1]),
Integer.parseInt(meta.split("~")[0]));
canvas.setBackground(new Color(Integer.parseInt(meta.split("~")[2])));

Downloaded by Majd Haddad (majdhaddad83@gmail.com)


lOMoARcPSD|6755758

theString = new ArrayList<DrawTextItem>();


while(sc.hasNextLine()) {
String element = sc.nextLine();
DrawTextItem dti = new DrawTextItem(element.split("~")[0]);
dti.setX(Integer.parseInt(element.split("~")[1]));
dti.setY(Integer.parseInt(element.split("~")[2]));
dti.setTextColor(new Color(Integer.parseInt(element.split("~")
[3])));
dti.setRotationAngle(Double.parseDouble(element.split("~")[4]));
theString.add(dti);
}

//canvas.repaint();
sc.close();
}
catch (Exception e) {
JOptionPane.showMessageDialog(this,
"Sorry, an error occurred while trying to save the image
details:\n" + e);
}
canvas.repaint(); // (you'll need this to make the new list of strings
take effect)
}
else if (command.equals("Clear")) { // remove all strings
theString = new ArrayList<DrawTextItem>(); // Remove the ONLY string
from the canvas.
undoMenuItem.setEnabled(false);
canvas.repaint();
}
else if (command.equals("Remove Item")) { // remove the most recently added
string
theString.remove(theString.size()-1); // Remove the ONLY string from the
canvas.
if (theString.size()==0) {
undoMenuItem.setEnabled(false);
}
canvas.repaint();
}
else if (command.equals("Set Text Color...")) {
Color c = JColorChooser.showDialog(this, "Select Text Color",
currentTextColor);
if (c != null)
currentTextColor = c;
}
else if (command.equals("Set Background Color...")) {
Color c = JColorChooser.showDialog(this, "Select Background Color",
canvas.getBackground());
if (c != null) {
canvas.setBackground(c);
canvas.repaint();
}
}
else if (command.equals("Save Image...")) { // save a PNG image of the drawing
area

Downloaded by Majd Haddad (majdhaddad83@gmail.com)


lOMoARcPSD|6755758

File imageFile = fileChooser.getOutputFile(this, "Select Image File Name",


"textimage.png");
if (imageFile == null)
return;
try {
// Because the image is not available, I will make a new BufferedImage
and
// draw the same data to the BufferedImage as is shown in the panel.
// A BufferedImage is an image that is stored in memory, not on the
screen.
// There is a convenient method for writing a BufferedImage to a file.
BufferedImage image = new
BufferedImage(canvas.getWidth(),canvas.getHeight(),
BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setFont(canvas.getFont());
canvas.paintComponent(g); // draws the canvas onto the BufferedImage,
not the screen!
boolean ok = ImageIO.write(image, "PNG", imageFile); // write to the
file
if (ok == false)
throw new Exception("PNG format not supported (this shouldn't
happen!).");
}
catch (Exception e) {
JOptionPane.showMessageDialog(this,
"Sorry, an error occurred while trying to save the image:\n" +
e);
}
}
}

Please check the print screen below.

Downloaded by Majd Haddad (majdhaddad83@gmail.com)


lOMoARcPSD|6755758

Downloaded by Majd Haddad (majdhaddad83@gmail.com)


lOMoARcPSD|6755758

Downloaded by Majd Haddad (majdhaddad83@gmail.com)


lOMoARcPSD|6755758

Downloaded by Majd Haddad (majdhaddad83@gmail.com)


lOMoARcPSD|6755758

Downloaded by Majd Haddad (majdhaddad83@gmail.com)


lOMoARcPSD|6755758

Downloaded by Majd Haddad (majdhaddad83@gmail.com)

You might also like