About Java and xBaseJ- P8

Chia sẻ: Thanh Cong | Ngày: | Loại File: PDF | Số trang:20

0
49
lượt xem
9
download

About Java and xBaseJ- P8

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Tham khảo tài liệu 'about java and xbasej- p8', công nghệ thông tin, kỹ thuật lập trình phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả

Chủ đề:
Lưu

Nội dung Text: About Java and xBaseJ- P8

  1. Chapter 2 – Mega­Zillionaire Application 141 707) megaNoStat = new StatElms[ ELM_COUNT]; 708) System.out.println( "Initializing megaNoStat"); 709) for (l_x=1; l_x < ELM_COUNT; l_x++ ) { 710) megaNoStat[ l_x] = new StatElms(); 711) megaNoStat[ l_x].elmNo = l_x; 712) } // end for loop to init stats 713) 714) 715) megaDBF.open_database(); 716) 717) // Create a statement 718) try { 719) l_record_count = megaDBF.getDBF().getRecordCount(); 720) 721) for (l_x=1; l_x
  2. 142 Chapter 2 – Mega­Zillionaire Application 764) 765) 766) System.out.println( "Writing mega stats records"); 767) System.out.println( "Value of l_draw_no " + l_draw_no); 768) 769) for (l_x=1; l_x < ELM_COUNT; l_x++ ) { 770) drawNoStat[ l_x].pctHits = (double)( megaNoStat[ l_x].hitCount) / 771) (double)( l_draw_no); 772) l_missed = l_draw_no - megaNoStat[ l_x].hitCount; 773) megaNoStat[ l_x].aveBtwn = (double)( l_missed) / 774) (double)( drawNoStat[ l_x].hitCount); 775) megaNoStat[ l_x].sinceLast = l_draw_no - megaNoStat [l_x].lastDrawNo; 776) 777) try { 778) megaStatDBF.Elm_No.put( megaNoStat[ l_x].elmNo); 779) megaStatDBF.Hit_Count.put( megaNoStat[ l_x].hitCount); 780) megaStatDBF.Last_Draw_No.put( megaNoStat[ l_x].lastDrawNo); 781) megaStatDBF.Since_Last.put( megaNoStat[ l_x].sinceLast); 782) megaStatDBF.Curr_Seq.put( megaNoStat[ l_x].currSeq); 783) megaStatDBF.Longest_Seq.put( megaNoStat[ l_x].longestSeq); 784) megaStatDBF.Pct_Hits.put( megaNoStat[ l_x].pctHits); 785) megaStatDBF.Max_Btwn.put( megaNoStat[ l_x].maxBtwn); 786) megaStatDBF.Ave_Btwn.put( megaNoStat[ l_x].aveBtwn); 787) 788) megaStatDBF.getDBF().write(); 789) 790) } catch( xBaseJException s) { 791) display_error_msg( "Error adding Mega stat record " + 792) s.toString()); 793) } catch( IOException i) { 794) display_error_msg( "Error reading DBF " + i.toString()); 795) } 796) } // end for l_x loop 797) 798) System.out.println( "Writing Drawing stats records"); 799) 800) for (l_x=1; l_x < ELM_COUNT; l_x++ ) { 801) drawNoStat[ l_x].pctHits = (double)( drawNoStat[ l_x].hitCount) / 802) (double)( l_draw_no); 803) l_missed = l_draw_no - drawNoStat[ l_x].hitCount; 804) drawNoStat[ l_x].aveBtwn = (double)( l_missed) / 805) (double)( drawNoStat[ l_x].hitCount); 806) drawNoStat[ l_x].sinceLast = l_draw_no - drawNoStat [l_x].lastDrawNo; 807) 808) try { 809) drawStatDBF.Elm_No.put( drawNoStat[ l_x].elmNo); 810) drawStatDBF.Hit_Count.put( drawNoStat[ l_x].hitCount); 811) drawStatDBF.Last_Draw_No.put( drawNoStat[ l_x].lastDrawNo); 812) drawStatDBF.Since_Last.put( drawNoStat[ l_x].sinceLast); 813) drawStatDBF.Curr_Seq.put( drawNoStat[ l_x].currSeq); 814) drawStatDBF.Longest_Seq.put( drawNoStat[ l_x].longestSeq); 815) drawStatDBF.Pct_Hits.put( drawNoStat[ l_x].pctHits); 816) drawStatDBF.Max_Btwn.put( drawNoStat[ l_x].maxBtwn); 817) drawStatDBF.Ave_Btwn.put( drawNoStat[ l_x].aveBtwn); 818) 819) drawStatDBF.getDBF().write(); 820) } catch( xBaseJException s) { 821) display_error_msg( "Error adding Drawing Stat record " + 822) s.toString()); 823) } catch( IOException i) { 824) display_error_msg( "Error reading DBF " + i.toString());
  3. Chapter 2 – Mega­Zillionaire Application 143 825) } 826) } // end for l_x loop 827) 828) System.out.println( "All Stats records successfully written"); 829) JRootPane j = (JRootPane) SwingUtilities.getAncestorOfClass ( JRootPane.class, no1); 830) if ( j != null) { 831) JOptionPane.showMessageDialog(j,"All Stats records successfully written", 832) "Stats Generated", JOptionPane.PLAIN_MESSAGE); 833) } 834) else 835) System.out.println( "j was null"); 836) 837) } // end writeDrawStats method 838) 839) 840) private void updateDrawStats( int num_sub) { 841) int l_x; 842) 843) l_x = l_draw_no - drawNoStat[ num_sub].lastDrawNo; 844) 845) if (l_x == 1) 846) { 847) drawNoStat[ num_sub].currSeq++; 848) if (drawNoStat[ num_sub].currSeq > drawNoStat [ num_sub].longestSeq) 849) { 850) drawNoStat[ num_sub].longestSeq = drawNoStat [ num_sub].currSeq; 851) } 852) } 853) else { 854) drawNoStat[ num_sub].currSeq = 0; 855) if (l_x > drawNoStat[num_sub].maxBtwn) 856) { 857) drawNoStat[ num_sub].maxBtwn = l_x; 858) } 859) } // end test for sequence 860) 861) drawNoStat[ num_sub].hitCount++; 862) drawNoStat[ num_sub].lastDrawNo = l_draw_no; 863) drawNoStat[ num_sub].sinceLast = l_x; 864) } // end updaterawStats method 865) 866) private void updateMegaStats( int num_sub) { 867) int l_x; 868) 869) l_x = l_draw_no - megaNoStat[ num_sub].lastDrawNo; 870) 871) if (l_x == 1) 872) { 873) megaNoStat[ num_sub].currSeq++; 874) if (megaNoStat[ num_sub].currSeq > megaNoStat [ num_sub].longestSeq) 875) { 876) megaNoStat[ num_sub].longestSeq = megaNoStat [ num_sub].currSeq; 877) } 878) } 879) else { 880) megaNoStat[ num_sub].currSeq = 0;
  4. 144 Chapter 2 – Mega­Zillionaire Application 881) if (l_x > megaNoStat[num_sub].maxBtwn) 882) { 883) megaNoStat[ num_sub].maxBtwn = l_x; 884) } 885) } // end test for sequence 886) 887) megaNoStat[ num_sub].hitCount++; 888) megaNoStat[ num_sub].lastDrawNo = l_draw_no; 889) megaNoStat[ num_sub].sinceLast = l_x; 890) } // end updateMegaStats method 891) 892) 893) private boolean is_record_valid() { 894) if (no1.getValue() == null) { 895) errorMsg = "No 1 Invalid"; 896) no1.requestFocus(); 897) return false; 898) } 899) 900) if (no2.getValue() == null) { 901) errorMsg = "No 2 Invalid"; 902) no2.requestFocus(); 903) return false; 904) } 905) 906) if (no3.getValue() == null) { 907) errorMsg = "No 3 Invalid"; 908) no3.requestFocus(); 909) return false; 910) } 911) 912) if (no4.getValue() == null) { 913) errorMsg = "No 4 Invalid"; 914) no4.requestFocus(); 915) return false; 916) } 917) 918) if (no5.getValue() == null) { 919) errorMsg = "No 5 Invalid"; 920) no5.requestFocus(); 921) return false; 922) } 923) 924) if ( megaNo.getValue() == null) { 925) errorMsg = "Mega No Invalid"; 926) megaNo.requestFocus(); 927) return false; 928) } 929) 930) return true; 931) } // end is_record_valid method 932) 933) void display_error_msg( String msg) { 934) JRootPane m = (JRootPane) 935) SwingUtilities.getAncestorOfClass( JRootPane.class, drawingDate); 936) if ( m != null) 937) { 938) JOptionPane.showMessageDialog(m, msg, "Entry", 939) JOptionPane.ERROR_MESSAGE); 940) } 941) else 942) System.out.println( "m was null msg was |" + msg + "|"); 943) } // end display_error_msg
  5. Chapter 2 – Mega­Zillionaire Application 145 944) 945) 946) /*;;;;; 947) * method to find first record 948) *;;;;; 949) */ 950) private boolean firstRecord() { 951) int l_x=0; 952) boolean retVal=false; 953) String find_str; 954) String localDateStr=null; 955) 956) try { 957) megaDBF.open_database(); 958) megaDBF.getDBF().startTop(); 959) megaDBF.getDBF().findNext(); 960) 961) dDrawingDate = out_format.parse( megaDBF.Draw_Dt.get()); 962) lNo1 = Integer.parseInt( megaDBF.No_1.get().trim()); 963) lNo2 = Integer.parseInt( megaDBF.No_2.get().trim()); 964) lNo3 = Integer.parseInt( megaDBF.No_3.get().trim()); 965) lNo4 = Integer.parseInt( megaDBF.No_4.get().trim()); 966) lNo5 = Integer.parseInt( megaDBF.No_5.get().trim()); 967) lMegaNo = Integer.parseInt( megaDBF.Mega_No.get().trim ()); 968) 969) if (megaDBF.getDBF().deleted()) 970) deletedFlg.setText("*"); 971) else 972) deletedFlg.setText(" "); 973) 974) megaDBF.close_database(); 975) 976) // Update the screen 977) // 978) drawingDate.setValue( new Integer(out_format.format (dDrawingDate))); 979) draw_dt_str = out_format.format( dDrawingDate); 980) no1.setValue( new Integer(lNo1)); 981) no2.setValue( new Integer(lNo2)); 982) no3.setValue( new Integer(lNo3)); 983) no4.setValue( new Integer(lNo4)); 984) no5.setValue( new Integer(lNo5)); 985) megaNo.setValue( new Integer(lMegaNo)); 986) retVal = true; 987) } catch( xBaseJException s) { 988) display_error_msg( "Unable to find " + localDateStr + 989) "Error was " + s.toString()); 990) draw_dt_str = " "; 991) lNo1 = lNo2 = lNo3 = lNo4 = lNo5 = lMegaNo = 0; 992) no1.setValue( null); 993) no2.setValue( null); 994) no3.setValue( null); 995) no4.setValue( null); 996) no5.setValue( null); 997) megaNo.setValue( null); 998) deletedFlg.setText(" "); 999) drawingDate.setValue( null); 1000) } catch( IOException i) { 1001) display_error_msg( "Unable to find " + localDateStr + 1002) "Error was " + i.toString()); 1003) draw_dt_str = " "; 1004) lNo1 = lNo2 = lNo3 = lNo4 = lNo5 = lMegaNo = 0;
  6. 146 Chapter 2 – Mega­Zillionaire Application 1005) no1.setValue( null); 1006) no2.setValue( null); 1007) no3.setValue( null); 1008) no4.setValue( null); 1009) no5.setValue( null); 1010) megaNo.setValue( null); 1011) deletedFlg.setText(" "); 1012) drawingDate.setValue( null); 1013) } catch( ParseException p) { 1014) display_error_msg( "Error parsing date " + draw_dt_str + 1015) "Error was " + p.toString()); 1016) draw_dt_str = " "; 1017) lNo1 = lNo2 = lNo3 = lNo4 = lNo5 = lMegaNo = 0; 1018) no1.setValue( null); 1019) no2.setValue( null); 1020) no3.setValue( null); 1021) no4.setValue( null); 1022) no5.setValue( null); 1023) megaNo.setValue( null); 1024) deletedFlg.setText(" "); 1025) drawingDate.setValue( null); 1026) } catch( NumberFormatException n) { 1027) display_error_msg( "Error parsing date " + draw_dt_str + 1028) "Error was " + n.toString()); 1029) draw_dt_str = " "; 1030) lNo1 = lNo2 = lNo3 = lNo4 = lNo5 = lMegaNo = 0; 1031) no1.setValue( null); 1032) no2.setValue( null); 1033) no3.setValue( null); 1034) no4.setValue( null); 1035) no5.setValue( null); 1036) megaNo.setValue( null); 1037) deletedFlg.setText(" "); 1038) drawingDate.setValue( null); 1039) } 1040) 1041) return retVal; 1042) } // end firstRecord method 1043) 1044) /*;;;;; 1045) * method to find previous record based upon drawing date 1046) *;;;;; 1047) */ 1048) private boolean prevRecord() { 1049) int l_x=0; 1050) boolean retVal=false; 1051) String find_str; 1052) String localDateStr=null; 1053) 1054) if (currMode != FIND_MODE) { 1055) display_error_msg( "Must have previously found to move back one record"); 1056) return false; 1057) } 1058) 1059) draw_dt_str = drawingDate.getText(); 1060) pad_draw_dt_str(); 1061) 1062) try { 1063) localDateStr = out_format.format( out_format.parse (draw_dt_str)); 1064) } 1065) catch( ParseException p) {
  7. Chapter 2 – Mega­Zillionaire Application 147 1066) display_error_msg( "Error parsing date " + p.toString()); 1067) localDateStr = null; 1068) } 1069) 1070) if (localDateStr == null) 1071) return false; 1072) 1073) try { 1074) megaDBF.open_database(); 1075) megaDBF.find_EQ_record( draw_dt_str); 1076) megaDBF.getDBF().findPrev(); 1077) 1078) dDrawingDate = out_format.parse( megaDBF.Draw_Dt.get()); 1079) lNo1 = Integer.parseInt( megaDBF.No_1.get().trim()); 1080) lNo2 = Integer.parseInt( megaDBF.No_2.get().trim()); 1081) lNo3 = Integer.parseInt( megaDBF.No_3.get().trim()); 1082) lNo4 = Integer.parseInt( megaDBF.No_4.get().trim()); 1083) lNo5 = Integer.parseInt( megaDBF.No_5.get().trim()); 1084) lMegaNo = Integer.parseInt( megaDBF.Mega_No.get().trim ()); 1085) 1086) if (megaDBF.getDBF().deleted()) 1087) deletedFlg.setText( "*"); 1088) else 1089) deletedFlg.setText(" "); 1090) 1091) megaDBF.close_database(); 1092) 1093) // Update the screen 1094) // 1095) drawingDate.setValue( new Integer(out_format.format (dDrawingDate))); 1096) draw_dt_str = out_format.format( dDrawingDate); 1097) no1.setValue( new Integer(lNo1)); 1098) no2.setValue( new Integer(lNo2)); 1099) no3.setValue( new Integer(lNo3)); 1100) no4.setValue( new Integer(lNo4)); 1101) no5.setValue( new Integer(lNo5)); 1102) megaNo.setValue( new Integer(lMegaNo)); 1103) retVal = true; 1104) } catch( xBaseJException s) { 1105) display_error_msg( "Unable to find " + localDateStr + 1106) "Error was " + s.toString()); 1107) draw_dt_str = " "; 1108) lNo1 = lNo2 = lNo3 = lNo4 = lNo5 = lMegaNo = 0; 1109) no1.setValue( null); 1110) no2.setValue( null); 1111) no3.setValue( null); 1112) no4.setValue( null); 1113) no5.setValue( null); 1114) megaNo.setValue( null); 1115) drawingDate.setValue( null); 1116) deletedFlg.setText(" "); 1117) } catch( IOException i) { 1118) display_error_msg( "Unable to find " + localDateStr + 1119) "Error was " + i.toString()); 1120) draw_dt_str = " "; 1121) lNo1 = lNo2 = lNo3 = lNo4 = lNo5 = lMegaNo = 0; 1122) no1.setValue( null); 1123) no2.setValue( null); 1124) no3.setValue( null); 1125) no4.setValue( null); 1126) no5.setValue( null);
  8. 148 Chapter 2 – Mega­Zillionaire Application 1127) megaNo.setValue( null); 1128) drawingDate.setValue( null); 1129) deletedFlg.setText(" "); 1130) } catch( ParseException p) { 1131) display_error_msg( "Error parsing date " + draw_dt_str + 1132) "Error was " + p.toString()); 1133) draw_dt_str = " "; 1134) lNo1 = lNo2 = lNo3 = lNo4 = lNo5 = lMegaNo = 0; 1135) no1.setValue( null); 1136) no2.setValue( null); 1137) no3.setValue( null); 1138) no4.setValue( null); 1139) no5.setValue( null); 1140) megaNo.setValue( null); 1141) drawingDate.setValue( null); 1142) deletedFlg.setText(" "); 1143) } catch( NumberFormatException n) { 1144) display_error_msg( "Error parsing date " + draw_dt_str + 1145) "Error was " + n.toString()); 1146) draw_dt_str = " "; 1147) lNo1 = lNo2 = lNo3 = lNo4 = lNo5 = lMegaNo = 0; 1148) no1.setValue( null); 1149) no2.setValue( null); 1150) no3.setValue( null); 1151) no4.setValue( null); 1152) no5.setValue( null); 1153) megaNo.setValue( null); 1154) drawingDate.setValue( null); 1155) deletedFlg.setText(" "); 1156) } 1157) 1158) return retVal; 1159) } // end prevRecord method 1160) 1161) /*;;;;; 1162) * method to find a next record based upon drawing date 1163) *;;;;; 1164) */ 1165) private boolean nextRecord() { 1166) int l_x=0; 1167) boolean retVal=false; 1168) String find_str; 1169) String localDateStr=null; 1170) 1171) draw_dt_str = drawingDate.getText(); 1172) pad_draw_dt_str(); 1173) 1174) try { 1175) localDateStr = out_format.format( out_format.parse (draw_dt_str)); 1176) } 1177) catch( ParseException p) { 1178) display_error_msg( "Error parsing date " + p.toString()); 1179) localDateStr = null; 1180) } 1181) 1182) if (localDateStr == null) 1183) return false; 1184) 1185) try { 1186) megaDBF.open_database(); 1187) megaDBF.find_GE_record( localDateStr.trim()); 1188) megaDBF.getDBF().findNext();
  9. Chapter 2 – Mega­Zillionaire Application 149 1189) 1190) dDrawingDate = out_format.parse( megaDBF.Draw_Dt.get()); 1191) lNo1 = Integer.parseInt( megaDBF.No_1.get().trim()); 1192) lNo2 = Integer.parseInt( megaDBF.No_2.get().trim()); 1193) lNo3 = Integer.parseInt( megaDBF.No_3.get().trim()); 1194) lNo4 = Integer.parseInt( megaDBF.No_4.get().trim()); 1195) lNo5 = Integer.parseInt( megaDBF.No_5.get().trim()); 1196) lMegaNo = Integer.parseInt( megaDBF.Mega_No.get().trim ()); 1197) if (megaDBF.getDBF().deleted()) 1198) deletedFlg.setText("*"); 1199) else 1200) deletedFlg.setText(" "); 1201) 1202) megaDBF.close_database(); 1203) 1204) // Update the screen 1205) // 1206) drawingDate.setValue( new Integer(out_format.format (dDrawingDate))); 1207) draw_dt_str = out_format.format( dDrawingDate); 1208) no1.setValue( new Integer(lNo1)); 1209) no2.setValue( new Integer(lNo2)); 1210) no3.setValue( new Integer(lNo3)); 1211) no4.setValue( new Integer(lNo4)); 1212) no5.setValue( new Integer(lNo5)); 1213) megaNo.setValue( new Integer(lMegaNo)); 1214) retVal = true; 1215) } catch( xBaseJException s) { 1216) display_error_msg( "Unable to find " + localDateStr + 1217) "Error was " + s.toString()); 1218) draw_dt_str = " "; 1219) lNo1 = lNo2 = lNo3 = lNo4 = lNo5 = lMegaNo = 0; 1220) no1.setValue( null); 1221) no2.setValue( null); 1222) no3.setValue( null); 1223) no4.setValue( null); 1224) no5.setValue( null); 1225) megaNo.setValue( null); 1226) drawingDate.setValue( null); 1227) } catch( IOException i) { 1228) display_error_msg( "Unable to find " + localDateStr + 1229) "Error was " + i.toString()); 1230) draw_dt_str = " "; 1231) lNo1 = lNo2 = lNo3 = lNo4 = lNo5 = lMegaNo = 0; 1232) no1.setValue( null); 1233) no2.setValue( null); 1234) no3.setValue( null); 1235) no4.setValue( null); 1236) no5.setValue( null); 1237) megaNo.setValue( null); 1238) drawingDate.setValue( null); 1239) } catch( ParseException p) { 1240) display_error_msg( "Error parsing date " + draw_dt_str + 1241) "Error was " + p.toString()); 1242) draw_dt_str = " "; 1243) lNo1 = lNo2 = lNo3 = lNo4 = lNo5 = lMegaNo = 0; 1244) no1.setValue( null); 1245) no2.setValue( null); 1246) no3.setValue( null); 1247) no4.setValue( null); 1248) no5.setValue( null); 1249) megaNo.setValue( null);
  10. 150 Chapter 2 – Mega­Zillionaire Application 1250) drawingDate.setValue( null); 1251) } 1252) 1253) return retVal; 1254) } // end nextRecord method 1255) 1256) /*;;;;; 1257) * method to find last record based upon drawing date 1258) *;;;;; 1259) */ 1260) private boolean lastRecord() { 1261) int l_x=0; 1262) boolean retVal=false; 1263) String find_str; 1264) String localDateStr=null; 1265) 1266) try { 1267) megaDBF.open_database(); 1268) megaDBF.getDBF().startBottom(); 1269) megaDBF.getDBF().findPrev(); 1270) 1271) dDrawingDate = out_format.parse( megaDBF.Draw_Dt.get()); 1272) lNo1 = Integer.parseInt( megaDBF.No_1.get().trim()); 1273) lNo2 = Integer.parseInt( megaDBF.No_2.get().trim()); 1274) lNo3 = Integer.parseInt( megaDBF.No_3.get().trim()); 1275) lNo4 = Integer.parseInt( megaDBF.No_4.get().trim()); 1276) lNo5 = Integer.parseInt( megaDBF.No_5.get().trim()); 1277) lMegaNo = Integer.parseInt( megaDBF.Mega_No.get().trim ()); 1278) 1279) if (megaDBF.getDBF().deleted()) 1280) deletedFlg.setText("*"); 1281) else 1282) deletedFlg.setText(" "); 1283) 1284) megaDBF.close_database(); 1285) 1286) // Update the screen 1287) // 1288) drawingDate.setValue( new Integer(out_format.format (dDrawingDate))); 1289) draw_dt_str = out_format.format( dDrawingDate); 1290) no1.setValue( new Integer(lNo1)); 1291) no2.setValue( new Integer(lNo2)); 1292) no3.setValue( new Integer(lNo3)); 1293) no4.setValue( new Integer(lNo4)); 1294) no5.setValue( new Integer(lNo5)); 1295) megaNo.setValue( new Integer(lMegaNo)); 1296) retVal = true; 1297) } catch( xBaseJException s) { 1298) display_error_msg( "Unable to find " + localDateStr + 1299) "Error was " + s.toString()); 1300) draw_dt_str = " "; 1301) lNo1 = lNo2 = lNo3 = lNo4 = lNo5 = lMegaNo = 0; 1302) no1.setValue( null); 1303) no2.setValue( null); 1304) no3.setValue( null); 1305) no4.setValue( null); 1306) no5.setValue( null); 1307) megaNo.setValue( null); 1308) drawingDate.setValue( null); 1309) } catch( IOException i) { 1310) display_error_msg( "Unable to find " + localDateStr +
  11. Chapter 2 – Mega­Zillionaire Application 151 1311) "Error was " + i.toString()); 1312) draw_dt_str = " "; 1313) lNo1 = lNo2 = lNo3 = lNo4 = lNo5 = lMegaNo = 0; 1314) no1.setValue( null); 1315) no2.setValue( null); 1316) no3.setValue( null); 1317) no4.setValue( null); 1318) no5.setValue( null); 1319) megaNo.setValue( null); 1320) drawingDate.setValue( null); 1321) } catch( ParseException p) { 1322) display_error_msg( "Error parsing date " + draw_dt_str + 1323) "Error was " + p.toString()); 1324) draw_dt_str = " "; 1325) lNo1 = lNo2 = lNo3 = lNo4 = lNo5 = lMegaNo = 0; 1326) no1.setValue( null); 1327) no2.setValue( null); 1328) no3.setValue( null); 1329) no4.setValue( null); 1330) no5.setValue( null); 1331) megaNo.setValue( null); 1332) drawingDate.setValue( null); 1333) } 1334) 1335) return retVal; 1336) } // end findRecord method 1337) 1338) 1339) } // end MegaXbaseEntryPanel class definition I'm  sorry.  The listing for MegaXbaseEntryPanel is just long.  It would have been even longer if I had continued adding some other neat features.  We need to start our discussion at listing lines 79 through 102.  I have no way of knowing what level your Java skills are, so let me point out the internal class contraption we use to verify drawing number input is within a valid range.  Everything between the first { and the ending } becomes   the  body  of  the  abstract  class.     We  must  provide   a  Boolean   verify()   method   and  a Boolean   shouldYieldFocus()   method.     The   actual   editing/validating   happens   in   the   verify() method.  Here we convert the JComponent object to a type we know it to be.  (Yes, I could have made this even more robust by checking with instanceof.)  We pass back either true or false to indicate the quality of the data. You will find documentation online which claims the shouldYieldFocus() method is optional. I wouldn't  buy that statement even if they paid me to take it, mainly because years ago I tried to leave it out.  We aren't  far enough into the source code yet, but it shouldn't  take much for you to believe that I like to toss up error message dialogs when something failed validation.  After the first error tries to throw a dialog up you find yourself in a deadly embrace with multiple things absolutely demanding they be allowed to have focus at the same time.  It's  not a pretty picture. Depending on how you launched your application you could even be forced to reboot.  You don't directly call shouldYieldFocus(), the underlying Swing API does.
  12. 152 Chapter 2 – Mega­Zillionaire Application Please look at listing lines 254 through 259.   This is where we create the “top  of data”  or “first  record”  button (
  13. Chapter 2 – Mega­Zillionaire Application 153 The section of code at listing lines 493 through 504 contains a serious multi­user problem.  I dutifully found the record to update, moved in the values, and wrote it back to the file.  What I didn't do was check to see whether any other user or process had changed the values of that record between the time the entry screen loaded it and the user chose to save it. We don't  have anything interesting to talk about until we get down to listing lines 762 and 763.  This is the first, and only, time I use the StatDBF class we created.  Notice how I passed a short  name  without   extension to  the create_database()  method.    I do  not  know  if the  xBaseJ library has a file name length limitation, but it was 8.3 at one point during the days of DOS.  Since I will be adding “k 0”  to the end of the name to create the NDX files, I opted to pass only 6 characters in.   I also allow Java garbage  collection to close off these files sometime after the objects go out of scope. Listing   line   832   contains   another   version   of   that   message   dialog.     This   time   we   pass PLAIN_MESSAGE   as   the   option   so   Swing   displays   a   run­of­the­mill   status   message   dialog instead of an error message. Listing lines 969 through 972 contain an if statement which is replicated in a few places. Here we call the deleted() method provided by the DBF class to determine if we display a space or an “*” in the Deleted field on the screen. Notice that each “find”  method in this class stores the values found in class global fields. You need to pay attention  to that design feature if you intend to complete one of the assignments coming up at the end of the chapter. Listing lines 978 and 979 may require a tiny bit of explanation.  The object which allows for date entry on our panel is a simple JformattedTextField.  I chose not to play games trying to make this display with a pretty format.  It's  not that I don't  like pretty date formats, it's  just that I didn't want to install and include the apache libraries to get their JdateField object and I didn't  want to complicate the entry sequence by creating a JDateChooser object.  The end result is that we have to convert the date from the database from string to a date object Java likes, then format it to a new string to convert to an Integer object.  The conversion from string into a date data type helps validate the column on the database.  We could choose to trust it, but why bother when it doesn't cost that many cycles to be sure? There you have it:  The biggest source file I'v shown you so far in this book.  Perhaps you e noticed   we   talked  more   about  the   Java  aspects  of  this   module  than   the  xBaseJ  aspects.   You already have most of the fundamentals down.  The purpose of this chapter is to give you ideas on how to bolt them together correctly, at least from a design standpoint.
  14. 154 Chapter 2 – Mega­Zillionaire Application 2.4 The Import Dialog  The import dialog is going to seem really lame after the main portion of this application.  I chose to make the import module a dialog before  I started writing the rest of the application. There was actually a method to the madness.  If the Import function was simply another panel, it would be possible for a user to choose a file name, then leave the screen by selecting another menu option.  He or she would not have actually performed the import, but might believe it was complete.  Making this a dialog stopped that from happening. MegaXImport.java 1) package com.logikal.megazillxBaseJ; 2) 3) import java.awt.*; 4) import java.awt.event.*; 5) import javax.swing.*; 6) import javax.swing.filechooser.*; 7) import java.text.*; 8) import java.util.*; 9) import java.io.*; 10) 11) import org.xBaseJ.*; 12) import org.xBaseJ.fields.*; 13) import org.xBaseJ.Util.*; 14) import org.xBaseJ.indexes.NDX; 15) 16) import com.logikal.megazillxBaseJ.MegaDBF; 17) 18) public class MegaXImport extends JDialog implements ActionListener{ 19) // Variables 20) public JButton importData=null; 21) public JButton exitButton=null; 22) public JButton chooseFile=null; 23) private JTextField csvNameField=null; 24) private JPanel line1Panel=null; 25) private JPanel line2Panel=null; 26) private MegaDBF MegaDB = null; 27) private String CsvName=null; 28) private JTextArea importRptArea; 29) private JScrollPane sp; 30) private JFileChooser fc; 31) 32) 33) // constructor 34) public MegaXImport(Frame owner) { 35) 36) super( owner, "Import CSV", true); // constructor for parent class 37) setSize( 800, 500); 38) setLayout( new FlowLayout()); 39) 40) line1Panel = new JPanel( new FlowLayout( FlowLayout.LEFT)); 41) JLabel csvNameLabel = new JLabel("CSV File:"); 42) line1Panel.add(csvNameLabel); 43) 44) csvNameField = new JTextField(40); 45) csvNameField.setEditable( false); 46) line1Panel.add(csvNameField); 47)
  15. Chapter 2 – Mega­Zillionaire Application 155 48) line2Panel = new JPanel( new FlowLayout( FlowLayout.LEFT)); 49) 50) importRptArea = new JTextArea(); 51) // Gives you a fixed width font. 52) importRptArea.setFont(new Font("Courier", Font.PLAIN, 12)); 53) importRptArea.setEditable( false); 54) importRptArea.setTabSize(4); 55) importRptArea.setColumns( 80); 56) importRptArea.setRows(1000); 57) importRptArea.setDoubleBuffered( true); 58) sp = new JScrollPane( importRptArea); 59) sp.setPreferredSize( new Dimension( 500, 300)); 60) 61) line2Panel.add(sp); 62) 63) 64) chooseFile = new JButton(); 65) chooseFile.setText("Choose File"); 66) chooseFile.addActionListener( this); 67) line1Panel.add( chooseFile); 68) 69) importData = new JButton(); 70) importData.setText("OK"); 71) importData.addActionListener( this); 72) line2Panel.add(importData); 73) 74) exitButton = new JButton(); 75) exitButton.setText( "Exit"); 76) exitButton.addActionListener( this); 77) line2Panel.add(exitButton); 78) 79) add( line1Panel); 80) add( line2Panel); 81) chooseFile.requestFocus(); 82) getRootPane().setDefaultButton( importData); 83) 84) setLocationRelativeTo(owner); 85) 86) MegaDB = new MegaDBF(); 87) 88) } // end constructor for RdbLogin 89) 90) 91) //;;;;; 92) // Obtain file name and kick off import process 93) //;;;;; 94) public void actionPerformed(ActionEvent event) { 95) 96) String actionStr = event.getActionCommand(); 97) if (actionStr.indexOf( "Exit") > -1) { 98) this.setVisible( false); 99) return; 100) } 101) 102) if (actionStr.indexOf( "Choose") > -1) { 103) fc = new JFileChooser(); 104) int ret_val = fc.showOpenDialog(this); 105) if (ret_val == JFileChooser.APPROVE_OPTION) { 106) File f = fc.getSelectedFile(); 107) csvNameField.setText( f.getAbsolutePath()); 108) } 109) } // end test for choose actionStr 110)
  16. 156 Chapter 2 – Mega­Zillionaire Application 111) 112) if (actionStr.indexOf( "OK") > -1) { 113) if (!importCSV(csvNameField.getText() )) { 114) importRptArea.append( "Import not successfull\n"); 115) importRptArea.append( "please try again\n"); 116) } 117) } 118) } // end actionPerformed 119) 120) //;;;;; 121) // Actual import logic happens here 122) //;;;;; 123) private boolean importCSV( String the_file) { 124) String line_in_str = null; 125) long l_record_count = 0; 126) boolean eof_flg = false, ret_val = false; 127) FileReader in_file = null; 128) BufferedReader input_file = null; 129) 130) importRptArea.append( "\nAttempting to import " + the_file + "\n"); 131) updateText(); 132) 133) try { 134) in_file = new FileReader( the_file); 135) } catch (FileNotFoundException f) { 136) importRptArea.append("File Not Found " + the_file); 137) eof_flg = true; 138) } // end catch for file not found 139) 140) if (eof_flg == true) 141) return ret_val; 142) 143) MegaDB.create_database(); 144) 145) input_file = new BufferedReader( in_file,4096); 146) importRptArea.append("\nPopulating database\n"); 147) updateText(); 148) 149) while (eof_flg == false) { 150) try { 151) line_in_str = input_file.readLine(); 152) } 153) catch (EOFException e) { 154) importRptArea.append( "End of file exception\n"); 155) eof_flg = true; 156) } 157) catch (IOException e) { 158) importRptArea.append( "An IO Exception occurred\n"); 159) importRptArea.append( e.toString()); 160) //e.printStackTrace(); 161) eof_flg = true; 162) } 163) if (eof_flg == true) continue; 164) if (line_in_str == null) { 165) importRptArea.append( "End of intput file reached\n"); 166) eof_flg = true; 167) continue; 168) } 169) 170) l_record_count++; 171) String input_flds[] = line_in_str.split( ","); 172) 173) try {
  17. Chapter 2 – Mega­Zillionaire Application 157 174) MegaDB.No_1.put( input_flds[1]); 175) MegaDB.No_2.put( input_flds[2]); 176) MegaDB.No_3.put( input_flds[3]); 177) MegaDB.No_4.put( input_flds[4]); 178) MegaDB.No_5.put( input_flds[5]); 179) MegaDB.Mega_No.put( input_flds[6]); 180) 181) String date_parts[] = input_flds[0].split("-"); 182) String dt_str = date_parts[0] + date_parts[1] + date_parts [2]; 183) MegaDB.Draw_Dt.put( dt_str); 184) 185) MegaDB.getDBF().write(); 186) 187) } catch ( xBaseJException j){ 188) j.printStackTrace(); 189) } catch( IOException i) { 190) importRptArea.append( i.getMessage()); 191) } 192) 193) if ( (l_record_count % 100) == 0) { 194) importRptArea.append( "Processed " + l_record_count + 195) " records\n"); 196) updateText(); 197) } // end of test for status message 198) 199) } // end while loop to load records 200) 201) importRptArea.append( "Finished adding " + l_record_count + 202) " records\n"); 203) 204) return true; 205) 206) } // end importCSV method 207) 208) public void updateText() { 209) importRptArea.invalidate(); 210) importRptArea.validate(); 211) importRptArea.paintImmediately( importRptArea.getVisibleRect()); 212) } 213) } // end MegaXImport class Listing lines 24 and 25 are worthy of note.   Some of you may have the impression that a panel is a screen.  As our constructor shows, this is simply not the case.  We allocate one panel to contain the the CSV file name prompt, text field, and the Choose button.   A second panel is created to contain the text area and scroll pane along with the Ok and Exit buttons.  When you are using the FlowLayout instead of the GridLayout it is quite common to have multiple panels in a containing object.  It provides a method of “controlling the flow” by grouping objects together. Notice listing lines 81 through 84.  After we have added the panels to the dialog, we have the button to choose a file request focus but we set the default button to be the import button.  If you have tried running the application you will already have learned “the  last one in won.”   The text entry field is the field which actually has focus, but the Ok button is highlighted to indicate that hitting return will activate it.
  18. 158 Chapter 2 – Mega­Zillionaire Application Listing line 104 is what ensures the user must complete the file chooser dialog one way or another before this dialog continues.  I hope you don't  find it strange that a dialog can throw up a dialog which can throw up another dialog that can throw up another dialog.  I haven't  conducted a test to see just how deep you can go, but I assume it has something to do with a 2GB memory limit imposed on many JVM installs. The dialog returns an integer value to inform us of its completion status.  If the user chose and approved a file name, we call getSelectedFile() to obtain the File object.  We then have to call getAbsolutePath() to obtain the full path name.  Under most circumstances, you cannot open the file unless you provide the full path name.  I didn't  provide a starting location for the file chooser so it will start in the user's  home directory instead of the current working directory.  If you want it to start there simply change listing line 103 to read as follows: fc = new JfileChooser(System.getProperty("user.dir")); There   isn'tmuch   left   to   discuss   in   the   importCSV()   method.     You   know   that   I   call   the   updateText() method to force screen updates so my status messages get displayed while they are relevant instead of after the task completes.  I have already provided you several examples which read a line of input from a text file and use the String split() method to break it into separate data items.   We have used the Field put() method and the DBF write() method many times over in previous source listings. MegaXbase.java 1) import java.awt.*; 2) import java.awt.event.*; 3) import javax.swing.*; 4) import javax.swing.plaf.*; 5) 6) import com.sun.java.swing.plaf.windows.WindowsLookAndFeel; 7) import com.sun.java.swing.plaf.gtk.GTKLookAndFeel; 8) import com.sun.java.swing.plaf.motif.MotifLookAndFeel; 9) 10) import com.logikal.megazillxBaseJ.MegaXImport; 11) import com.logikal.megazillxBaseJ.MegaXbaseBrowsePanel; 12) import com.logikal.megazillxBaseJ.MegaXbaseEntryPanel; 13) import com.logikal.megazillxBaseJ.MegaXbaseDuePanel; 14) 15) public class MegaXbase implements ActionListener, ItemListener { 16) 17) private JFrame mainFrame=null; 18) private JPanel mainPanel=null; 19) private JMenuBar mb = null; 20) private JPanel blankPanel=null; 21) private MegaXbaseBrowsePanel mxb=null; 22) private MegaXbaseEntryPanel mxe=null; 23) private MegaXbaseDuePanel md=null; 24) 25) final static String MOSTPANEL = "Most Report"; 26) final static String DUEPANEL = "Due Report"; 27) final static String DUMPPANEL = "Dump Report"; 28) final static String ENTRYPANEL = "Entry";
  19. Chapter 2 – Mega­Zillionaire Application 159 29) final static String BLANKPANEL = "Blank"; 30) final static String BROWSEPANEL = "Browse"; 31) 32) public MegaXbase() { 33) //---------- 34) // All of this code just to set the look and feel 35) // 36) int nimbus_sub = -1; 37) int motif_sub = -1; 38) int chosen_sub; 39) 40) try { 41) // Set System Look and Feel 42) UIManager.LookAndFeelInfo lf[] = UIManager.getInstalledLookAndFeels(); 43) for( int y=0; y < lf.length; y++) { 44) String s = lf[ y].getName(); 45) System.out.println( s); 46) if ( s.indexOf( "Nimbus") > -1) { 47) nimbus_sub = y; 48) System.out.println( "\tNimbus found"); 49) } 50) if ( s.indexOf( "Motif") > -1) { 51) motif_sub = y; 52) System.out.println( "\tMotif found"); 53) } 54) } 55) 56) if ( nimbus_sub > -1) 57) chosen_sub = nimbus_sub; 58) else if ( motif_sub > -1) 59) chosen_sub = motif_sub; 60) else chosen_sub = 0; 61) 62) UIManager.setLookAndFeel( lf[chosen_sub].getClassName()); 63) // UIManager.getSystemLookAndFeelClassName()); 64) } 65) catch (UnsupportedLookAndFeelException e) { 66) System.out.println( "Unsupported look and feel"); 67) } 68) catch (ClassNotFoundException e) { 69) System.out.println( "classnotfound"); 70) } 71) catch (InstantiationException e) { 72) System.out.println( "Instantiation exeception"); 73) } 74) catch (IllegalAccessException e) { 75) System.out.println( "Illegal Access"); 76) } 77) 78) mainFrame = new JFrame("Mega xBaseJ Window"); 79) mainFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE); 80) 81) mainFrame.setJMenuBar( createMenu()); 82) 83) mainPanel = new JPanel(new CardLayout()); 84) mainPanel.setOpaque(true); 85) 86) blankPanel = new JPanel(); 87) mxb = new MegaXbaseBrowsePanel(); 88) mxe = new MegaXbaseEntryPanel(); 89) md = new MegaXbaseDuePanel(); 90) 91) mainPanel.add( blankPanel, BLANKPANEL);
  20. 160 Chapter 2 – Mega­Zillionaire Application 92) mainPanel.add( mxb, BROWSEPANEL); 93) mainPanel.add( mxe, ENTRYPANEL); 94) mainPanel.add( md, DUEPANEL); 95) 96) mainFrame.setContentPane( mainPanel); 97) 98) mainFrame.setSize(800, 500); 99) mainFrame.setVisible( true); 100) 101) } // end default constructor 102) 103) private JMenuBar createMenu() { 104) JMenu fileMenu, reportMenu; 105) JMenuItem menuItem; 106) 107) mb = new JMenuBar(); 108) 109) //;;;;; 110) // Build the File menu 111) //;;;;; 112) fileMenu = new JMenu("File"); 113) fileMenu.setMnemonic(KeyEvent.VK_F); 114) fileMenu.getAccessibleContext().setAccessibleDescription( 115) "File operation menu"); 116) 117) // Import menu option 118) menuItem = new JMenuItem("Import", KeyEvent.VK_I); 119) menuItem.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_I, 120) ActionEvent.ALT_MASK)); 121) menuItem.getAccessibleContext().setAccessibleDescription( 122) "Imports data from CSV creating new DBF"); 123) menuItem.setActionCommand("Import"); 124) menuItem.addActionListener( this); 125) fileMenu.add( menuItem ); 126) 127) // Maintenance Menu Option 128) menuItem = new JMenuItem("Maintenance", KeyEvent.VK_M); 129) menuItem.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_M, 130) ActionEvent.ALT_MASK)); 131) menuItem.getAccessibleContext().setAccessibleDescription( 132) "Manual Entry/Editing/Deletion"); 133) menuItem.setActionCommand("Entry"); 134) menuItem.addActionListener( this); 135) fileMenu.add( menuItem); 136) 137) // Browse option 138) menuItem = new JMenuItem("Browse", KeyEvent.VK_B); 139) menuItem.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_B, 140) ActionEvent.ALT_MASK)); 141) menuItem.getAccessibleContext().setAccessibleDescription( 142) "View Data"); 143) menuItem.setActionCommand("Browse"); 144) menuItem.addActionListener( this); 145) fileMenu.add( menuItem); 146) 147) 148) fileMenu.addSeparator(); 149) 150) menuItem = new JMenuItem("Exit", KeyEvent.VK_X); 151) menuItem.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_X, 152) ActionEvent.ALT_MASK)); 153) menuItem.getAccessibleContext().setAccessibleDescription( 154) "Exit program");
Đồng bộ tài khoản