GrowWire modifies GrowPath
to operate within a GridPanel environment and
construct Wire objects.
Like GrowPath the user clicks the mouse to start wire or to add a new point.
Double click to end the wire.
GrowWire.javaimport java.io.*;
import java.util.ArrayList;
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
public class GrowWire extends GridPanel implements MouseMotionListener {
Wire path = null;
ArrayList<Wire> wlist = new ArrayList<Wire>();
JLabel status = new JLabel(" ");
JButton save = new JButton("Save");
//Point2D loc = null;
int nc = 0;
Point base, current;
boolean in_progress = false;
boolean starting = false;
GrowWire()
{
status.setBackground(Color.WHITE);
status.setOpaque(true);
status.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
save.addActionListener(actionEvent -> showPath("wires.txt"));
addMouseMotionListener(this);
addMouseListener(new MouseHandler());
}
public void read(File file)
{
String delims = "[\\s]+";
try (BufferedReader br = new BufferedReader(new FileReader(file));)
{
String CurrentLine;
while ((CurrentLine = br.readLine()) != null)
{
// debug: System.out.println(CurrentLine);
//Split each line of text file
String[] tokens = (CurrentLine.trim().split(delims));
if (tokens[0].equals("W")) {
Wire w = new Wire(tokens);
wlist.add(w);
}
}
br.close();
}
catch (IOException e) {
JOptionPane.showMessageDialog(null, e);
System.err.println(e);
}
}
public void drawContent(Graphics g) {
for (Wire w: wlist) w.draw(g);
if (path!=null) path.draw(g);
}
private class MouseHandler extends MouseAdapter
{
public void mousePressed(MouseEvent e)
{
Point2D src;
Point2D grid = new Point2D.Double();
if (in_progress) {
if (e.getClickCount()>1) {
in_progress = false;
wlist.add(path);
path = null;
}
else {
src = new Point2D.Double(current.getX(),current.getY());
tf.transform(src,grid);
path.add(grid.getX(),-grid.getY());
base = current;
repaint();
//System.out.println("LineTo " + x + " " + y);
//to = new LineTo(x,y);
//path.getElements().add(to);
}
}
else {
in_progress = true;
starting = true;
base = e.getPoint();
current = base;
path = new Wire();
src = new Point2D.Double(base.getX(),base.getY());
tf.transform(src,grid);
path.add(grid.getX(),-grid.getY());
}
}
public void mouseReleased(MouseEvent e)
{
}
}
public void mouseMoved(MouseEvent event)
{
if (!in_progress) return;
Graphics g = getGraphics();
Graphics2D g2 = (Graphics2D) g;
int bx = base.x;
int by = base.y;
g.setXORMode(Color.WHITE);
g2.setStroke(new BasicStroke(2.5f,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));
// clear old line
if (!starting) g.drawLine(bx,by,current.x,current.y);
else starting = false;
current = event.getPoint();
// xor new line
g.drawLine(bx,by,current.x,current.y);
g.setPaintMode();
g.setColor(Color.BLACK);
}
public void mouseDragged(MouseEvent event)
{
}
public void showPath(String filename) {
double x, y;
double xr, yr;
try (
BufferedWriter bw = new BufferedWriter(new FileWriter(filename));
) {
for (Wire w: wlist) {
bw.write(w.toString());
bw.newLine();
}
bw.close();
} catch (IOException e) {
System.err.println("I/O Exception: " + e);
}
}
static public void main(String[] args) {
GrowWire panel = new GrowWire();
if (args.length>0) {
File file = new File(args[0]);
panel.read(file);
}
//for (Wire w: app.wlist) System.out.println(w);
EventQueue.invokeLater(() -> {
JFrame application = new JFrame("WireDemo");
application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
application.add(panel);
application.add(panel.status,BorderLayout.SOUTH);
JPanel buttons = new JPanel();
buttons.setBackground(new Color(245,245,245));
buttons.add(panel.save);
application.add(buttons,BorderLayout.NORTH);
application.setSize(496,480);
application.setVisible(true);
});
}
}
Maintained by John Loomis, updated Sat Feb 22 22:39:58 2020