-- 作者:admin
-- 发布时间:2007/6/7 5:54:28
-- 程序代码——利用JBuilder实现的记事本
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编辑过]
|