import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
/**
* DrawFrame2
- Allows user to draw, save, and open line
* pictures (when completed). Features Object IO.
*
* @author Todd Neller
* @version 1.0
*/
public class DrawFrame2 extends JFrame
{
ArrayList lines = new ArrayList();
JPanel drawPanel;
public DrawFrame2()
{
addDrawPanel();
addLineListener();
addMenuBar();
setSize(new Dimension(400, 400));
}
void addDrawPanel()
{
class DrawPanel extends JPanel
{
public void paint(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
for (Line2D.Double line : lines)
g2.draw(line);
}
}
drawPanel = new DrawPanel();
add(drawPanel);
}
void addLineListener()
{
class LineListener extends MouseAdapter
{
int pressX, pressY;
public void mousePressed(MouseEvent e)
{
pressX = e.getX();
pressY = e.getY();
}
public void mouseReleased(MouseEvent e)
{
lines.add(new Line2D.Double(pressX, pressY, e.getX(), e.getY()));
repaint();
}
}
drawPanel.addMouseListener(new LineListener());
}
void addMenuBar()
{
// Create open item
JMenuItem openItem = new JMenuItem("Open");
class OpenListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
// Read line data from chosen file
try {
JFileChooser chooser = new JFileChooser();
if (chooser.showOpenDialog(null) ==
JFileChooser.APPROVE_OPTION) {
File f = chooser.getSelectedFile();
ObjectInputStream in = new ObjectInputStream(new FileInputStream(f));
lines.clear();
int numLines = in.readInt();
for (int i = 0; i < numLines; i++)
lines.add(new Line2D.Double(in.readDouble(),
in.readDouble(),
in.readDouble(),
in.readDouble()));
in.close();
repaint();
}
}
catch (Exception ex){
ex.printStackTrace();
}
}
}
openItem.addActionListener(new OpenListener());
// Create save item
JMenuItem saveItem = new JMenuItem("Save");
class SaveListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
try {
// Save line data to chosen file
JFileChooser chooser = new JFileChooser();
if (chooser.showOpenDialog(null) ==
JFileChooser.APPROVE_OPTION) {
File f = chooser.getSelectedFile();
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f));
out.writeInt(lines.size());
for (Line2D.Double line : lines) {
out.writeDouble(line.getX1());
out.writeDouble(line.getY1());
out.writeDouble(line.getX2());
out.writeDouble(line.getY2());
}
out.close();
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}
saveItem.addActionListener(new SaveListener());
// Add items to file menu
JMenu fileMenu = new JMenu("File");
fileMenu.add(openItem);
fileMenu.add(saveItem);
// Add file menu to menu bar and set frame menu bar
JMenuBar menuBar = new JMenuBar();
menuBar.add(fileMenu);
setJMenuBar(menuBar);
}
public static void main(String[] args)
{
JFrame frame = new DrawFrame2();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}