1 创建工程
2 创建Application,名称为:TextEditorApp,同时指定主窗体的类名为:TestEditorFrame,选中所有的Options,以生成菜单、工具栏、状态栏和提示窗体。此时,生成三个类。
3 取消主窗体的关闭按钮
选中TestEditorFrame,打开设计视图,在结构窗体中选择this,将属性defaultCloseOperation设为DO_NOTHING_ON_CLOSE或者DISPOSE_ON_CLOSE,此时会修改jbInit函数,此函数为设计界面需要的函数,任何类打开设计界面都会生成jbInit函数,反过来,在设计界面中的修改也会反映在jbInit函数中。
4 设置皮肤
4、1 设置JBuilder工具的皮肤:Tools——Perferences——Browser——Look and Feel
4、2 设置程序的皮肤,在TextEditorApp类的main主函数中,需要修改的代码默认为将皮肤设置为当前操作系统的风格:
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
可以修改之:
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
javax.swing.plaf.metal.MetalLookAndFeel
com.sun.java.swing.plaf.motif.MotifLookAndFeel
com.sun.java.swing.plaf.Windows. WindowsLookAndFeel
5 添加滚动面板
选中TestEditorFrame,打开设计视图,在结构窗格中选择内部的内容面板(contentPane),内容面板的默认布局管理器为边框布局管理器,所以只需将“Swing Containers”——“JScrollPane”放入内容面板,注意它的constraints为Center。
注意:
1)添加组件还可以通过“Edit”——“Add Component”来进行
2)如果添加后层次结构混乱,可以在结构窗格中移动层次关系
6 添加多行文本框
设置background,lineWrap(自动换行),wrapStyleWord(将当前行放不下的单词放在下一行)
7 创建菜单
7、1 方法
如果是新建菜单,可以在窗体上加上JMenuBar控件即可
如果菜单已经存在,可以直接在设计视图中的菜单视图中进行修改
7、2 创建菜单项
增加File下的New,Open,Save和Save As
增加Edit,里面有Font,Foreground Color,Background Color
8 增加菜单事件处理能力
8、1 Font
1)因为FontChooser组件需要设置属性后才能使用,所以在设计视图中,添加位于More dbSwing下的FontChooser组件,设置frame属性为this,title为Font
相应的代码为:
fontChooser1.setFrame(this);
fontChooser1.setTitle("Font");
2)在菜单视图中,选择Font菜单项,双击Events窗格中的actionPerformed,系统自动生成适配器代码,相应的事件方法代码为:
fontChooser1.setSelectedFont(jTextArea1.getFont());
if(fontChooser1.showDialog())
{
jTextArea1.setFont(fontChooser1.getSelectedFont());
}
8、2 Foreground Color
无需在窗体添加组件,直接在相应菜单项的事件方法中添加代码为:
Color color=javax.swing.JColorChooser.showDialog(this,"Foreground Color",jTextArea1.getForeground());
if(color != null)
{
jTextArea1.setForeground(color);
}
8、3 Background Color
无需在窗体添加组件,直接在相应菜单项的事件方法中添加代码为:
Color color = javax.swing.JColorChooser.showDialog(this, "Background Color", jTextArea1.getBackground());
if (color != null)
{
jTextArea1.setBackground(color);
}
8、4 Open
1)选中Swing Containers下的JFileChooser组件,点击结构窗格的UI目录,将其放置在结构窗格的UI目录下,此时不显示组件
2)在相应菜单项的事件方法中添加代码为:
if (this.jFileChooser1.APPROVE_OPTION == jFileChooser1.showDialog(this, "Open File"))
{
openFile(jFileChooser1.getSelectedFile().getPath());
this.repaint();
}
此时需要导入包:
import java.io.*;
同时,其中的openFile定义为:
private void openFile(String fileName)
{
try
{
File file = new File(fileName);
int size = (int) file.length();
int chars_read = 0;
FileReader in = new FileReader(file);
char[] data = new char[size];
while (in.ready())
{
chars_read += in.read(data, chars_read, size - chars_read);
}
in.close();
jTextArea1.setText(new String(data, 0, chars_read));
statusBar.setText("Opened " + fileName);
}
catch (IOException e)
{
statusBar.setText("Error opening " + fileName);
}
}
8、5 Save和Save As
1)在Frame窗体类代码中添加属性,分别用于保存文件名称和是否被修改:
String currFileName = null;
boolean dirty = false;
2)修改openFile方法,追加代码为:
this.currFileName = fileName;
this.dirty = false;
3)创建saveFile方法和saveAsFile方法
saveFile方法为:
boolean saveFile()
{
if (currFileName == null)
{
return saveAsFile();
}
try
{
FileOutputStream fos=new FileOutputStream(currFileName);
PrintWriter out=new PrintWriter(fos);
String text = jTextArea1.getText();
int beginIndex=0;
int endIndex=0;
while(true)
{
endIndex=text.indexOf(10,beginIndex);
if(endIndex!=-1)
{
out.println(text.substring(beginIndex,endIndex));
}
else
{
out.println(text.substring(beginIndex));
break;
}
beginIndex=endIndex+1;
}
out.close();
this.dirty = false;
statusBar.setText("Saved to " + currFileName);
return true;
}
catch (IOException e)
{
statusBar.setText("Error saving " + currFileName);
}
return false;
}
如果存在无法识别回车字符,使用下面的代码:
boolean saveFile()
{
if (currFileName == null)
{
return saveAsFile();
}
try
{
FileOutputStream fos=new FileOutputStream(currFileName);
PrintWriter out=new PrintWriter(fos);
String text = jTextArea1.getText();
int beginIndex=0;
int endIndex=0;
while(true)
{
endIndex=text.indexOf(10,beginIndex);
if(endIndex!=-1)
{
out.println(text.substring(beginIndex,endIndex));
}
else
{
out.println(text.substring(beginIndex));
break;
}
beginIndex=endIndex+1;
}
out.close();
this.dirty = false;
statusBar.setText("Saved to " + currFileName);
return true;
}
catch (IOException e)
{
statusBar.setText("Error saving " + currFileName);
}
return false;
}
saveAsFile方法为:
boolean saveAsFile()
{
if (JFileChooser.APPROVE_OPTION == jFileChooser1.showSaveDialog(this))
{
currFileName = jFileChooser1.getSelectedFile().getPath();
this.repaint();
return saveFile();
}
else
{
this.repaint();
return false;
}
}
4)在相应的菜单项事件方法中调用上述函数即可,如:
saveFile();
和
saveAsFile();
8、6 New
1)添加okToAbandon方法,用于检查是否需要保存
boolean okToAbandon()
{
if (!dirty)
{
return true;
}
int value = JOptionPane.showConfirmDialog(this, "Save changes?", "Text Edit", JOptionPane.YES_NO_CANCEL_OPTION);
switch (value)
{
case JOptionPane.YES_OPTION: return saveFile();
case JOptionPane.NO_OPTION: return true;
case JOptionPane.CANCEL_OPTION:
default: return false;
}
}
说明:dirty属性本身的修改需要通过文本区的事件编程才能实现,暂且不考虑
2)给New事件方法添加代码为:
if(okToAbandon())
{
this.jTextArea1.setText("");
this.currFileName=null;
dirty=false;
}
同时,修改Open事件方法,在首部添加:
if(!okToAbandon())
{
return;
}
同时,也修改Exit事件方法,为:
if (okToAbandon())
{
System.exit(0);
}
9 工具栏编程
1)可以直接在事件方法中调用相应的菜单项事件方法,如:
第一个打开按钮为:
public void jButton1_actionPerformed(ActionEvent e)
{
jMenuItem7_actionPerformed(e);
}
第二个关闭按钮为:
public void jButton2_actionPerformed(ActionEvent e)
{
jMenuItem1_actionPerformed(e);
this.jTextArea1.setText("");
}
第三个帮助按钮为:
public void jButton3_actionPerformed(ActionEvent e)
{
jMenuHelpAbout_actionPerformed(e);
}
2)也可以使用代码重构方法
选中相应菜单项的方法内容,不含函数原型定义和首尾括号,按Ctrl+Shift+E,出现代码重构界面,指定名称后,系统自动将选中代码生成指定名称函数,并在原来位置调用之
10 文本区编程
1)修改后保存提示
swing组件采用MVC结构,所以文本区的数据存储在Document对象中
选中设计视图下的文本区,在属性窗格中右击document属性,选择“Expose as Class Lever Variable”,此时生成代码为:
Document document1 = jTextArea1.getDocument();
在结构窗格中选择document1,添加事件方法为:
public void document1_changedUpdate(DocumentEvent e)
{
dirty=true;
}
public void document1_insertUpdate(DocumentEvent e)
{
dirty=true;
}
public void document1_removeUpdate(DocumentEvent e)
{
dirty=true;
}
2)上下文菜单
DBTextDataBinder用于为文本区提供上下文菜单
在设计视图中,选择“dbSwing Models”下的“DBTextDataBinder”,将其放入窗体,默认放在结构窗格中的Data Access下
将此组件的jTextComponent属性设置为jTextArea1,关联指定的文本区
如果想关闭部分菜单,可以在属性窗格中将相应的属性值设置为false
11 标题栏显示文件状态
1)定义一个更改标题栏的函数
void updateCaption()
{
String caption;
if (currFileName == null)
{
caption = "Untitled";
}
else
{
caption = currFileName;
}
if (dirty)
{
caption = "* " + caption;
}
caption = "Text Editor - " + caption;
this.setTitle(caption);
}
2)在构造函数、openFile函数、saveFile函数和New事件方法、监视文档内容变化的方法中调用此函数,为:updateCaption();
[此贴子已经被作者于2010-12-12 08:19:21编辑过]