简单的Swing程序示例,输入一段英文,识别其中的冠词(a an the),主要用于熟悉Eclipse及Swing的使用方法。
创建项目
在Eclipse中创建一个名为IdentifyArticle的项目
在项目下创建com.gc.IdentyfyArticle的包。
在包下创建程序主窗口frmIdentifyArticle。
然后在主窗口中布置控件。Eclipse和VS不同的地方在于,JFrame窗口不能直接放控件,窗口必须有个面板(ContentPane),然后在面板上放置控件,面板的默认布局用的是BoxLayout布局方式(将窗口划分为上、下、左、右、中五个区域)。如果使用过VS的Winform程序的话,在Winform中是不分这么细,直接可以在VS的工具箱中拖动控件到窗口中,而且布局控件不是必须的,需要特殊布局时才会使用布局控件,模式是可以将控件随意放置在窗口中(可以认为等同于Swing中的Absolute Layout)。
先将frmIdentifyArticle中的布局方式改为绝对布局,选中工具条中的Absolute Layout,然后点击窗口的任意空白位置,WindowBuilder会自动切换窗口布局方式。然后开始布置控件,本例子中使用的控件比较简单,用户主要操作是输入一段英文,然后点击识别按钮,程序将识别英文字符串中出现了哪些冠词。因此需要的控件有标签、文本框、按钮。
最简单的冠词识别方法是将英文字符串slipt后,比较每个单词是否为a、an和the中的一个。不过通过学习网上的文章(参考文献1-2),文章中还介绍了其它识别方法,因此在frmIdentifyArticle中增加一个下拉框,用户点击识别按钮前,可以选择不同的识别方法。
综上所述,本项目的窗口大致如下所示:
有几点值得说明:
- Eclipse中的文本框分单行和多行(JTextField和JTextArea控件),而VS里面的Textbox是不分的(用属性设置单行和多行);
- WindowBuilder中添加控件后控件默认为局部变量(暂不清楚Eclipse中是否有地方设置),可以手动将控件声明改为私有变量,也可以使用属性窗口中的“Convert local to field”在局部变量和私有变量间切换。而在VS中,控件声明默认就是私有变量;
- 点击JComboBox控件,在属性窗口中的model属性中编辑下拉框选项。
- JTextField的lineWrap要设为true,否则不会自动换行。
关键代码
因为有多种冠词识别方法,因此定义接口IIdentifyArticle用于抽象识别方法。接口定义为:
public interface IIdentifyArticle
{
String[] IdentifyArticle(String englishSentence);
}
创建了SplitEnglishSentence 类实现split方法识别冠词。
public class SplitEnglishSentence implements IIdentifyArticle
{
public String[] IdentifyArticle(String englishSentence)
{
if(englishSentence.isEmpty())
{
return new String[0];
}
ArrayList<String> result=new ArrayList<String>();
String[] splitedResult=englishSentence.split(" ");
for(String s :splitedResult)
{
if(s.equalsIgnoreCase("a"))
{
result.add("a");
}
else if(s.equalsIgnoreCase("an"))
{
result.add("an");
}
else if(s.equalsIgnoreCase("the"))
{
result.add("the");
}
}
return result.size()>0?result.toArray(new String[0]):new String[0];
}
}
创建了StringTokenizerEnglishSentence 类实现StringTokenizer 类识别冠词。
public class StringTokenizerEnglishSentence implements IIdentifyArticle
{
public String[] IdentifyArticle(String englishSentence)
{
if(englishSentence.isEmpty())
{
return new String[0];
}
List<String> result=new ArrayList<String>();
StringTokenizer st = new StringTokenizer(englishSentence," ,?.!:\"\"''\n#");
while (st.hasMoreElements())
{
String s=st.nextToken().toLowerCase();
if(s.equalsIgnoreCase("a"))
{
result.add("a");
}
else if(s.equalsIgnoreCase("an"))
{
result.add("an");
}
else if(s.equalsIgnoreCase("the"))
{
result.add("the");
}
}
return result.size()>0?result.toArray(new String[0]):new String[0];
}
}
全部代码放在了github上面,地址为:https://github.com/guochao2299/SimpleSwingTest ,程序最终运行界面如下(代码没有检查重复结果,懒得改了:-))
参考文献:
[1]Java将英文句子分解为单词,https://blog.csdn.net/qq_37514135/article/details/79512768
[2]java英文段落拆分成句,https://blog.csdn.net/houninghhh/article/details/80116922