This technical session is intended for the Java coder, and centers around working Java code. These are not just sample Java classes, but working classes that the author has found useful in developing Java applications.
The author has been writing programs since 1965 in Fortran, COBOL,
PL/1, Algol, Pascal, C, C++, and various assembly languages. He
has been exploring Java since 1996.
| The University of Texas at Austin | 1965-1966 |
| Texas Education Agency | 1966-2000 |
| Houston Ind. School District | 1975-1981 |
| Conroe Ind. School District | 1980-1993 |
| United States Navy | 1966-1994 |
| Capitol Appraisal Group, Inc. | 1981-2000 |
"Java in 21 Days " by Laura Lemay (SAMS)
"Java in a Nutshell" by David Flanagan (O'Reilly)
"Java SWING " by Robert Eckstein, Marc Loy & Dave Wood (O'Reilly)
"Java 2D Graphics" by Jonathan Knudsen (O'Reilly)
test00.bat 66 Tue Feb 15 11:18:00 CST 2000
1: %jdkdir%\bin\java JsrVote test00
or--
%jdkdir%\bin\java -jar JsrVote.jar test00
test00i.txt 889 Tue Feb 15 11:38:30 CST 2000
1: =comment may be any # of optional "=" lines.
2: = column 1 = "=", column 2-10 = parameter name, col 11...= value.
3: = ... below is printer name or network path name.
4: =printNAM LPT1
5: = ... valid printTYP are "hplj"=laser jet, "hpdj"=desk jet.
6: = ... only ascii printer tested is Canon BJ-200E
7: =printTYP hl1040
8: =printLPP 060 lines per page (columns 11-13).
9: SHARE 95 Board Election, July 26, 2000
10: 010 maximum # of batches (for memory allocation)
11: 50 batch size (used for reporting only)...first 3 lines may be changed
12: 04 # races ...these #s can NOT be changed!!!
13: 10 # candidates, all races
14: 01 Vice President
15: (1) Bob Ascott
16: (2) David Barrow
17: 01 Secretary
18: (3) David Butler
19: (4) Jack Eccles
20: 01 Treausrer
21: (5) Mary Nell Frucella
22: (6) Fred Goodwin
23: 02 Director
24: (7) Cliff Harrison
25: (8) John W. Moody
26: (9) Michael Ridout
27: (0) Barbara Varnado
test00r.txt 4675 Tue Feb 15 13:10:54 CST 2000
1: 1 JsrVote SHARE 95 Board Election, July 26, 2000
2: 2000-02-15@13:10 Plot Votes
3: 0 # Ballots Cast: 277
4: 277+
5: |
6: |
7: |
8: |
9: |
10: |
11: |
12: |
13: |
14: |
15: |
16: |
17: 207+
18: |
19: |
20: | 9
21: |
22: | 4
23: | 9
24: | 4 5
25: |
26: | 5
27: | 2
28: | 2 1
29: 138+ 9 1
30: |
31: | 7
32: | 4
33: | 5 8
34: | * 7 3
35: |
36: | 9 3 0
37: | * 8
38: | 1 * 0
39: | 2 8 6
40: |
41: | 0 6
42: 69+ 9 7
43: | * 3 6
44: | * *
45: |
46: | * 6
47: | *
48: |9
49: |*
50: |*
51: |
52: |
53: |
54: 0+---------+---------+---------+---------+---------+---------+---------+---------+
55: Batches->
test00v.txt 479 Thu Mar 02 11:16:56 CST 2000
1: (1) Bob Ascott,(2) David Barrow,(3) David Butler,(4) Jack Eccles,(5) Mary Nell Frucella,(6) Fred Goodwin,(7) Cliff Harrison,(8) John W. Moody,(9) Michael Ridout,(0) Barbara Varnado
2: 0,1,1,1,1,0,0,1,0,0,00001
3: 0,1,1,1,1,1,0,0,0,0,00002
4: 0,0,1,1,1,1,0,0,0,0,00003
5: 0,1,1,1,1,1,0,0,0,0,00004
6: 0,1,0,1,1,0,0,0,0,0,00005
7: 1,1,0,1,1,0,1,0,0,0,00006
8: 1,1,0,1,1,0,0,0,1,0,00007
9: 1,1,0,1,1,0,0,0,1,0,00008
10: votes 9-275 were here.
11: 1,0,0,1,0,0,0,1,0,0,00276
12: 0,0,1,1,0,0,1,1,0,1,00277
JsrVoteJar.bat 683 Tue Aug 10 23:39:48 CDT 1999 1: jar cmf JsrVote.mnf JsrVote.jar -C \jsr\java\bin JsrVote.class 2: jar uf JsrVote.jar -C \jsr\java\bin JsrVote$1.class 3: jar uf JsrVote.jar -C \jsr\java\bin JsrVote$1$VoteActionListener.class 4: jar uf JsrVote.jar -C \jsr\java\bin JsrVote$1$VoteItemListener.class 5: jar uf JsrVote.jar -C \jsr\java\bin JsrVote$1$VoteMenuListener.class 6: jar uf JsrVote.jar -C \jsr\java\bin JsrWindowExit.class 7: jar uf JsrVote.jar -C \jsr\java\bin JsrUtil.class 8: jar uf JsrVote.jar -C \jsr\java\bin JsrSysout.class 9: jar uf JsrVote.jar -C \jsr\java\bin JsrPrint1.class 10: jar uf JsrVote.jar -C \jsr\java\bin JsrLineIn.class 11: jar uf JsrVote.jar -C \jsr\java\bin JsrLineOut.class 12: jar tf JsrVote.jar 13:
JsrLineIn.java 2641 Fri Mar 12 17:17:42 CST 1999
1: /******************************************************************************
2: // JsrLineIn.java:
3: * to simplify display/accept logic for debugging.
4: * Sample Use:
5: * import JsrLineIn; ...
6: * JsrLineIn file1 = new JsrLineIn();
7: * String[] strfile1[2];
8: * strfile1[0] = "C:\reqlook.dxx"
9: * while (0 <= file1.read(strfile1[]))
10: { process records from strfile1[1]; }
11: */
12:
13: import java.io.*;
14:
15: public class JsrLineIn
16: {
17: static final String COPYRIGHT =
18: "Copyright 1998, JSR Systems. See: www.Jsrsys.com/copyright.";
19:
20: int recNum = 0;
21: String fileName = "";
22: //1.0 DataInputStream inFileStream;
23: //1.0 DataInput inFile;
24: BufferedReader inFile;
25:
26: JsrSysout sysout = new JsrSysout();
27:
28: public JsrLineIn() // null constructor
29: {
30: }
31:
32: int open(String parmName)
33: {
34: if (recNum != 0)
35: {
36: close();
37: }
38: sysout.display("Open Input: " + parmName);
39: // open code here
40: fileName = parmName;
41: recNum = 0;
42:
43: //1.0 try {inFileStream =
44: //1.0 new DataInputStream(new FileInputStream ( fileName));
45: //1.0 inFile = inFileStream;
46: try {inFile = new BufferedReader(new InputStreamReader
47: (new FileInputStream ( fileName)),1000000);
48: } catch (FileNotFoundException eFNF)
49: {System.out.println("FileNotFound: " + fileName);
50: recNum=-1;
51: }
52: return recNum;
53: }
54: int close()
55: {
56: sysout.display("Close Input: " + fileName + " Records in=" + recNum
57: +" ");
58: if (recNum >= 0)
59: {
60: //1.0 try {inFileStream.close(); // free up resource
61: try {inFile.close(); // free up resource
62: }catch ( IOException eIO )
63: {System.out.println("I/OError! " + fileName); }
64: }
65: recNum = - recNum;
66: fileName = "";
67: return recNum;
68: }
69: int read(String nameRecord[])
70: {
71: // sysout.display("Read: " + nameRecord[0]);
72: if (!nameRecord[0].equals(fileName))
73: {
74: open(nameRecord[0]);
75: }
76: if (recNum >= 0)
77: {
78: try {nameRecord[1] = inFile.readLine();
79: }
80: catch ( IOException eIO )
81: {System.out.println("I/OError! " + fileName); }
82: if (nameRecord[1] == null)
83: close();
84: else
85: recNum++;
86: }
87: // sysout.display ("recNum="+recNum+ "Rec="+ nameRecord[1]);
88: return recNum;
89: }
90: }
91:
JsrLineOut.java 2369 Wed Aug 25 09:46:42 CDT 1999
1: /******************************************************************************
2: // JsrLineOut.java:
3: * Sample Use:
4: * import JsrLineOut; ...
5: * JsrLineOut file1 = new JsrLineOut();
6: * String[] strfile1[2];
7: * strfile1[0] = "C:\reqlook.dxx"
8: * file1.Write(strfile1[]))
9: */
10:
11: import java.io.*;
12: import JsrDebug;
13: public class JsrLineOut
14: {
15: static final String COPYRIGHT =
16: "Copyright 1998, JSR Systems. See: www.Jsrsys.com/copyright.";
17:
18: int recNum = 0;
19: String fileName = "";
20: DataOutputStream outFileStream;
21: DataOutput outFile;
22: JsrSysout d;
23: boolean displayOn;
24: public JsrLineOut() // null constructor
25: {
26: d = new JsrSysout();
27: displayOn = true;
28: }
29: public JsrLineOut(String noLog) // constructor to not log
30: { displayOn = false; // used by JsrSysout itself
31: } // to avoid recursive calls
32:
33: int open(String parmName)
34: {
35: if (recNum != 0)
36: {
37: close();
38: }
39: if (displayOn) d.display("Open Output: " + parmName);
40: // open code here
41: fileName = parmName;
42: recNum = 0;
43: try {outFileStream =
44: new DataOutputStream(new FileOutputStream ( fileName));
45: outFile = outFileStream;
46: } catch ( IOException eIO )
47: {System.out.println("I/OError! " + fileName);
48: recNum=-1;
49: }
50: return recNum;
51: }
52: int close()
53: {
54: if (recNum > 0)
55: {
56: if (displayOn) d.display("Close Output: " + fileName + " Records out=" + recNum);
57: try {outFileStream.close(); // free up resource
58: }catch ( IOException eIO )
59: {System.out.println("I/OError! " + fileName); }
60: }
61: recNum = - recNum;
62: fileName = "";
63: return recNum;
64: }
65: int write(String nameRecord[])
66: {
67: // if (displayOn) d.display("Read: " + nameRecord[0] + nameRecord[1]);
68: if (!nameRecord[0].equals(fileName))
69: {
70: open(nameRecord[0]);
71: }
72: if (recNum >= 0)
73: {
74: try { outFile.writeBytes(nameRecord[1]+"\r\n");
75: } catch ( IOException eIO )
76: {System.out.println("I/OError! " + fileName); }
77: }
78: recNum++;
79: return recNum;
80: }
81: }
JsrPrint1.java 6403 Wed Sep 15 23:00:36 CDT 1999
1: import java.io.PrintWriter;
2: import java.io.FileWriter;
3: import java.io.IOException;
4:
5: class JsrPrint1
6: {
7:
8: static final String COPYRIGHT =
9: "Copyright 1999, JSR Systems. See: www.Jsrsys.com/copyright.";
10:
11: static JsrSysout sysout = new JsrSysout();
12: static JsrUtil u = new JsrUtil();
13: static String[] inputFile = {" ", " "};
14: static JsrLineIn input = new JsrLineIn();
15: static int lineCount = 0;
16: static int pageCount = 0;
17: // default printer is "old style" ASCII
18: static boolean hplj = false; // 17 cpi
19: static boolean hplj20= false; // 20 cpi
20: static boolean hpdj = false; // 24 cpi
21: static boolean brotherHL = false; // 17 cpi
22: static boolean cc = true; // default is cc (nocc sets to false)
23: static String ccChar = " ";
24: static int linesPerPage = 60;
25: public static void main(String parm[])
26: {
27: sysout.display("JsrPrint1--"+COPYRIGHT);
28: sysout.display("JsrPrint1--usage: JsrPrint1 <input file> <printer/LPT1> <cc/nocc>");
29: sysout.display("--------------------------- ");
30: if (parm.length < 2)
31: {
32: sysout.display("JsrPrint1--requires two parameters");
33: return;
34: }
35: for (int i = 2; i < parm.length; i++)
36: {
37: if (parm[i].equalsIgnoreCase("nocc"))
38: cc = false;
39: if (parm[i].equalsIgnoreCase("hplj")) // 17 cpi
40: hplj = true;
41: if (parm[i].equalsIgnoreCase("hplj20")) // 20 cpi
42: hplj20 = true;
43: if (parm[i].equalsIgnoreCase("hpdj")) // 24 cpi
44: hpdj = true;
45: if (parm[i].equalsIgnoreCase("BrotherHL")) // 17 cpi
46: brotherHL = true;
47: }
48:
49: inputFile [0] = parm[0];
50: sysout.display("Reading from: " + inputFile[0]);
51:
52: PrintWriter out;
53: try
54: {out = new PrintWriter(new FileWriter(parm[1]));
55: } catch(IOException e) {sysout.display("Printer IO exception"+e);
56: return;
57: }
58: sysout.display("Printing to: " + parm[1]);
59:
60: if (hplj20) // HP Laser Jet @ 20 cpi
61: {
62: out.print("\033E"); // Reset to defaults (for HP printers)
63: out.print("\033&l8d&l88P"); // 8 lines per inch, 88 lpp
64: out.print("\033&l4e&l80F"); // top margin 4 lines, 80 text lines
65: out.print("\033(s0p(s20H"); // fixed pitch 20 char / inch
66: out.print("\033(s0b(s6T"); // Normal strike wt. Letter Gothic typeface
67: linesPerPage = 80;
68: }
69: else
70: if (brotherHL || hplj) // Brother HL-1040 Laser Jet or HPLJ @ 17 cpi
71: {
72: out.print("\033E"); // Reset to defaults (for HP printers)
73: out.print("\033&l8d&l88P"); // 8 lines per inch, 88 lpp
74: out.print("\033&l4e&l80F"); // top margin 4 lines, 80 text lines
75: out.print("\033(s0p(s17H"); // fixed pitch 17 char / inch
76: out.print("\033(s0b(s6T"); // Normal strike wt. Letter Gothic typeface
77: linesPerPage = 80;
78: }
79: else
80: if (hpdj) // HP Desk Jet
81: {
82: out.print("\033E"); // Reset to defaults (for HP printers)
83: out.print("\033&l6d&l66P"); // 6 lines per inch, 66 lpp
84: out.print("\033&l3e&l60F"); // top margin 3 lines, 60 text lines
85: out.print("\033(s0p(s24H"); // fixed pitch 24 char / inch
86: out.print("\033(s0b(s6T"); // Normal strike wt. Letter Gothic typeface
87: out.print("\033*o-1M"); // EconoFast 300X300 dpi
88: linesPerPage = 60;
89: }
90: else
91: {
92: out.print("\017"); // compressed print on Canon
93: linesPerPage = 59;
94: }
95:
96: int recNum = 0;
97: while (0 <= (recNum=input.read(inputFile)))
98: {
99: lineCount++;
100: if (cc)
101: {
102: if (inputFile[1].length() < 2)
103: {
104: ccChar = " ";
105: inputFile[1] = " ";
106: }
107: else
108: {
109: ccChar = inputFile[1].substring(0,1);
110: inputFile[1] = inputFile[1].substring(1);
111: }
112: if (ccChar.equals("1"))
113: {
114: if (pageCount > 0 || lineCount > 1)
115: {
116: out.print("\f"); // eject page
117: pageCount++;
118: lineCount--;
119: sysout.display("Printing page: " +pageCount +
120: " (lines on page: "+lineCount+")");
121: lineCount = 1;
122: ccChar = " ";
123: }
124: }
125:
126: }
127:
128: if (cc && ccChar.equals("+")) lineCount--;
129: if (cc && ccChar.equals("0")) lineCount++;
130: if (cc && ccChar.equals("-")) lineCount+=2;
131:
132: // newpage if lineCount > linesPerPage, even if cc...
133: if (lineCount > linesPerPage)
134: { pageCount++;
135: out.print('\f'); // eject page
136: lineCount--;
137: sysout.display("Printing page: "+pageCount +
138: " (lines on page: "+lineCount+")");
139: lineCount = 1;
140: }
141: if (cc)
142: {
143: if (ccChar.equals("+")) out.print("\r");
144: else
145: if (ccChar.equals("0")) out.print("\r\n\r\n");
146: else
147: if (ccChar.equals("-")) out.print("\r\n\r\n\r\n");
148: else
149: out.print("\r\n");
150:
151: out.print(inputFile[1]);
152: }
153: else
154: out.println(inputFile[1]);
155:
156: }
157:
158: // flush and check if we got any errors from those
159: // print() and println() calls
160: if (out.checkError()) {
161: System.err.println("Got errors printing");
162: System.exit(-1);
163: }
164: pageCount++;
165: sysout.display("Printing page: " +pageCount +
166: " (lines on page: "+lineCount+")");
167: out.print('\f'); // eject page then close stream
168: if (hplj || hpdj || brotherHL || hplj20)
169: out.print("\033E"); // Reset to defaults
170:
171: out.flush(); // not needed; close() will flush
172: out.close();
173: }
174: }
JsrSysout.java 3167 Wed Aug 25 09:48:54 CDT 1999
1: /******************************************************************************
2: // JsrSysout.java:
3: * to simplify display/accept logic for debugging.
4: * Sample Use:
5: * import JsrSysout; ...
6: * JsrSysout d = new JsrSysout(); ...
7: * d.display("Text to display");
8: * d.accept ("Text to display");
9: * each instance of JsrSysout will save the last character entered from accept.
10: * if that character is "q" (113), lower case q, subsequent calls to that
11: * instance will neither display (System.out.println),
12: * nor accept (System.in.read()).
13: * 1998/08/18 modification. If user enters "R" (for Run),
14: * displays will continue, but user will not be prompted for input.
15: *
16: * 1999-08-25 modifications:
17: * d.syslog("syslog.txt"); // will log to file syslog.txt.
18: * d.setNoStop(); // sets qBig to "R".
19:
20:
21: */
22:
23: import java.io.*;
24: public class JsrSysout
25: {
26: static final String COPYRIGHT =
27: "Copyright 1998, JSR Systems. See: www.Jsrsys.com/copyright.";
28:
29: static final int MAXLINELEN = 80;
30: static final int MAXSCREEN = 21;
31: static int qBig = ' '; // 81 "Q" to terminate all instances
32: // 82 "R" run, do not query user any more
33: int qChar = ' '; // 113 "q" to terminate this instance
34: static int nLines = 0;
35: static String[] syslogLine = new String[] {"",""};
36: static JsrLineOut syslogFile = new JsrLineOut("NoLog");
37: // any string in constructor will suppress recursive calls to JsrSysout
38: public JsrSysout() // null constructor
39: {
40: }
41:
42: void display(String displayString)
43: {
44: if (qChar != 113 && qBig != 81)
45: {
46: // System.out.println("Last q="+qChar+", Last Q="+qBig);
47: nLines += (displayString.length()+MAXLINELEN)/MAXLINELEN;
48: if (nLines > MAXSCREEN)
49: accept(displayString);
50: else
51: System.out.println(displayString);
52: if (syslogLine[0].length() > 0)
53: {
54: syslogLine[1] = displayString;
55: syslogFile.write(syslogLine);
56: }
57: }
58: return;
59: }
60:
61: void accept(String displayString)
62: {
63: if (qChar != 113 && qBig != 81)
64: {
65: // System.out.println("Last q="+qChar+", Last Q="+qBig);
66: System.out.println(displayString);
67: if (syslogLine[0].length() > 0)
68: {
69: syslogLine[1] = displayString;
70: syslogFile.write(syslogLine);
71: }
72: nLines = (displayString.length()+MAXLINELEN)/MAXLINELEN;
73: if (qBig != 82)
74: {
75: System.out.println("Waiting for input..."+
76: "(Press [Enter], or \"q\", or \"Q\", "+
77: "or \"R\", then [Enter].)");
78: try {qChar = System.in.read();System.in.read();}
79: catch (IOException eIO){}
80: qBig = qChar; // if "Q" will terminate all instances.
81: // if "q" will terminate this instance.
82: }
83: }
84: return;
85: }
86: void setNoStop()
87: {
88: qBig = 'R';
89: return;
90: }
91:
92: void syslog(String fileName)
93: {
94: syslogLine[0] = fileName;
95: return;
96: }
97:
98: }
JsrUtil.java 2673 Sun Aug 08 16:36:48 CDT 1999
1: /******************************************************************************
2: // JsrUtil.java: padLeft, padRight, string or integer input.
3: // output is padded or truncated as necessary.
4: * Sample Use:
5: * import JsrUtil; ...
6: * JsrUtil u = new JsrUtil();
7: * paddedString = u.padLeft(oldString,10);
8: * paddedInteger = u.padLeft(oldInt,10);
9: * zeroPadInt = u.padZero(oldInt,10);
10: * paddedString = u.padRight(oldString,10);
11: * dateTime = u.getDateTime();
12: *
13: */
14: import java.util.*;
15:
16: public class JsrUtil
17: {
18: static final String COPYRIGHT =
19: "Copyright 1998, JSR Systems. See: www.Jsrsys.com/copyright.";
20:
21: public JsrUtil() // null constructor
22: {
23: }
24:
25: String padLeft(String parmString, int parmLen)
26: {
27: String tempString = parmString;
28: if (tempString.length() > parmLen)
29: tempString = tempString.substring(tempString.length()-parmLen,
30: tempString.length());
31: else
32: {
33: while (tempString.length() < parmLen)
34: tempString = " "+tempString;
35: }
36: return tempString;
37: }
38:
39: String padLeft(int parmInt, int parmLen)
40: {
41: Integer tempInt = new Integer(parmInt);
42: String tempString = tempInt.toString();
43: return padLeft(tempString, parmLen);
44: }
45:
46: String padZero(int parmInt, int parmLen)
47: {
48: Integer tempInt = new Integer(parmInt);
49: String tempString = tempInt.toString();
50: if (tempString.length() > parmLen)
51: tempString = tempString.substring(tempString.length()-parmLen,
52: tempString.length());
53: else
54: {
55: while (tempString.length() < parmLen)
56: tempString = "0"+tempString;
57: }
58: return tempString;
59: }
60:
61: String padRight(String parmString, int parmLen)
62: {
63: String tempString = parmString;
64: if (tempString.length() > parmLen)
65: tempString = tempString.substring(0,parmLen+1);
66: else
67: {
68: while (tempString.length() < parmLen)
69: tempString = tempString + " ";
70: }
71: return tempString;
72: }
73:
74: String getDateTime()
75: {
76: Calendar rightNow = Calendar.getInstance();
77: String today = rightNow.get(Calendar.YEAR)+"-"+
78: padZero(rightNow.get(Calendar.MONTH)+1,2)+"-"+
79: padZero(rightNow.get(Calendar.DAY_OF_MONTH),2)+"@"+
80: padZero(rightNow.get(Calendar.HOUR_OF_DAY),2)+":"+
81: padZero(rightNow.get(Calendar.MINUTE),2);
82: // add 1 to month because Calendar returns 0 for January!!!
83: return today;
84: }
85:
86: }
JsrVote.java 26949 Tue Feb 22 16:30:30 CST 2000
1: // JsrVote.java
2: //
3: // 2000-02-15 changes:
4: // add logic for multiple races
5: //
6: // Assumptions: the following are assumed to exist, current version has
7: // no error checking, it just assumes these states.
8: // 1) p1+i.txt exists and is well formed (see share93i.txt for example).
9: // in particular # races, and # candidates is critical.
10: // 2) race title lines are in format ## title (## is max votes this race).
11: // 3) candidate lines are in format (k) Name (k is shortcut key).
12: // 4) current version only supports one race, extra loop logic will be added.
13: // however [race] variables are all arrays, only loop logic is missing.
14: // 5) p1+v.txt is assumed to always exist.
15: // first line is assumed to be titles (for Excel).
16: // first action (ALWAYS) is to rename p1+v.txt to p1+v.$$$
17: // then program reads p1+v.$$$, copying to p1+v.txt,
18: // building vote count (batch and total) arrays.
19: // 6) after initial run, contents of p1+i.txt must NOT be changed, except:
20: // title line, maximum batches (used for array size calculation), and
21: // batch size may be changed.
22: // 7) each ballot voted is immediately written to p1+v.txt, so recovery
23: // is always to last ballot voted. However, ballot # is part of data
24: // so recovery could be modified by editing p1+v.txt file.
25:
26: import javax.swing.*;
27: import java.awt.*;
28: import java.awt.event.*;
29: import java.io.File;
30: import java.util.*;
31:
32:
33: public class JsrVote
34: {
35: static final String COPYRIGHT =
36: "Copyright 2000, JSR Systems. See: www.Jsrsys.com/copyright.";
37: static JsrSysout d = new JsrSysout();
38: static JsrUtil u = new JsrUtil();
39: // static Font defaultFont = new Font("Lucida Sans",Font.BOLD,18);
40: static Font defaultFont = new Font("Comic Sans MS",Font.BOLD,18);
41:
42: static String[] inputFile = {" ", " "};
43: static JsrLineIn input = new JsrLineIn();
44:
45: static String[] outputFile = {" ", " "};
46: static JsrLineOut output = new JsrLineOut();
47:
48: static String[] reportFile = {" ", " "};
49: static JsrLineOut report = new JsrLineOut();
50:
51: static String[] print1Parm = new String[] {"*r.txt", "LPT1", "cc", " "};
52: static JsrPrint1 print1 = new JsrPrint1();
53: static int printLPP = 66; // lines per page
54: static int lineCount = 999; // line count to force immediate page break
55:
56: static String voteTitle; // Title (card input)
57: static int maxBatch = 0; // max # batches (card input)
58: static int batchSize = 0; // batch size (card input)
59: static int maxRace = 0; // max # Races (card input)
60: static int maxVote = 0; // max # Votes (card input, all Races)
61: static JLabel batHead = new JLabel("Batch # 1 ",SwingConstants.RIGHT);
62: static JLabel totHead = new JLabel("Vote Totals",SwingConstants.RIGHT);
63: static JLabel dotLabel1 = new JLabel("Race(s) & Candidates",SwingConstants.LEFT);
64: static JLabel dotLabel2 = new JLabel(" ",SwingConstants.RIGHT);
65: static JLabel dotLabel3 = new JLabel(" ",SwingConstants.RIGHT);
66: static JLabel batSumLabel = new JLabel("Batch: xxxxxxxxx",SwingConstants.RIGHT);
67: static JLabel totSumLabel = new JLabel("Total: xxxxxxxxx",SwingConstants.RIGHT);
68:
69: // for following arrays, actual allocation size will be determined in main
70: static int[] voteMax; // Max # votes/Race (card input)
71: static String[] raceName; // Race Name (card input)
72: static String[] voteName; // Candidate name (card input)
73: // (#) name... where # is selection key (sets box true)
74: static int[] raceVotes; // # votes this Ballot by Race
75: static int[] voteCount; // # votes by candidate
76: static int[] cummCount; // cumm votes for All Batch report (or plots).
77: static int[] voteRace; // Race index by candidate
78: static char[] voteArray; // the votes for this Ballot
79: static int voteBallot = 0; // total Ballots
80: static int b = 0; // current batch #
81: static int cummBallot; // cumm ballot for All Batch report (or plots).
82: static int[] batchBallot; // # ballots per batch
83: static int[][] batchVote; // votes per batch
84: static JLabel [] raceLabel1; // = new JLabel[maxRace];
85: static JLabel [] raceLabel2; // = new JLabel[maxRace];
86: static JLabel [] raceLabel3; // = new JLabel[maxRace];
87: static JCheckBox [] voteBox; // = new JCheckBox[maxVote];
88: static JLabel [] totLabel; // = new JLabel[maxVote];
89: static JLabel [] batLabel; // = new JLabel[maxVote];
90: static boolean printOn = false; // print reports?
91: static String today; // set by MenuAction Listener
92:
93: static JFrame frame;
94:
95: //notes on static and final: -----------------------------------------------
96: // static means it is a class variable, not an instance variable.
97: // static means it can be accessed from any method (funtionally global)
98: // final means it can not be changed, however if it is an array,
99: // then the individual array values can be changed.
100: // final can be accessed from the "inner" classes, but not other methods.
101: // ------------------------------------------------------------------------
102:
103: public static void main(String[] parm)
104: {
105:
106: Integer tempInt;
107: d.syslog("syslog.txt");
108: d.setNoStop();
109:
110: d.display("JsrVote--"+COPYRIGHT);
111: d.display("JsrVote--Font: "+defaultFont.toString());
112: if (parm.length < 1)
113: { d.display("JsrVote-must contain one argument:");
114: d.display("--------parm 1: file prefixy (i.e., 'share93')");
115: return;
116: }
117: inputFile [0] = parm[0]+"i.txt"; // input "INI" file
118: reportFile [0] = parm[0]+"r.txt"; // report file
119: print1Parm [0] = reportFile[0]; // print from report file
120: input.read(inputFile);
121: while (inputFile[1].substring(0,1).equals("="))
122: {
123: if (inputFile[1].substring(0,10).equals("=printNAM "))
124: {
125: print1Parm[1] = inputFile[1].substring(10);
126: d.display("JsrVote--printNAM: "+print1Parm[1]);
127: }
128: if (inputFile[1].substring(0,10).equals("=printTYP "))
129: {
130: print1Parm[3] = inputFile[1].substring(10);
131: d.display("JsrVote--printTYP: "+print1Parm[3]);
132: }
133: if (inputFile[1].substring(0,10).equals("=printLPP "))
134: {
135: tempInt = new Integer(inputFile[1].substring(10,13));
136: printLPP = tempInt.intValue();
137: d.display("JsrVote--printLPP="+printLPP);
138: }
139: input.read(inputFile);
140: }
141:
142: voteTitle = inputFile[1];
143: d.display("JsrVote--Title: "+voteTitle);
144: input.read(inputFile);
145: tempInt = new Integer(inputFile[1].substring(0,3));
146: maxBatch = tempInt.intValue();
147: d.display("JsrVote--maxBatch: "+maxBatch);
148: input.read(inputFile);
149: tempInt = new Integer(inputFile[1].substring(0,2));
150: batchSize = tempInt.intValue();
151: d.display("JsrVote--batchSize: "+batchSize);
152: input.read(inputFile);
153: tempInt = new Integer(inputFile[1].substring(0,2));
154: maxRace = tempInt.intValue();
155: d.display("JsrVote--maxRace: "+maxRace);
156: input.read(inputFile);
157: tempInt = new Integer(inputFile[1].substring(0,2));
158: maxVote = tempInt.intValue();
159: d.display("JsrVote--maxVote: "+maxVote);
160:
161: // the following are static (class) variables, accessible from inner classes
162: // and from all methods. They are declared static at top of class, then
163: // their actual allocation size determined after size parameters are input.
164: voteMax = new int[maxRace]; // Max # votes/Race (card input)
165: raceName = new String[maxRace]; // Race Name (card input)
166: voteName = new String[maxVote]; // Candidate name (card input)
167:
168: raceVotes = new int[maxRace]; // # votes this Ballot by Race
169: voteCount = new int[maxVote]; // # votes by candidate
170: cummCount = new int[maxVote]; // # votes by candidate
171: voteRace = new int[maxVote]; // Race index by candidate
172: voteArray = new char[maxVote]; // the votes for this Ballot
173:
174: batchBallot = new int[maxBatch]; // # ballots per batch
175: batchVote = new int[maxBatch][maxVote]; // votes per batch
176:
177: // d.display("Initializing b="+b);
178: batchBallot[b] = 0;
179: for (int i=0; i < maxVote; i++) batchVote[b][i] = 0;
180:
181: raceLabel1 = new JLabel[maxRace];
182: raceLabel2 = new JLabel[maxRace];
183: raceLabel3 = new JLabel[maxRace];
184: voteBox = new JCheckBox[maxVote];
185: totLabel = new JLabel[maxVote];
186: batLabel = new JLabel[maxVote];
187:
188: for (int i = 0; i < maxRace; i++)
189: {
190: raceVotes[i] = 0;
191: raceName[i] = " ";
192: }
193: int ir = -1; // individual race counter!
194:
195: for (int iv = 0; iv < maxVote; iv++)
196: {
197: input.read(inputFile); // add checking for input file and race change
198: // d.display("Input: "+inputFile[1]+"***");
199: if (!(inputFile[1].substring(0,1).equals("(")))
200: {
201: tempInt = new Integer(inputFile[1].substring(0,2));
202: ir++;
203: voteMax[ir] = tempInt.intValue();
204: raceName[ir] = inputFile[1].substring(3);
205: d.display("JsrVote--voteMax["+ir+"]: " + voteMax[ir] +
206: " raceName["+ir+"]: " + raceName[ir]);
207: input.read(inputFile);
208: } // can't have two ##Race Name in a row,
209: // so next card is assumed to be in (k) Candidate Name format
210: voteName[iv] = inputFile[1];
211: d.display("JsrVote--Candidate: " + voteName[iv]
212: +" Race: " + raceName[ir]);
213: voteRace[iv] = ir;
214: }
215: // ini file finished, now set up frame
216:
217:
218: try { UIManager.setLookAndFeel(
219: UIManager.getSystemLookAndFeelClassName());
220: } catch (Exception e) { } // set Look and Feel to Windows
221: // System=Windows on Win32 systems, CrossPlatform=Metal (Java default)
222:
223: frame = new JFrame(voteTitle);
224: frame.addWindowListener(new JsrWindowExit());
225: // System.out.println("Frame created ");
226:
227: // A simple menu class w/ Action listener (see page 419-420 Java Swing)
228: class VoteMenuListener extends JMenuBar implements ActionListener
229: {
230: String[] fileItems = new String[] {"Exit"};
231: char[] fileShortCuts = {'x'};
232: String[] reportItems = new String[] {"This Batch",
233: "All Batches",
234: "Plot Votes"};
235: char[] reportShortCuts = {'T','A','P'};
236: public VoteMenuListener() // constructor
237: {
238: JMenuItem fileItem;
239: JMenu fileMenu = new JMenu("File");
240: fileMenu.setMnemonic('F');
241: for (int i=0; i < fileItems.length; i++)
242: {
243: fileItem = new JMenuItem(fileItems[i], fileShortCuts[i]);
244: fileItem.addActionListener(this);
245: fileMenu.add(fileItem);
246: }
247: add(fileMenu);
248: JMenuItem reportItem;
249: JMenu reportMenu = new JMenu("Reports");
250: reportMenu.setMnemonic('R');
251: for (int i=0; i < reportItems.length; i++)
252: {
253: reportItem = new JMenuItem(reportItems[i], reportShortCuts[i]);
254: reportItem.addActionListener(this);
255: reportMenu.add(reportItem);
256: }
257: reportMenu.add(reportItem = new JCheckBoxMenuItem("Print On/Off"));
258: reportItem.addActionListener(this);
259: add(reportMenu);
260: }
261: public void actionPerformed(ActionEvent menuEvent)
262: {
263: String menuItem=menuEvent.getActionCommand();
264: // will do report logic from here
265: Calendar rightNow = Calendar.getInstance();
266: today = u.getDateTime();
267: if (menuItem.equals("Print On/Off")) printOn = !printOn;
268: // intuit printOn value rather than generate ItemListener
269: System.out.println("Menu="+ menuItem+" printOn/Off="+printOn+" "+today);
270: if (menuItem.equals("This Batch")) doThisReport();
271: if (menuItem.equals("All Batches")) doAllReport();
272: if (menuItem.equals("Plot Votes")) doPlotVotes();
273: if (menuItem.equals("Exit"))
274: {
275: d.display("Exiting");
276: output.close();
277: System.exit(0);
278: }
279: }
280: } // end class VoteMenuListener
281:
282: // A simple ActionListener.
283: class VoteActionListener implements ActionListener
284: {
285: public void actionPerformed(ActionEvent ex)
286: {
287: String choice = ex.getActionCommand();
288: Integer vInteger = new Integer(choice);
289: int v = vInteger.intValue();
290: System.out.println("ACTION Candidate[" + choice + "] Selected!");
291: voteBox[v].setSelected(true);
292: // the above invokes itemStateChanged if it is a change
293: }
294: } // end class VoteActionListener
295:
296: // A simple ItemListener, showing each selection and deselection.
297: class VoteItemListener implements ItemListener
298: {
299: public void itemStateChanged(ItemEvent ex)
300: {
301: String item =
302: ((AbstractButton)ex.getItemSelectable()).getActionCommand();
303:
304: boolean selected = (ex.getStateChange() == ItemEvent.SELECTED);
305: Integer vInteger = new Integer(item);
306: int v = vInteger.intValue();
307: if (selected)
308: {
309: // System.out.println("voteArray[v]="+voteArray[v]+ "true");
310: if (voteArray[v] == '0')
311: {
312: if (raceVotes[voteRace[v]] == voteMax[voteRace[v]])
313: {
314: JOptionPane.showMessageDialog(frame,
315: "Maximum Votes this Race = "+voteMax[voteRace[v]]);
316: voteBox[v].setSelected(false);
317: }
318: else
319: {
320: voteArray[v] = '1';
321: raceVotes[voteRace[v]]++;
322: }
323: }
324: }
325: else
326: {
327: // System.out.println("voteArray[v]="+voteArray[v]+ "false");
328: if (voteArray[v] == '1')
329: {
330: voteArray[v] = '0';
331: raceVotes[voteRace[v]]--;
332: }
333: }
334: String voteString = "";
335: for (int i = 0; i < maxVote; i++) voteString += voteArray[i]+",";
336:
337: System.out.println(" ITEM Candidate[" + item + "]: " +
338: " Votes=" + voteString + "* On/off=" + selected +
339: " raceVotes=" + raceVotes[voteRace[v]] +
340: " " + voteName[v]);
341: }
342: } // end class VoteItemListener
343:
344:
345:
346: // p1+i.txt Initialization file read
347: // following renames will only work if files are closed (OK here, see JsrEdit.java).
348: inputFile[0] = parm[0]+"v.$$$";
349: outputFile[0] = parm[0]+"v.txt";
350: File txtFD = new File(outputFile[0]);
351: File tempFD = new File( inputFile[0]);
352: if (txtFD.exists() != true)
353: {
354: d.display("JsrVote--File: "+outputFile[0]+" does not exist!");
355: System.exit(4);
356: }
357: if (tempFD.exists() == true)
358: d.display("JsrVote--delete " + tempFD+"=" + tempFD.delete());
359: d.display("JsrVote--rename "+txtFD+ " to "
360: + tempFD+"=" + txtFD.renameTo(tempFD));
361: input.read(inputFile); // copy header line
362: outputFile[1] = inputFile[1];
363: output.write(outputFile);
364:
365: String acString = " ";
366: ActionListener al = new VoteActionListener();
367: ItemListener il = new VoteItemListener();
368:
369: // System.out.println("Initializing constants");
370:
371: for (int i = 0; i < maxRace; i++)
372: {
373: d.display("Initializing raceLabel["+ i +"]: "+raceName[i]);
374: raceLabel1[i] = new JLabel(raceName[i]);
375: raceLabel1[i].setFont(defaultFont);
376: raceLabel2[i] = new JLabel(" ",SwingConstants.RIGHT);
377: raceLabel3[i] = new JLabel(" ",SwingConstants.RIGHT);
378: }
379:
380: for (int i = 0; i < maxVote; i++)
381: {
382: // System.out.println("Initializing totLabel["+i+"]");
383: voteArray[i] = '0';
384: voteCount[i] = 0;
385: batLabel[i] = new JLabel("0",JLabel.RIGHT);
386: batLabel[i].setFont(defaultFont);
387: totLabel[i] = new JLabel("0",JLabel.RIGHT);
388: totLabel[i].setFont(defaultFont);
389: voteBox[i] = new JCheckBox(" "+voteName[i], false);
390: voteBox[i].setToolTipText("Check Box or type underlined # to select.");
391: voteBox[i].setFont(defaultFont);
392: tempInt = new Integer(i);
393: acString = tempInt.toString();
394: voteBox[i].setActionCommand(acString);
395: voteBox[i].setMnemonic(voteName[i].charAt(1));
396: KeyStroke aKey = KeyStroke.getKeyStroke(voteName[i].charAt(1));
397: voteBox[i].addItemListener(il);
398: voteBox[i].registerKeyboardAction(al,acString,aKey,
399: JComponent.WHEN_IN_FOCUSED_WINDOW);
400: }
401:
402:
403: // System.out.println("Constants set ");
404: // now can continue with input file
405: String vChar;
406: while (0 <= input.read(inputFile))
407: {
408: // System.out.println("Input VoteString: "+inputFile[1]);
409: if (inputFile[1].length() < (maxVote*2))
410: {
411: d.display("Skipping line of length="+inputFile[1].length());
412: }
413: else
414: {
415: newVote ();
416: for (int v=0; v < maxVote; v++)
417: {
418: vChar = inputFile[1].substring(v*2,v*2+1);
419: // System.out.println("v="+v+"v*2="+(v*2)+"=="+vChar);
420: if (vChar.equals("1"))
421: {
422: voteCount[v]++;
423: batchVote[b][v]++;
424: }
425: }
426: voteBallot++;
427: batchBallot[b]++;
428: writeBallot(inputFile[1]);
429: }
430:
431: }
432: // System.out.println("After input votes.");
433: batSumLabel.setText(" "+ batchBallot[b]);
434: totSumLabel.setText("Total: " + voteBallot);
435: for (int v=0; v < maxVote; v++)
436: {
437: batLabel[v].setText(" "+batchVote[b][v]);
438: totLabel[v].setText(" "+voteCount[v]);
439: }
440:
441:
442: // Throw everything together.
443: frame.setJMenuBar(new VoteMenuListener());
444: Container c = frame.getContentPane();
445:
446: c.setLayout(new GridLayout(maxVote+maxRace+2,3)); // items added left to right
447:
448: batHead.setText("Batch # "+(b+1));
449: batHead.setFont(defaultFont);
450: totHead.setFont(defaultFont);
451: c.add(dotLabel1);
452: c.add(batHead);
453: c.add(totHead);
454:
455: ir = -1;
456: for (int i = 0; i < maxVote; i++)
457: {
458: if (voteRace[i] != ir)
459: {
460: ir = voteRace[i];
461: c.add(raceLabel1[ir]);
462: c.add(raceLabel2[ir]);
463: c.add(raceLabel3[ir]);
464: }
465: c.add(voteBox[i]);
466: c.add(batLabel[i]);
467: c.add(totLabel[i]);
468:
469: }
470: JButton voteButton = (new JButton("Vote"));
471: voteButton.setMnemonic('V');
472: voteButton.setToolTipText("Press Vote button (or enter) to cast one ballot.");
473: voteButton.addActionListener(new ActionListener()
474: {
475: public void actionPerformed(ActionEvent ev)
476: {
477: String voteString = "";
478: newVote();
479: if (batchBallot[b] == 0)
480: {
481: batHead.setText("Batch # "+(b+1));
482: for (int i = 0; i < maxVote; i++)
483: batLabel[i].setText(" "+batchVote[b][i]);
484: // reset labels to zero if batch changes
485: }
486:
487: for (int i = 0; i < maxVote; i++)
488: {
489: voteString += voteArray[i]+",";
490: if (voteArray[i] == '1')
491: {
492: // voteArray[i] = '0'; this will be done by itemListener
493: voteBox[i].setSelected(false);
494: batchVote[b][i]++;
495: voteCount[i]++;
496: batLabel[i].setText(" "+batchVote[b][i]);
497: totLabel[i].setText(" "+voteCount[i]);
498: }
499: }
500: voteBallot++;
501: batchBallot[b]++;
502: batSumLabel.setText(" "+ batchBallot[b]);
503: totSumLabel.setText("Total: " + voteBallot);
504: voteString += u.padZero(voteBallot,5);
505: for (int i = 0; i < maxRace; i++) raceVotes[i] = 0;
506:
507: System.out.println("Vote Button Pressed, Votes=" + voteString);
508: writeBallot(voteString);
509: if (batchBallot[b] == batchSize)
510: JOptionPane.showMessageDialog(frame,
511: "Please generate This Batch Report now. \n"+
512: "Thanks, and Have a Nice Day!");
513: }
514: }); // yes that is } bracket and ) parenthesis.
515:
516: c.add(voteButton);
517: batSumLabel.setFont(defaultFont);
518: totSumLabel.setFont(defaultFont);
519: c.add(batSumLabel);
520: c.add(totSumLabel);
521:
522: // System.out.println("Frame display ");
523:
524: frame.pack(); // sets size to just as big as it needs to be
525: // frame.setSize(600,600); // or could set to specific size
526:
527: frame.setVisible(true);
528: voteButton.grabFocus(); // must be done after screen is visible
529: // try grabFocus vs. requestFocus
530: }
531:
532: public static void newVote()
533: {
534: // d.display("newVote: b="+b+" batchBallot[b]="+batchBallot[b]+"batchSize="+batchSize);
535: if (batchBallot[b] == batchSize)
536: {
537: b++;
538: batchBallot[b] = 0;
539: for (int i=0; i < maxVote; i++) batchVote[b][i] = 0;
540: }
541: }
542:
543: public static void writeBallot(String voteString)
544: {
545: outputFile[1] = voteString;
546: output.write(outputFile);
547: }
548:
549: public static void doAllReport()
550: {
551: d.display("doAllReport called, Last Batch # "+(b+1));
552: for (int i=0; i < maxVote; i++) cummCount[i] = 0;
553: cummBallot = 0;
554: lineCount = 999; // force report to page break
555: for (int bt=0; bt <= b; bt++)
556: {
557: //d.display("lineCount="+lineCount+"/"+printLPP);
558: if ((lineCount+maxVote+4) > printLPP)
559: {
560: printOneLine("1JsrVote "+voteTitle);
561: printOneLine(" "+today+" All Batches Report");
562: lineCount = 4;
563: }
564: lineCount++; // extra bump for double space
565: printOneLine("0Race & Candidate Batch #"+u.padLeft(bt+1, 3)+" All Batches");
566: for (int i=0; i < maxVote; i++)
567: {
568: if ((i == 0) || (voteRace[i] != voteRace[i-1]))
569: printOneLine(raceName[voteRace[i]]);
570: cummCount[i] += batchVote[bt][i];
571: printOneLine(" "+u.padRight(voteName[i],25)
572: +u.padLeft(batchVote[bt][i],10)
573: +u.padLeft(cummCount[i],12));
574: }
575: cummBallot += batchBallot[bt];
576: printOneLine(" Totals " +u.padLeft(batchBallot[bt],10)
577: +u.padLeft(cummBallot,12));
578: }
579: report.close();
580: if (printOn) print1.main(print1Parm);
581: }
582:
583: public static void doThisReport()
584: {
585: System.out.println("doThisReport called, Batch # "+(b+1));
586: lineCount = 999; // force report to page break
587: if (lineCount > printLPP)
588: {
589: printOneLine("1JsrVote "+voteTitle);
590: printOneLine(" "+today+" Current Batch Report");
591: lineCount = 4;
592: }
593: printOneLine("0Race & Candidate Batch #"+u.padLeft(b+1, 3)+" All Batches");
594: for (int i=0; i < maxVote; i++)
595: {
596: if ((i == 0) || (voteRace[i] != voteRace[i-1]))
597: printOneLine(raceName[voteRace[i]]);
598: printOneLine(" "+u.padRight(voteName[i],25)
599: +u.padLeft(batchVote[b][i],10)
600: +u.padLeft(voteCount[i],12));
601: }
602: printOneLine(" Totals " +u.padLeft(batchBallot[b],10)
603: +u.padLeft(voteBallot,12));
604: report.close();
605: if (printOn) print1.main(print1Parm);
606: }
607:
608: public static void doPlotVotes()
609: {
610:
611: d.display("doPlotVotes called, Batch # "+(b+1));
612: lineCount = 999; // force report to page break
613: if (lineCount > printLPP)
614: {
615: printOneLine("1JsrVote "+voteTitle);
616: printOneLine(" "+today+" Plot Votes");
617: lineCount = 4;
618: }
619: printOneLine("0# Ballots Cast: "+u.padLeft(voteBallot,12));
620: int plotSpread = 80 / (b+1);
621: //d.display("alloc plotChar[50]["+plotSpread*(b+1)+"]");
622: char [][] plotChar = new char[50][plotSpread*(b+1)];
623: for (int i=0; i < 50; i++)
624: for (int j=0; j < (plotSpread*(b+1)); j++)
625: plotChar[i][j] = ' ';
626: //d.display("init cummCount");
627: for (int i=0; i < maxVote; i++) cummCount[i] = 0;
628: for (int bt=0; bt <= b; bt++)
629: {
630: for (int i=0; i < maxVote; i++)
631: {
632: //d.display("CummCount set="+ cummCount[i] +"+="+ batchVote[bt][i] );
633: cummCount[i] += batchVote[bt][i];
634: int p = (cummCount[i] * 50) / voteBallot;
635: //d.display("bt="+bt+" * X="+(plotSpread*bt)+" p="+p+
636: // " Vote="+cummCount[i]+" Who: "+voteName[i]);
637: if (plotChar[p][plotSpread*bt] == ' ')
638: plotChar[p][plotSpread*bt] = voteName[i].charAt(1);
639: else
640: plotChar[p][plotSpread*bt] = '*';
641: //d.display("after set plotChar...");
642: }
643: }
644: for (int p=49; p >=0; p--)
645: {
646: String printString = new String(" |");
647: if (p == 49) printString = u.padLeft(voteBallot,10) + "+";
648: if (p == 36) printString = u.padLeft(voteBallot*3/4,10) + "+";
649: if (p == 24) printString = u.padLeft(voteBallot/2,10) + "+";
650: if (p == 11) printString = u.padLeft(voteBallot/4,10) + "+";
651: for (int bt=0; bt<=(plotSpread*b); bt++) printString += plotChar[p][bt];
652: printOneLine(" "+printString);
653: }
654: printOneLine(" 0+---------+---------+---------+---------+"+
655: "---------+---------+---------+---------+");
656: printOneLine(" Batches->");
657: report.close();
658: if (printOn) print1.main(print1Parm);
659: }
660:
661:
662: public static void printOneLine(String oneLine)
663: {
664: reportFile[1] = oneLine.substring(0,1)+" "+oneLine.substring(1);
665: report.write(reportFile);
666: lineCount++;
667: }
668:
669:
670:
671: }
672: // end of JsrVote.java program
JsrWindowExit.java 245 Sat Jul 31 14:51:44 CDT 1999
1: import java.awt.event.*;
2: import java.awt.Window;
3:
4: public class JsrWindowExit extends WindowAdapter {
5:
6: public void windowClosing(WindowEvent e) {
7: Window w = e.getWindow();
8: w.setVisible(false);
9: w.dispose();
10: System.exit(0);
11: }
12: }