用NetBeans构建 SDI 应用程序

来源:互联网 发布:营销网络图片 编辑:程序博客网 时间:2024/06/06 17:45

本教程将展示如何使 NetBeans 创建单文档界面(Single Document InterfaceSDI)应用程序。本文假定您知道什么是 SDI 用户界面,并想使 NetBeans 来创建一个 SDI 用户界面。

在这里可以更多的了解 SDI 界面:关于 SDI 的附加说明

本教程用一个主窗口和两个子窗口构建了一个 NetBeans 项目,这些窗口用来显示交通摄像图片每分钟的更新

前提条件

l      本教程假定您有一定的编程经验,不要求一定是JavaNetBeans的经验。

l      如果对NetBeans创建GUIGraphical User Interface,图形用户界面)应用程序还不熟悉,可以参考Talley Mulligan的教程:GUI Building in NetBeans IDE 5.5 .

本教程需要的软件

本教程需要的软件包括NetBeans IDE 5.5JDK 6。下载:NetBeans 5.5 with JDK 6 .

创建程序主窗口

这一部分将说明如何创建NetBeans项目及程序主窗口。

创建项目

要创建SDI应用程序的主窗口,首先要创建一个NetBeans项目。可按以下步骤创建SDI应用程序项目:

1.        关闭所有项目

2.        File主菜单中选择File,然后从弹出菜单中选择New Project打开New Project对话框。

3.        Categories面板中选择General,在Projects面板中选择Java Application,然后单击Next按钮——打开New Java Application对话框。(图1

图1

4.        输入SDIApplication作为Project Name

5.        如果不想让应用程序保存在Project Location默认的地址,可以直接键入地址或者单击browse按钮来设置项目位置。

6.        确定选择的是Set as Main Project复选框,不是Create Main Class复选框。

7.        单击Finish按钮。


IDEIntegrated Development Environment,集成开发环境)创建项目子目录并将项目文件置于其中。图2中,在Projects窗口和Navigation窗口可以看到IDE创建的文件和组件。(图2中还可以看到下一步将要创建的JFrame。)

2

创建应用程序窗口

下一步是用JFrame创建应用程序GUI容器。程序主窗口的GUI组件将位于这个JFrame容器中。按如下步骤可创建程序主窗口:

1.        Projects面板中,右键单击Source Packages(图3

2.        在弹出菜单中选择New,然后选择Frame Form——出现New JFrame Form对话框。(图4

3.        输入SDIAppMainWindow作为Class Name,输入sdiappgui作为Package

4.        单击Finish按钮。


3


4

NetBeans
创建SDIAppGui包,并为SDIAppMainWindow 类创建Java文件,然后在Design Editor窗口可以看到空白的JFrame(图2)。Projects窗口的Projects选项卡可以看到为项目创建的文件,Navigator窗口的 Inspector 选项卡可以看到为应用程序创建的组件。

如果现在运行这个应用程序,还看不到太多东西,但不管怎么样还是试着运行一下吧。编译和运行此应用程序需要单击Run菜单,然后单击Run Main Project。(或者单击工具栏上的按钮来运行主项目。)

这时会出现一个对话框,提示没有可以编译和运行的应用程序主类。因为之前已经命令NetBeans不要创建主类。建议将SDIAppGui.SDIAppMainWindow作为要创建和编译的类。单击OK按钮,NetBeans马上开始编译应用程序,过一会儿,一个空白窗口就会显示出来。到目前为止,应用程序就是这样的。现在关闭窗口。

您可以随意决定要在应用程序窗口中放置的内容,但在本文的例子中,我们将在窗口中添加一些内容来打开其他的窗口。

此时的JFrame中什么也没有,将在JFrame中添加Jpanel作为一个容器,还将添加一个菜单来调用即将创建的二级窗口或子窗口。

在开始向JFrame添加组件之前,您或许希望在屏幕中央打开应用程序主窗口,并为应用程序设置一个可在主窗口标题栏中显示的标题。按以下步骤可将应用程序主窗口置于中央:

1.        右键单击JFrame,选择Properties

2.        单击Code选项卡(图5

3.        选择Generate Resize Code作为Form Size Policy

4.        确保勾选Generate Center

5.        单击Close按钮。


5

应用程序现在应该在屏幕中央打开了。运行并测试一下。

要想给应用程序加一个标题,再次右键单击JFrame,重新打开属性对话框。单击properties选项卡,键入Traffic Cameras作为title property。关闭对话框并重新运行应用程序后,在窗口的标题栏上可以看到标题。

向应用程序窗口添加组件

在向应用程序添加组件之前,可能需要考虑命名习惯。在JFrame中放置Swing组件,NetBeans将为那些组件创建默认名称,例如jPanel1JLabel1等等。最好赋予组件易于理解的名称,便于以后进行辨认。

 

JFrame重新命名为:frameMain。这需要重新打开窗体的properties对话框。单击Properties选项卡,向下滚动到name property。键入frameMain作为name property。然后关闭对话框。

现在向JFrame添加Swing组件。NetBeans IDE将一直显示Design Editor窗口,如图2所示。Palette窗口位于IDE的右上部分。拖动上面的组件就可以添加给JFrame,也可以先单击palette上的组件,然后在JFrame上单击。

向应用程序主窗口添加菜单:

1.        Swing palette中单击JmenuBar

2.        将光标移动到JFrame并单击,或者将菜单组件拖动到JFrame

3.        Navigation窗口的Inspector选项卡中,右键单击jMenuBar1 [JMenuBar](图6),将菜单名更改为:menuMain

4.        Navigation窗口中展开jMenuBar1 [JMenuBar],就会看到NetBeans创建的菜单项:jMenu1 [JMenu]

5.        右键单击jMenu1 [JMenu],选择Edit Text,将文本改为Quit

6.        右键单击jMenu1 [JMenu],选择Change Variable Name...,将组件名更改为menuMainQuit

7.        右键单击menuMain [JMenuBar],从弹出菜单中选择Add jMenu——新菜单项,即可添加jMenu1 [JMenu]

8.        右键单击jMenu1 [JMenu],选择Edit Text,将文本更改为Cam 1

9.        右键单击jMenu1 [JMenu],选择Change Variable Name...,将组件名更改为menuMainCam1

10.    右键单击menuMain [JMenuBar],从弹出菜单中选择Add jMenu——新菜单项,即可添加jMenu1 [JMenu]

11.    右键单击jMenu1 [JMenu],选择Edit Text,然后将文本更改为Cam 2

12.    右键单击jMenu1 [JMenu],选择Change Variable Name...,将组件名更改为menuMainCam2

添加JPanel

1.        Swing palette中向下滚动,直至看到JPanel组件。

2.        palette中单击Jpanel组件,然后单击JFrame

3.        Jpanel置于JFrame左上角,距上方和左方大约1/8英寸。

4.        将光标移动到Jpanel的右下角,将Jpanel向右下方拖动,从而使JFrame上下左右的间距相等。

Jpanel添加边框:

1.        JPanel中右键单击,从弹出菜单中选择Properties

2.        在属性对话框中单击Properties选项卡,然后单击(No Border)——弹出边框对话框。

3.        选择EtchedBorder,然后单击OK按钮。

4.        关闭属性对话框——在Navigator窗口中的Inspector 选项卡(图6)可以看到刚被添加的Jpanel

5.        Navigator 窗口(图7)中右键单击jPanel1 [JPanel],选择Change Variable Name...——弹出一个对话框。

6.        将面板名更改为panelMain

7.        单击OK按钮。

运行此应用程序。可以看到其顶部有一个菜单,应用程序窗口中有一个窗体。

6


7

现在有了一个NetBeans项目、一个应用程序窗口和一个应用程序菜单,稍后要为菜单事件添加代码。接下来要做的是创建子窗口。

创建子窗口

有了应用程序主窗口就可以创建子窗口。在本文中将要创建两个子窗口,而实际应用中可能需要许多个子窗口,但对本文来说,两个子窗口就足以演示SDI用户界面了。

子窗口是JDialog组件。为创建子窗口,需要将对主应用程序添加两个JDialog组件。打开NetBeans Design Editor窗口。

创建子窗口

1.        单击Swing palette中的JDialog组件。

2.        Design Editor窗口中单击JpanelJFrame——JDialog将添加到应用程序中,并出现在Navigator窗口Inspector选项卡中。(图6

3.        Navigator窗口中,右键单击JDialog1 [JDialog],选择Change Variable Name...

4.        在弹出来的对话框中输入名称cam1Win

5.        单击OK按钮——Navigato窗口中将显示新的JPanel名称。

6.        打开cam1Win的属性对话框,将标题属性更改为:Camera 1

重复步骤1-6创建第二个子窗口,步骤4中将窗口命名为cam2Win,步骤6中将标题改为Camera 2

向子窗口添加JLabels

1.        Navigator窗口的Inspector选项卡中,双击firstChildWin [JDialog]——Design Editor窗口中出现对话框。

2.        Swing palette中单击Label,然后单击Design Editor窗口中的JDialog面板。

3.        JLabel置于JDialog panel中,两者间四边保持大约1/8英寸的距离。

4.        Navigator窗口中右键单击JLabel1 [JLabel],选择Edit Text

5.        删除文本。

6.        再次右键单击JLabel1 [JLabel],选择Change Variable Name...,将名称改为lblImage1

对第二个子窗口的重复步骤2-6,但在步骤6中,JLabel的名称改用lblImage2

这两个JLabel组件就是交通摄像图片的容器。

供应用程序主窗口使用的子窗口已经准备好,现在可以添加打开子窗口并显示交通图片的Java代码了。

添加代码

本部分将说明如何向主菜单添加关闭应用程序的代码和打开子窗口的代码,以及如何向子窗口添加演示公路交通图片的代码。

可以从这个页面上复制代码粘贴到应用程序源代码合适的位置,不必一步一步键入代码。

添加导入语句

按下列步骤添加代码之前,需要添加必要的导入语句。以便NetBeans能找到要添加的代码所使用的类。

l      Source Editor窗口中代码的顶部,紧接SDIAppGu包下方添加以下导入语句:

import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.Timer;

向主菜单添加代码

主菜单上需要添加退出应用程序和打开子窗口的代码单击design按钮出现 design editor窗口。

1.        Navigator窗口的Inspector选项卡中右键单击menuMainQuit [JMenu]

2.        从弹出菜单中选择Events > Mouse >mouseClicked

3.        NetBeans创建以下代码:

 
private void menuMainQuitMouseClicked(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
    }

1.        将注释// TODO add your handling code here:替换为System.exit(0);语句

System.exit(0);语句可以关闭程序,销毁应用程序生成的所有对象,并释放应用程序对象占用的内存。

1.        回到design editor窗口,在Navigator窗口右键单击menuMainCam1 [JMenu],从弹出菜单中选择Events > Mouse > mouseClicked

2.        NetBeans创建以下代码:

private void menuMainCam1MouseClicked(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
    }

1.        用以下代码替换注释:

 
      cam1Win.setBounds(0,0,400,400);
      cam1Win.setVisible(true);

第一行语句将子窗口置于屏幕左上方,长宽各为400像素。第二行语句显示窗口。

1.        右键单击menuMainCam2 [JMenu]从弹出菜单中选择Events > Mouse >mouseClicked

2.        NetBeans创建以下代码:

 
private void menuMainCam2MouseClicked(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
    }

1.        用以下代码替换注释:

      cam2Win.setBounds(400,0,400,400);
      cam2Win.setVisible(true);

请注意,setBounds语句将第二个窗口置于距离左边400像素处,所以它不会和第一个窗口重叠。

现在应用程序主菜单的选项中已经有了退出应用程序和打开子窗口的代码。运行程序并单击菜单,可以看到它们生成的选项。请注意,当子窗口打开时,一旦关闭应用程序主窗口,子窗口也将关闭。

向子窗口添加代码来创建Highway Cams

现在为子窗口创建公路摄像头对象。程序运行时,这部分代码将连接到Minnesota Department of Transportation网站上并获取摄像图片。在运行程序之前请确认电脑已连接到Internet

1.        Navigator窗口的Inspector选项卡中右键单击firstChildWin [JDialog],从弹出菜单中选择Events > Window > windowActivated

2.        NetBeans创建以下代码:

    private void firstChildWinWindowActivated(java.awt.event.WindowEvent evt) {
// TODO add your handling code here:
       }
 

1.        用以下代码替换注释:

      Action updateImage1 = new AbstractAction() {
        public void actionPerformed(ActionEvent e) {
          URL u = null;
          lblImage1.setIcon(null);
          try {
            u = new URL("http://video.dot.state.mn.us/video/image?id=624");
            Image img = Toolkit.getDefaultToolkit().createImage(u);
            ImageIcon pic = new ImageIcon(img);
            lblImage1.setIcon(pic);
          }
          catch (MalformedURLException mue){
            mue.printStackTrace();
          }
        }
      };     
      new Timer(7000, updateImage1).start(); 

这段代码从MNDOT网站上获取一张公路摄像图片并为它生成一个图片对象,然后代码将图片指派给JLabel (lblImage1.setIcon(pic))图标属性。图片的获取被封装成一个动作,所以 Swing计时器可以重复调用代码来刷新图片。代码的最后一行语句:new Timer(7000, updateImage1).start();启动了一个Swing计时器使图片每分钟刷新4次。

1.        Navigator窗口的Inspector选项卡中右键单击secondChildWin [JDialog],从弹出菜单中选择Events > Window > windowActivated

2.        NetBeans创建以下代码:

    private void secondChildWinWindowActivated(java.awt.event.WindowEvent evt) {
// TODO add your handling code here:
    }

1.                  用以下代码替换注释:

      Action updateImage2 = new AbstractAction() {
        public void actionPerformed(ActionEvent e) {
          //System.out.println("object doesn't exist" );
          URL u = null;
          lblImage2.setIcon(null);
          try {
            u = new URL("http://video.dot.state.mn.us/video/image?id=848");
            Image img = Toolkit.getDefaultToolkit().createImage(u);
            ImageIcon pic = new ImageIcon(img);
            lblImage2.setIcon(pic);
          }
          catch (MalformedURLException mue){
            mue.printStackTrace();
          }
        }
      };     
      new Timer(7000, updateImage2).start();    

这段代码与第一个子窗口的相比只有几处细微区别:动作事件的名称、图片URL的摄像头编号和容纳图像的JLabel名称。MNDOT交通摄像头有时会失灵,所以当运行此应用程序时,如果子窗口在几分钟之内无法显示图像,请上MNDOT网站选择一个可用的摄像头,然后用这个摄像头的编号替换上面代码中的624或者848

就是这样了。现在我们有了一个能够执行一些操作的SDI应用程序(图8)。在运行这个程序之前还有一些要注意的是,启动程序时,它需要花一点时间才能在子窗口中显示图片。因为要用大约一分钟来启动计时器,通过URL获取并显示图片。此外,由于运行了一个或两个计时器,关闭应用程序时它不会立即响应。


8

概要

本文说明了如何使用NetBeans创建Java SDI应用程序。包括如何创建NetBeans项目,以及如何创建从应用程序主窗口调用的子窗口。

 

 

 

 


原创粉丝点击