下面我们举一个Java的基于GUI的应用程序例子(用Java 开发的文本编辑器)。
首先通过项目向导和应用向导创建项目,然后应用可视化设计工具,修改UI设计,连接事件,编辑源码以及常用控件和任务诸如菜单项、工具条、文本区域和系统事件等常用控件和任务的处理。具体技术包括:
* 用JFileChooser 对话框让用户选择文本文件。
* 用JtextArea读、写和处理文本文件中的文字。
* 设置前景色和背景色。
* 用dbSwing FontChooser对话框设置字型。
* 在状态栏和窗口标题栏显示信息。
* 手工添加处理UI事件的代码 。
* 通过将代码放在一个可被菜单项和按钮两个事件处理器调用的新的“帮助”方法中,使得菜单项和按钮执行相同的代码。
* 给JtextArea控件增加一个右击菜单。
* 保持对文件的位置以及文件是否活动过的跟踪,展示对文件|新建,文件|打开,文件|保存,文件|另存为,编辑和退出等逻辑的处理。
* 将"Text Editor" 应用程序展开为JAR 文件。
Swing组件介绍
在讲解源程序之前,介绍一下Swing组件(这些组件将在后面的源程序中用到),Swing是一个带有丰富组件的GUI工具包,它组成了JFC(Java Foundation Class)的用户界面功能的核心部分,它不仅是AWT所提供的组件的替代品,并且在这些组件的基础上有了很大进步。Swing 都是100% 纯Java的,不依赖具体的Windows系统,可以在各种平台上实现。Swing 中最吸引人的是它对可插入观感PL&F(Pluggable look and feel)的支持,可以让用户定制自己的桌面,更换新的颜色方案,让窗口系统适应您的习惯和需要。Swing PL&F体系结构使得同时定制Swing控件或控件组更加容易。Swing也提供了一些预定义的外观(PL&F),包括默认、Motif 和 Windows 的外观。
Swing包含了250多个类,提供了40多个组件,是AWT组件的四倍,Swing还提供了大量有助于开发GUI界面所需的附加组件,它们都定义在javax.swing扩展包中。为了和原来的java.awt包区别开来,SUN专门为Swing设置了扩展包(javax.swing),并规定所有的Swing组件都是以字母“J”开头,如JLable、JButton、JTextField等,以示和AWT组件进行区别。下面是Swing组件的类层次结构。
JComponent |——AbstractButton——|——JToggleButton——|——JCheckBox |——JColorChooser |——JButton |——JRadioButton |——JFileChooser |——JMenuItem |——JLabel |——JMenu |——JMenuBar |——JRadioButtonMenuItem |——JPanel |——JCheckButtonMenuItem |——JToolBar |——JScrollPane |——JTextCompoment——|——JTextArea |——JOptionPane |——JTextField——JPasswordField |——JScrollPane |——JEditorPane——JTextPane ......... ......... |
组件的含义同AWT的同类的组件意义类似,这里就不在阐述了。
文本编辑器程序包含三个java 源程序即TextEditFrame.java、TextEditclass.java 和TextEditFrame_AboutBox.java 程序,下面将分别介绍如下:
TextEditFrame.java的源程序代码(节选部分)
package texteditor; //TextEditFrame.java import java.awt.*;//导入类 import java.awt.event.*; import javax.swing.*; import com.borland.dbswing.*; import java.io.*; import javax.swing.text.*; import javax.swing.event.*; public class TextEditFrame extends JFrame { IntlSwingSupport intlSwingSupport1 = new IntlSwingSupport(); //Swing 控件互联网化:即本地化应用程序,需要添加一行代码以便Swing 控件JfileChooser //和JcolorChooser出现在程序运行的语言中 JPanel contentPane; //设置内容窗(contentPane)的JPanel控件 JMenuBar menuBar1 = new JMenuBar();//创建菜单条并加入到框架窗体中 JMenu menuFile = new JMenu();//创建File菜单和相应的菜单项 JMenuItem menuFileExit = new JMenuItem(); JMenu menuHelp = new JMenu();//创建Help菜单和相应的菜单项 JMenuItem menuHelpAbout = new JMenuItem(); JToolBar toolBar = new JToolBar();//创建工具条组件 JButton jButton1 = new JButton();//创建按钮组件 JButton jButton2 = new JButton(); JButton jButton3 = new JButton(); ImageIcon image1;//定义图标 ImageIcon image2; ImageIcon image3; JLabel statusBar = new JLabel();//创建标签组件 BorderLayout borderLayout1 = new BorderLayout();//创建BorderLayout 布局器 JScrollPane jScrollPane1 = new JScrollPane();//创建滚动窗控件 JTextArea jTextArea1 = new JTextArea();//创建多行文本域组件 JMenuItem jMenuItem1 = new JMenuItem();//创建菜单项 JMenuItem jMenuItem2 = new JMenuItem(); JMenuItem jMenuItem3 = new JMenuItem(); JMenuItem jMenuItem4 = new JMenuItem(); FontChooser fontChooser1 = new FontChooser();//创建字型选择对话框 JMenu jMenu1 = new JMenu(); JMenuItem jMenuItem5 = new JMenuItem(); JMenuItem jMenuItem6 = new JMenuItem(); JMenuItem jMenuItem7 = new JMenuItem(); JFileChooser jFileChooser1 = new JFileChooser();//创建文本选择对话框 String currFileName = null; // Full path with filename. null means new/untitled. boolean dirty = false; Document document1; //文本 DBTextDataBinder dBTextDataBinder1 = new DBTextDataBinder(); // True means modified text. //构造架框 public TextEditFrame() { enableEvents(AWTEvent.WINDOW_EVENT_MASK); try { jbInit(); updateCaption(); } catch(Exception e) { e.printStackTrace(); } } //组件初始化 private void jbInit() throws Exception { //三个工具栏按钮图标 image1 = new ImageIcon(TextEditFrame.class.getResource("openFile.gif")); image2 = new ImageIcon(TextEditFrame.class.getResource("closeFile.gif")); image3 = new ImageIcon(TextEditFrame.class.getResource("help.gif")); contentPane = (JPanel) this.getContentPane();//内容创格 document1 = jTextArea1.getDocument();//多行文本域文档 contentPane.setLayout(borderLayout1);//borderLayout布局器 this.setSize(new Dimension(400, 300));//窗口大小 this.setTitle("Text Editor");//窗口标题 statusBar.setText(" "); menuFile.setText("File"); menuFileExit.setText("Exit"); menuFileExit.addActionListener(new TextEditFrame_menuFileExit_ActionAdapter (this));//添加事件监听器 menuHelp.setText("Help"); menuHelpAbout.setText("About"); menuHelpAbout.addActionListener(new TextEditFrame_menuHelpAbout_ActionAdapter (this)); jButton1.setIcon(image1);//设置三个工具栏按钮图标,添加事件监听器 jButton1.addActionListener(new TextEditFrame_jButton1_actionAdapter(this)); jButton1.setToolTipText("Open File"); jButton2.setIcon(image2); jButton2.addActionListener(new TextEditFrame_jButton2_actionAdapter(this)); jButton2.setToolTipText("Close File"); jButton3.setIcon(image3); jButton3.addActionListener(new TextEditFrame_jButton3_actionAdapter(this)); jButton3.setToolTipText("About"); jTextArea1.setLineWrap(true); jTextArea1.setWrapStyleWord(true); jTextArea1.setBackground(Color.white); jMenuItem1.setText("New");//设置菜单,添加事件监听器 jMenuItem1.addActionListener(new TextEditFrame_jMenuItem1_actionAdapter(this)); jMenuItem2.setText("Open"); jMenuItem2.addActionListener(new TextEditFrame_jMenuItem2_actionAdapter(this)); jMenuItem3.setText("Save"); jMenuItem3.addActionListener(new TextEditFrame_jMenuItem3_actionAdapter(this)); jMenuItem4.setText("Save As"); jMenuItem4.addActionListener(new TextEditFrame_jMenuItem4_actionAdapter(this)); fontChooser1.setFrame(this); fontChooser1.setTitle("Font"); jMenu1.setText("Edit"); jMenuItem5.setText("Font"); jMenuItem5.addActionListener(new TextEditFrame_jMenuItem5_actionAdapter(this)); jMenuItem6.setText("Foreground Color"); jMenuItem6.addActionListener(new TextEditFrame_jMenuItem6_actionAdapter(this)); jMenuItem7.setText("Background Color"); jMenuItem7.addActionListener(new TextEditFrame_jMenuItem7_actionAdapter(this)); document1.addDocumentListener(new TextEditFrame_document1_documentAdapter(this)); dBTextDataBinder1.setJTextComponent(jTextArea1); //Turn off right-click file Open... menu item. dBTextDataBinder1.setEnableFileLoading(false); //Turn off right-click file Save... menu item. dBTextDataBinder1.setEnableFileSaving(false); toolBar.add(jButton1);//工具组件添加按钮 toolBar.add(jButton2); toolBar.add(jButton3); menuFile.add(jMenuItem1);//菜单组件添加菜单项 menuFile.add(jMenuItem2); menuFile.add(jMenuItem3); menuFile.add(jMenuItem4); menuFile.addSeparator();//采单组件添加分隔线 menuFile.add(menuFileExit); menuHelp.add(menuHelpAbout); menuBar1.add(menuFile); menuBar1.add(jMenu1); menuBar1.add(menuHelp); this.setJMenuBar(menuBar1); contentPane.add(toolBar, BorderLayout.NORTH); //内容窗设置borderLayout布局器 contentPane.add(statusBar, BorderLayout.SOUTH); contentPane.add(jScrollPane1, BorderLayout.CENTER); jScrollPane1.getViewport().add(jTextArea1, null); jMenu1.add(jMenuItem5); jMenu1.add(jMenuItem6); jMenu1.add(jMenuItem7); } // Display the About box. void helpAbout() { TextEditFrame_AboutBox dlg = new TextEditFrame_AboutBox(this); Dimension dlgSize = dlg.getPreferredSize(); Dimension frmSize = getSize(); Point loc = getLocation(); dlg.setLocation((frmSize.width - dlgSize.width) / 2 + loc.x, (frmSize.height - dlgSize.height) / 2 + loc.y); dlg.setModal(true); dlg.show(); } ......... ......... |
编程技巧说明:
TextEditFrame.java 是实现文本编辑器的主要程序,有以下特点:
(1) 制作一个完全充满用户界面顶部菜单栏和底部状态栏之间区域的文本区。主用户界面容器的布局管理器需要采用边界布局(Borderlayout)。在主容器中,含有一个叫做内容窗(contentPane)的JPanel 控件,被改变成边界布局,需要做的只是在内容窗添加一个文本区控件。为此,先在内容窗添加一个滚动窗,再在滚动窗内放上文本区控件(jTextArea)。滚动窗提供一个带滚动棒(JScollPane)的文本区。