整整一个星期都在搞这个东西,直到今天终于做完了,眼泪哗哗的。。。。。。
这个项目的最大问题有两个,首先是数组越界问题,始终没有解决好,导致每次离成功还有一两步的时候程序就倒了,然后改来改去,最终就改成了另外一种版本的了。
由此,引出了另一个重大问题,就是设计的问题。何雷曾经给我们讲过,一个项目首先应该有一个清晰的思路,比较详细的设计,然后根据这个设计搭一个框架出来,然后逐步去实现框架内的东西。而我的小项目基本上就是脑子里大概有个总体的想法,然后一步一步去实现,但是开始的时候没有统筹好,导致后来出现了思路混乱,数组越界等诸多难以解决的问题。
最大的收获时发现自己的差距和不足,希望能尽快改进,加强学习。
下面是程序的需求:
1 实现一个SWT窗口
2 在窗口中输入文件,判断文件是否符合规则。
3 文件格式如下:
pdu 信号名{
数据# 注释
}
其中: 数据分两部分:16进制数和字符串。如果是字符串,必须以" "标示,引号中字符必须是a~z A~Z 0~9 . : ; @
,并且,注释一直识别到行尾。
以下是代码:
/**
* a SWT programme ,check the input
* whether fit the rule
* @author tianrenliang
* @version 1.0
*/
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Label;
public class checkMenu {
private static Shell sShell = null ; // @jve:decl-index=0:visual-constraint="10,10"
private static Button buttonCheck = null ;
private static Text textArea = null ;
private static Label labelMessage = null ;
private static Text text = null ;
static String start = " pdu " ; // @jve:decl-index=0:
static char signalBegin = ' { ' ;
static char signalEnd = ' } ' ;
static char remarkTag = ' # ' ;
static char stringTag = ' " ' ;
static char lineChangeTag = ' ' ;
static char lineEndTag = ' ' ;
static String signLib = " ;:.@ " ;
private static void createSShell() {
/* shell initializes */
sShell = new Shell();
sShell.setText( " CheckInput " );
sShell.setSize( new Point( 425 , 360 ));
sShell.setLayout( null );
/* button initializes */
buttonCheck = new Button(sShell, SWT.NONE);
buttonCheck.setBounds( new Rectangle( 350 , 287 , 65 , 27 ));
buttonCheck.setText( " CHECK " );
/* label initializes */
labelMessage = new Label(sShell, SWT.NONE);
labelMessage.setBounds( new Rectangle( 3 , 267 , 102 , 17 ));
labelMessage.setText( " Information: " );
/* textArea initializes */
textArea = new Text(sShell, SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
textArea.setBounds( new Rectangle( 0 , 16 , 348 , 239 ));
/* text initializes */
text = new Text(sShell, SWT.BORDER);
text.setBounds( new Rectangle( 2 , 286 , 345 , 33 ));
text.setEditable( false );
/* Mouse click action */
buttonCheck.addSelectionListener( new SelectionListener() {
public void widgetSelected(SelectionEvent event) {
if (check())
text.setText( " Right input " );
else
text.setText( " Wrong input " );
}
public void widgetDefaultSelected(SelectionEvent event)
{
text.setText( " Need to Click " );
}
});
}
/**
* check all the rules
* @return if match the rule return true ,else return false
* @author tianrenliang
* @since v0.1(2007-10-23)
*/
private static boolean check(){
String stringCheck = textArea.getText();
String contentPart = getContent(stringCheck);
String command = getCommand(stringCheck);
if ( ! stringCheck.equals( "" ))
{
/* if remark part exist,check the rules
* all the check rules right the check
* function return 1;else return 0 */
if (checkPdu(stringCheck) && checkCommand(command)
&& checkChangeLineFirst(stringCheck)
&& checkEnd(stringCheck) && checkSecondLine(contentPart))
{
return true ;
}
else
{
return false ;
}
}
else
{
return true ;
}
}
/**
* check pdu
* @param checkString
* @return true ,false
* @author tianrenliang
* @since v0.1(2007-10-23)
*/
private static boolean checkPdu(String checkString) {
if (checkString.length() >= start.length())
{
String sub = checkString.substring( 0 ,start.length());
if (sub.equals(start))
{
return true ;
}
}
else
{
return false ;
}
return true ;
}
/**
* get command
* @param checkString
* @return true ,false
* @author tianrenliang
* @since v0.1(2007-10-23)
*/
private static String getCommand(String checkString){
String command = "" ;
if (checkString.length() > start.length())
{
for ( int i = start.length(); i < checkString.length(); i ++ )
{
if (checkString.charAt(i) == signalBegin)
{
command = checkString.substring(start.length(), i);
return command;
}
}
return checkString.substring(start.length());
}
return null ;
}
/**
* check the character whether number
* @author tianrenliang
* @since v0.1(2007-10-23)
*/
private static boolean isDigit( char character){
if (character < ' 0 ' || character > ' 9 ' )
{
return false ;
}
else
{
return true ;
}
}
/**
* check the character whether letter
* @author tianrenliang
* @since v0.1(2007-10-23)
*/
private static boolean isLetter( char character){
if ((character < ' a ' || character > ' z ' )
&& (character < ' A ' || character > ' Z ' ))
{
return false ;
}
else
{
return true ;
}
}
private static boolean isSign( char character){
for ( int i = 0 ;i < signLib.length();i ++ )
{
if (signLib.charAt(i) == character)
{
return true ;
}
}
return false ;
}
/**
* check is Hex
* @author tianrenliang
* @since v0.1(2007-10-23)
*/
private static boolean isHex( char character){
if ((character < ' a ' || character > ' f ' )
&& (character < ' A ' || character > ' F ' ))
{
return false ;
}
else
{
return true ;
}
}
/**
* check Command,cannot begin with '-'and number
* @param checkString
* @return true,false
* @author tianrenliang
* @since v0.1(2007-10-22)
*/
private static boolean checkCommand(String checkString){
if (checkString != null )
{
if ((checkString.charAt( 0 ) != ' _ ' )
&& ( ! isDigit(checkString.charAt( 0 ))))
{
for ( int i = 0 ; i < checkString.length(); i ++ )
{
if ( ! isDigit(checkString.charAt(i))
&& ( ! isLetter(checkString.charAt(i))))
{
return false ;
}
}
}
else
{
return false ;
}
}
return true ;
}
/**
* Check the first line change
* @param checkString
* @return true,false
* @author tianrenliang
* @since v0.1(2007-10-23)
*/
private static boolean checkChangeLineFirst(String checkString){
for ( int i = 0 ;i < checkString.length();i ++ )
{
if (checkString.charAt(i) == signalBegin)
{
if (i + 1 < checkString.length())
{
if (checkString.charAt(i + 1 ) != lineEndTag)
{
return false ;
}
else
{
return true ;
}
}
}
}
return true ;
}
/**
* check the Content start position
* @param checkString
* @return the start position of the content part
* @author tianrenliang
* @since v0.1(2007-10-23)
*
*/
private static int contentStartPosition(String checkString){
for ( int i = 0 ;i < checkString.length();i ++ )
{
if (checkString.charAt(i) == lineChangeTag)
{
return i;
}
}
return 0 ;
}
/**
* check the Content end position
* @param checkString
* @return the end position of the content part
* @author tianrenliang
* @since v0.1(2007-10-23)
*/
private static int contentEndPosition(String checkString){
for ( int i = 0 ;i < checkString.length();i ++ )
{
if (checkString.charAt(i) == signalEnd)
{
// retrun content end . In windows OS, is the line change tag
return i - 2 ;
}
}
return checkString.length();
}
/**
* get substring about the Content part
* @param checkString
* @return string of content part
* @author tianrenliang
* @since v0.1(2007-10-23)
*
*/
private static String getContent(String checkString)
{
int ContentStarPosition = contentStartPosition(checkString);
int MarkPosition = checkString.indexOf(remarkTag);
if (ContentStarPosition != 0 )
{
if (MarkPosition > 0 )
{
String ContentPart =
checkString.substring(ContentStarPosition + 1 , MarkPosition);
return ContentPart.trim(); // return string with out space
}
else
{
int ContentEndPosition = contentEndPosition(checkString);
/* defense starposition out of arrayif no input */
String ContentPart = checkString
.substring(ContentStarPosition + 1 , ContentEndPosition);
return ContentPart.trim(); // return string with out space
}
}
else return null ;
}
/**
* check Content
* @param checkString
* @return if right return 1,else return function remark
* @author tianrenliang
* @since v0.1(2007-10-23)
*/
private static int checkContent(String checkString){
if (checkString != null )
{
for ( int i = 0 ;i < checkString.length();i ++ )
{
if (checkString.charAt(i) != stringTag)
{
if (checkString.charAt(i) != remarkTag)
{
if (( ! isDigit(checkString.charAt(i))
&& ( ! isHex(checkString.charAt(i)))))
return 0 ;
}
else return checkRemark(checkString);
}
else return 1 ;
}
}
return 1 ;
}
/**
* check String
* @param checkString
* @return if rigtht return 1, else return function
* @author tianrenliang
* @since v0.1(2007-10-23)
*
*/
private static int checkString(String checkString)
{
int i = 0 ;
if (checkString != null )
{
if (checkString.charAt(i) != remarkTag)
{
for ( i = 0 ;i < checkString.length();i ++ )
{
if ( ! isDigit(checkString.charAt(i))
&& ( ! isLetter(checkString.charAt(i)))
&& ( ! isSign(checkString.charAt(i))))
return 0 ;
}
}
else return checkRemark(checkString);
}
return 1 ;
}
/**
* check the remark part
* @param checkString
* @return return the length of the remark part
* @author tianrenliang
* @since v0.1(2007-10-23)
*
*/
private static int checkRemark(String checkString){
int i = 0 ;
if (checkString.charAt(i) == remarkTag)
{
/* in remark part, just return the end of the remark part */
for (i = 0 ;checkString.charAt(i) != lineEndTag;i ++ )
{
}
return i;
}
return 1 ;
}
/**
* check the data part.both check the hex and the string
* @param checkString
* @return true,false
* @author tianrenliang
* @since v0.1(2007-10-23)
*/
private static boolean checkSecondLine(String checkString)
{
if (checkString != null )
{
String StringPart = checkString;
String subString = checkString;
int a = 1 ,b = 1 ,c = 1 ,d = 1 ;
int leftLength = checkString.length();
while (leftLength > 0 )
{
int StringStartPosition = 0 ;
int StringEndPosition = StringStartPosition;
StringStartPosition = subString.indexOf(stringTag);
String DataPart = "" ;
if (StringStartPosition >= 0 )
{
DataPart = subString.substring( 0 , StringStartPosition);
a = checkContent(DataPart);
StringPart = subString.substring(StringStartPosition + 1 );
StringEndPosition = StringPart.indexOf(stringTag);
// defence,because if not find '"',indexOf return -1.
if (StringEndPosition !=- 1 )
{
String SubStringPart =
StringPart.substring( 0 , StringEndPosition);
b = checkString(SubStringPart);
if (StringEndPosition == (leftLength - 1 ))
{
subString = "" ;
break ;
}
subString = StringPart.substring(StringEndPosition + 1 );
}
else
{
textArea.setText( " String Input Uncomplete .Please input again! " );
return true ;
}
}
else
{
d = checkContent(subString);
subString = "" ;
}
/* judge every time ,if evevy a,b,c,d is 0,error!
* if this scentence not write,a,b,c,d may be changed
int the next round */
if (a > 0 && b > 0 && c > 0 && d > 0 )
{
leftLength = subString.length();
}
else return false ;
}
if (a > 0 && b > 0 && c > 0 && d > 0 )
{
return true ;
}
else return false ;
}
return true ;
}
/**
* check the end whether end with '}'
* TODO <br>
* @param checkString
* @return true , false
* @author tianrenliang
* @since v0.1(2007-10-23)
*/
private static boolean checkEnd(String checkString){
for ( int i = 0 ;i < checkString.length();i ++ )
{
if (checkString.charAt(i) == signalEnd)
{
if (i + 1 < checkString.length())
{
return false ;
}
else if (checkString.charAt(i - 1 ) != lineChangeTag)
return false ;
}
}
return true ;
}
}
* a SWT programme ,check the input
* whether fit the rule
* @author tianrenliang
* @version 1.0
*/
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Label;
public class checkMenu {
private static Shell sShell = null ; // @jve:decl-index=0:visual-constraint="10,10"
private static Button buttonCheck = null ;
private static Text textArea = null ;
private static Label labelMessage = null ;
private static Text text = null ;
static String start = " pdu " ; // @jve:decl-index=0:
static char signalBegin = ' { ' ;
static char signalEnd = ' } ' ;
static char remarkTag = ' # ' ;
static char stringTag = ' " ' ;
static char lineChangeTag = ' ' ;
static char lineEndTag = ' ' ;
static String signLib = " ;:.@ " ;
private static void createSShell() {
/* shell initializes */
sShell = new Shell();
sShell.setText( " CheckInput " );
sShell.setSize( new Point( 425 , 360 ));
sShell.setLayout( null );
/* button initializes */
buttonCheck = new Button(sShell, SWT.NONE);
buttonCheck.setBounds( new Rectangle( 350 , 287 , 65 , 27 ));
buttonCheck.setText( " CHECK " );
/* label initializes */
labelMessage = new Label(sShell, SWT.NONE);
labelMessage.setBounds( new Rectangle( 3 , 267 , 102 , 17 ));
labelMessage.setText( " Information: " );
/* textArea initializes */
textArea = new Text(sShell, SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
textArea.setBounds( new Rectangle( 0 , 16 , 348 , 239 ));
/* text initializes */
text = new Text(sShell, SWT.BORDER);
text.setBounds( new Rectangle( 2 , 286 , 345 , 33 ));
text.setEditable( false );
/* Mouse click action */
buttonCheck.addSelectionListener( new SelectionListener() {
public void widgetSelected(SelectionEvent event) {
if (check())
text.setText( " Right input " );
else
text.setText( " Wrong input " );
}
public void widgetDefaultSelected(SelectionEvent event)
{
text.setText( " Need to Click " );
}
});
}
/**
* check all the rules
* @return if match the rule return true ,else return false
* @author tianrenliang
* @since v0.1(2007-10-23)
*/
private static boolean check(){
String stringCheck = textArea.getText();
String contentPart = getContent(stringCheck);
String command = getCommand(stringCheck);
if ( ! stringCheck.equals( "" ))
{
/* if remark part exist,check the rules
* all the check rules right the check
* function return 1;else return 0 */
if (checkPdu(stringCheck) && checkCommand(command)
&& checkChangeLineFirst(stringCheck)
&& checkEnd(stringCheck) && checkSecondLine(contentPart))
{
return true ;
}
else
{
return false ;
}
}
else
{
return true ;
}
}
/**
* check pdu
* @param checkString
* @return true ,false
* @author tianrenliang
* @since v0.1(2007-10-23)
*/
private static boolean checkPdu(String checkString) {
if (checkString.length() >= start.length())
{
String sub = checkString.substring( 0 ,start.length());
if (sub.equals(start))
{
return true ;
}
}
else
{
return false ;
}
return true ;
}
/**
* get command
* @param checkString
* @return true ,false
* @author tianrenliang
* @since v0.1(2007-10-23)
*/
private static String getCommand(String checkString){
String command = "" ;
if (checkString.length() > start.length())
{
for ( int i = start.length(); i < checkString.length(); i ++ )
{
if (checkString.charAt(i) == signalBegin)
{
command = checkString.substring(start.length(), i);
return command;
}
}
return checkString.substring(start.length());
}
return null ;
}
/**
* check the character whether number
* @author tianrenliang
* @since v0.1(2007-10-23)
*/
private static boolean isDigit( char character){
if (character < ' 0 ' || character > ' 9 ' )
{
return false ;
}
else
{
return true ;
}
}
/**
* check the character whether letter
* @author tianrenliang
* @since v0.1(2007-10-23)
*/
private static boolean isLetter( char character){
if ((character < ' a ' || character > ' z ' )
&& (character < ' A ' || character > ' Z ' ))
{
return false ;
}
else
{
return true ;
}
}
private static boolean isSign( char character){
for ( int i = 0 ;i < signLib.length();i ++ )
{
if (signLib.charAt(i) == character)
{
return true ;
}
}
return false ;
}
/**
* check is Hex
* @author tianrenliang
* @since v0.1(2007-10-23)
*/
private static boolean isHex( char character){
if ((character < ' a ' || character > ' f ' )
&& (character < ' A ' || character > ' F ' ))
{
return false ;
}
else
{
return true ;
}
}
/**
* check Command,cannot begin with '-'and number
* @param checkString
* @return true,false
* @author tianrenliang
* @since v0.1(2007-10-22)
*/
private static boolean checkCommand(String checkString){
if (checkString != null )
{
if ((checkString.charAt( 0 ) != ' _ ' )
&& ( ! isDigit(checkString.charAt( 0 ))))
{
for ( int i = 0 ; i < checkString.length(); i ++ )
{
if ( ! isDigit(checkString.charAt(i))
&& ( ! isLetter(checkString.charAt(i))))
{
return false ;
}
}
}
else
{
return false ;
}
}
return true ;
}
/**
* Check the first line change
* @param checkString
* @return true,false
* @author tianrenliang
* @since v0.1(2007-10-23)
*/
private static boolean checkChangeLineFirst(String checkString){
for ( int i = 0 ;i < checkString.length();i ++ )
{
if (checkString.charAt(i) == signalBegin)
{
if (i + 1 < checkString.length())
{
if (checkString.charAt(i + 1 ) != lineEndTag)
{
return false ;
}
else
{
return true ;
}
}
}
}
return true ;
}
/**
* check the Content start position
* @param checkString
* @return the start position of the content part
* @author tianrenliang
* @since v0.1(2007-10-23)
*
*/
private static int contentStartPosition(String checkString){
for ( int i = 0 ;i < checkString.length();i ++ )
{
if (checkString.charAt(i) == lineChangeTag)
{
return i;
}
}
return 0 ;
}
/**
* check the Content end position
* @param checkString
* @return the end position of the content part
* @author tianrenliang
* @since v0.1(2007-10-23)
*/
private static int contentEndPosition(String checkString){
for ( int i = 0 ;i < checkString.length();i ++ )
{
if (checkString.charAt(i) == signalEnd)
{
// retrun content end . In windows OS, is the line change tag
return i - 2 ;
}
}
return checkString.length();
}
/**
* get substring about the Content part
* @param checkString
* @return string of content part
* @author tianrenliang
* @since v0.1(2007-10-23)
*
*/
private static String getContent(String checkString)
{
int ContentStarPosition = contentStartPosition(checkString);
int MarkPosition = checkString.indexOf(remarkTag);
if (ContentStarPosition != 0 )
{
if (MarkPosition > 0 )
{
String ContentPart =
checkString.substring(ContentStarPosition + 1 , MarkPosition);
return ContentPart.trim(); // return string with out space
}
else
{
int ContentEndPosition = contentEndPosition(checkString);
/* defense starposition out of arrayif no input */
String ContentPart = checkString
.substring(ContentStarPosition + 1 , ContentEndPosition);
return ContentPart.trim(); // return string with out space
}
}
else return null ;
}
/**
* check Content
* @param checkString
* @return if right return 1,else return function remark
* @author tianrenliang
* @since v0.1(2007-10-23)
*/
private static int checkContent(String checkString){
if (checkString != null )
{
for ( int i = 0 ;i < checkString.length();i ++ )
{
if (checkString.charAt(i) != stringTag)
{
if (checkString.charAt(i) != remarkTag)
{
if (( ! isDigit(checkString.charAt(i))
&& ( ! isHex(checkString.charAt(i)))))
return 0 ;
}
else return checkRemark(checkString);
}
else return 1 ;
}
}
return 1 ;
}
/**
* check String
* @param checkString
* @return if rigtht return 1, else return function
* @author tianrenliang
* @since v0.1(2007-10-23)
*
*/
private static int checkString(String checkString)
{
int i = 0 ;
if (checkString != null )
{
if (checkString.charAt(i) != remarkTag)
{
for ( i = 0 ;i < checkString.length();i ++ )
{
if ( ! isDigit(checkString.charAt(i))
&& ( ! isLetter(checkString.charAt(i)))
&& ( ! isSign(checkString.charAt(i))))
return 0 ;
}
}
else return checkRemark(checkString);
}
return 1 ;
}
/**
* check the remark part
* @param checkString
* @return return the length of the remark part
* @author tianrenliang
* @since v0.1(2007-10-23)
*
*/
private static int checkRemark(String checkString){
int i = 0 ;
if (checkString.charAt(i) == remarkTag)
{
/* in remark part, just return the end of the remark part */
for (i = 0 ;checkString.charAt(i) != lineEndTag;i ++ )
{
}
return i;
}
return 1 ;
}
/**
* check the data part.both check the hex and the string
* @param checkString
* @return true,false
* @author tianrenliang
* @since v0.1(2007-10-23)
*/
private static boolean checkSecondLine(String checkString)
{
if (checkString != null )
{
String StringPart = checkString;
String subString = checkString;
int a = 1 ,b = 1 ,c = 1 ,d = 1 ;
int leftLength = checkString.length();
while (leftLength > 0 )
{
int StringStartPosition = 0 ;
int StringEndPosition = StringStartPosition;
StringStartPosition = subString.indexOf(stringTag);
String DataPart = "" ;
if (StringStartPosition >= 0 )
{
DataPart = subString.substring( 0 , StringStartPosition);
a = checkContent(DataPart);
StringPart = subString.substring(StringStartPosition + 1 );
StringEndPosition = StringPart.indexOf(stringTag);
// defence,because if not find '"',indexOf return -1.
if (StringEndPosition !=- 1 )
{
String SubStringPart =
StringPart.substring( 0 , StringEndPosition);
b = checkString(SubStringPart);
if (StringEndPosition == (leftLength - 1 ))
{
subString = "" ;
break ;
}
subString = StringPart.substring(StringEndPosition + 1 );
}
else
{
textArea.setText( " String Input Uncomplete .Please input again! " );
return true ;
}
}
else
{
d = checkContent(subString);
subString = "" ;
}
/* judge every time ,if evevy a,b,c,d is 0,error!
* if this scentence not write,a,b,c,d may be changed
int the next round */
if (a > 0 && b > 0 && c > 0 && d > 0 )
{
leftLength = subString.length();
}
else return false ;
}
if (a > 0 && b > 0 && c > 0 && d > 0 )
{
return true ;
}
else return false ;
}
return true ;
}
/**
* check the end whether end with '}'
* TODO <br>
* @param checkString
* @return true , false
* @author tianrenliang
* @since v0.1(2007-10-23)
*/
private static boolean checkEnd(String checkString){
for ( int i = 0 ;i < checkString.length();i ++ )
{
if (checkString.charAt(i) == signalEnd)
{
if (i + 1 < checkString.length())
{
return false ;
}
else if (checkString.charAt(i - 1 ) != lineChangeTag)
return false ;
}
}
return true ;
}
}