课外天地 李树青学习天地Java程序语言课件 → 程序代码——利用JBuilder实现的记事本


  共有17031人关注过本帖树形打印复制链接

主题:程序代码——利用JBuilder实现的记事本

帅哥哟,离线,有人找我吗?
admin
  1楼 博客 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 管理员
等级:管理员 帖子:1945 积分:26736 威望:0 精华:34 注册:2003/12/30 16:34:32
程序代码——利用JBuilder实现的记事本  发帖心情 Post By:2007/6/7 5:54:28 [显示全部帖子]

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编辑过]

 回到顶部