JAVA SWING重难点

更新时间:2023-12-05 02:31:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

? 教学重点与难点: ? 框架的组成及外观 ? 在框架中显示文本和图形 ? 字体和颜色的设置 ? Java的事件处理机制

? 窗口事件、焦点事件、键盘事件、鼠标事件的处理 ? Swing各种组件的用法 ? 9.1图形用户界面设计概述 ? 9.1.1 GUI支持包和简单GUI程序例 ? 1.java.awt包

? Java语言在java.awt包中提供了大量地进行GUI设计所使用的类和接口,包括绘制图形、设置

字体和颜色、控制组件、处理事件等内容,AWT是Java语言进行GUI程序设计的基础。 ? 2. javax.swing包

? Swing包是Java基础类库(Java Foundation Classes,JFC)的一部分。Swing提供了从按钮到

可分拆面板和表格的所有组件。

? Swing组件是Java语言提供的第二代GUI设计工具包,它以AWT为基础,在AWT内容的基础上新

增或改进了一些GUI组件,使得GUI程序功能更强大,设计更容易、更方便。\是开发新组件的项目代码名,现在,这个名字常用来引用新组件和相关的API。

? AWT组件和对应的Swing组件,从名称上很容易记忆和区别。例如,AWT的框架类、面板类、按钮

类和菜单类,被命名为Frame、Panel、Button和Menu,而Swing对应的组件类被命名为JFrame、JPanel、JButton和JMenu。与AWT组件相比,Swing组件的名前多一个 “J” 字母。另外,AWT 组件在java.awt包中,而Swing组件在javax.swing包中。 ? 简单图形用户界面 ? 类 JFrame

? frame 是带有标题和边界的顶层窗口,frame 的大小包括边界指定的所有区域,frame 的默认布

局为 BorderLayout。

? 如前所述,与AWT组件不同,Swing组件不直接添加到顶层容器中,它必须添加到一个与Swing

顶层容器相关联的内容面板上。对JFrame添加组件有两种方式: ? ? 类 JFrame

? (1)使用getContentPane( )方法获得JFrame的内容面板,再对其加入组件:

frame.getContentPane().add(childComponent); ? 其中“childComponent”为基本组件。

? (2)构造一个Jpanel或 JDesktopPane之类的中间容器,把组件添加到容器中,用

setContentPane()方法把该容器置为JFrame的内容面板: ? Jpanel pnlMain=new Jpanel( );//构造一个面板为中间容器 ? ??//把其它组件添加到Jpanel中;

? frame.setContentPane(pnlMain);//把contentPane对象设置成为frame的内容面板 ? 构造方法 ? JFrame()

构造一个初始时不可见的新窗体。JFrame(String title) 创建一个新的、初始不可见的、具有指定标题的 Frame。 ? 方法

? getContentPane()

返回此窗体的 contentPane 对象(内容面板,组件要添加到此) ? getJMenuBar()

返回此窗体上设置的菜单栏。

? setDefaultLookAndFeelDecorated(boolean defaultLookAndFeelDecorated)

提供一个关于新创建的 JFrame 是否应该具有当前外观为其提供的 Window 装饰(如边框、关闭窗口的小部件、标题等等)的提示。 ? setIconImage(Image image)

设置要作为此窗口图标显示的图像。 ? 方法

? setJMenuBar(JMenuBar menubar)

设置此窗体的菜单栏。 ? 其他继承的方法(和awt的frame一样)

? public void setBounds(int a,intb,int width,int heigth)

public void setSize(int width,int heigth) public void setLocation(int x,int y) public void setVisible(boolean b)

public void setResizable(boolean b)//是否允许调大小 jFrame.setUndecorated(true);

// 这样就可以去掉Jframe中对window的装饰了,无标题栏 ? 练习1建立一个有标题可以关闭的JFrame(ch9_1.java) ? import java.awt.*; ? import java.awt.event.*; ? import javax.swing.*;

? public class ch9_1 extends JFrame ? {

? public ch9_1() ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }

//标题

super(\我的第一个JFrame窗口\//设置大小和位置

setBounds(20,20,500,300); //点击关闭按钮可以关闭窗口

addWindowListener(new WindowAdapter() { }); /*

//第二种方法 点击关闭按钮可以关闭窗口

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); */

public void windowClosing(WindowEvent e) { }

System.exit(0);

? public static void main(String [] args) ? { ? ? ? } ? }

? 练习2建立一个带有左上角图标的窗口(ch9_2.java) ? import javax.swing.*;

? import javax.swing.ImageIcon.*; ? public class ch9_2 extends JFrame ? {

? public ch9_2() ? { ? ? ? ? ? ? ? ? ? ? }

? public static void main(String [] args) ? { ? ? ? } ? }

? 练习3建立一个没有最大化按钮的窗口(ch9_3.java) ? import javax.swing.*;

? public class ch9_3 extends JFrame ? {

? public ch9_3() ? { ? ? ? ? ? ? ? ? ?

//标题

super(\测试图标\//设置大小和位置

setBounds(20,20,500,300); //点击关闭按钮可以关闭窗口

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //去掉最大化按钮 setResizable(false);

ch9_2 f=new ch9_2(); f.show(); //标题

super(\测试图标\//设置大小和位置

setBounds(20,20,500,300); //点击关闭按钮可以关闭窗口

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //加入图标

ImageIcon icon=new ImageIcon(\setIconImage(icon.getImage()); ch9_1 f=new ch9_1(); f.show();

? }

? public static void main(String [] args) ? { ? ? ? } ? }

? 练习4去掉窗口的标题栏(ch9_4.java) ? import javax.swing.*;

? public class ch9_4 extends JFrame ? {

? public ch9_4() ? { ? ? ? ? ? ? ? ?

没有 ? }

? public static void main(String [] args) ? { ? ? ? } ? }

? swing的版面结构

? 每个使用Swing组件的程序至少是在一个顶层容器之上的。顶层容器是整个GUI程序的层次结构

中处于根的位置。

? 注:JApplet是基于Swing的applet中使用的顶层容器。

? 通过顶层容器可以得到一个内容面板(ContentPane)对象,用来放置图形组件。 frame.getContentPane().add(yellowLabel, BorderLayout.CENTER);

? 图形界面上的组件都是加载到这个面板上才得以显示的。 contentPane.add(someComponent, BorderLayout.CENTER);

? swing的版面结构

? 观察一下你常看到的windows系统中的软件,从理论上讲,每个软件的界面上都应该有一个菜单

栏。在Swing中我们通常是把JMenuBar对象加载到顶层容器中。

frame.setJMenuBar(greenMenuBar);

? 顶层容器包含一个透明的中间容器,叫做root面板。这个面板管理内容面板和菜单栏,在内容面

板上面我们还可以放置其他子面板,在面板上放置其他图形组件。它们的层次结构关系如下图所示:

ch9_4 f=new ch9_4(); f.show(); //标题

super(\测试图标\//设置大小和位置

setBounds(20,20,500,300); //点击关闭按钮可以关闭窗口

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置外观

setUndecorated(true);//这句可以禁用最小化、最大化、关闭按钮,并且令窗体连边界也ch9_3 f=new ch9_3(); f.show();

? swing的版面结构 ? swing的版面结构

? RootPaneContainer这个界面(Interface),此界面定义了各种容器取得与设置并不是真实的容器,

它是由Glass Pane与Layered Pane所组成(Layered Pane里拥有Content Pane与Menu Bar,而Menu Bar可选择使用或不使用),我们不能在JRootPane上加入任何的组件,因为它只是一个虚拟的容器,若要在最上层组件上加入组件,必须加在Layered Pane或是Layered Pane里的Content Pane上。以JFrame为例,一般我们要在JFrame上加入其他组件(如JButton、JLabel等)必须先取得JFrame的Content Pane,然后将要加入的组件放在此Content Pane中,而不是直接就加到JFrame上。因此若要在JFrame中加入一个按钮,一般要先取得JFrame的Content Pane,然后将按钮加入Content Pane中,如:

frame.getContentPane().add(button) ? 一个Java GUI简单程序

? 【例】一个简单的Swing GUI应用程序。在一个框架窗口中显示两个标签和一个按钮:上面的标

签显示一串固定的文字信息,选择按钮后在下面的标签上显示系统现在的时间。

? import java.awt.*; ? import java.awt.event.*; ? import javax.swing.*; ? import java.util.*;

? // 继承JFrame类并实现ActionListener接口 ? public class SwingDemo extends JFrame implements ? ActionListener{

? JButton b1; // 声明按钮对象 ? JLabel l1,l2; // 声明标签对象

? SwingDemo(){ // 定义构造方法

? super(\应用程序的例\调用父类的构造方法 ? l1=new JLabel(\一个GUI应用程序的例子\

? JLabel.CENTER); // 定义标签,文字居中 ? l2=new JLabel(\定义无文字标签 ? b1=new JButton(\现在时间[T]\定义按钮

? b1.setMnemonic(KeyEvent.VK_T);// 设置按钮的快捷键 ? b1.setActionCommand(\设置控制名 ? b1.addActionListener(this); // 注册按钮事件

? getContentPane().add(l1,BorderLayout.NORTH); // 添加标签l1 ? ? ? }

? // 对按钮引发事件编程

? public void actionPerformed(ActionEvent e){ ? // 捕获按钮事件

? Calendar c1 = Calendar.getInstance(); ? // 获取系统日期和时间

? if(e.getActionCommand().equals(\ ? // 判断是否为所需的按钮事件 ? l2.setText(“现在时间是”+

getContentPane().add(l2,BorderLayout.CENTER); // 添加标签l2 getContentPane().add(b1,BorderLayout.SOUTH); // 添加标签b1

? javax.swing.JPane类继承于javax.swing.JComponent类,其构造方法有:

? public JPanel() 创建具有缺省FlowLayout布局的JPanel对象。

? public JPanel(LayoutManager layout) 创建具有指定布局管理器的JPanel对象。

? 将JPanel作为画布的绘画区域使用时,要使用下面的两个步骤:首先,设置画布绘图区域的大小;

其次,使用paintComponent()方法(不是paint()方法)来绘图,在该方法体中,首先调用方法super.paintComponent()来清除显示区域。 ? 例如:

? public void paintComponent(Graphics g) { ? super.paintComponent(g); ? }

? JPanel可指定边界,可用的边界有TitledBorder(显示字符串标题的边框 )、EtchedBorder (浮

雕化边框 )、BeveledBorder(简单的双线斜面边框 ) 、LineBorder(单色、任意厚度线边框的类 )、MatteBorder (类似衬边的边框,衬边图案既可以是纯色也可以是平铺的图标 )等。创建自己的边界,可用JComponent类的setBorder()方法设置边界。其用法如下:

? public void setBorder(Border border)

? 其中,Border类的参数可用new对象或 javax.swing.BorderFactory类中的方法获得。获取各种

相应边界的方法为:

? createTitledBorder(String title)

创建一个新标题边框,使其具有指定的标题、默认的边框类型(由当前外观确定)、默认的文本位置(位于顶线上)、默认的调整 (leading),以及默认的字体和文本颜色(由当前外观确定)。createLineBorder(Color color, int thickness) 创建一个具有指定颜色和宽度的线边框。

? createMatteBorder(int top, int left, int bottom, int right, Color color)

使用纯色创建一个类似衬边的边框。 ? createEtchedBorder(Colorhighlight, Colorshadow)

使用指定的高亮显示颜色和阴影颜色创建一个具有“浮雕化”外观效果的边框。

? createTitledBorder(Border border, String title)

向现有边框添加一个标题,使其具有默认的位置(位于顶线上)、默认的调整 (leading),以及默认的字体和文本颜色(由当前外观确定)。 ? 【例9.7】使用JPanel。 ? import java.awt.*; ? import javax.swing.*;

? class JPanelDemo extends JPanel { ? JButton b1 = new JButton(\ ? JButton b2 = new JButton(\ ? public JPanelDemo() {

? setBackground(Color.white); ? add(b1); ? add(b2); ? }

? public static void main(String[] args) { ? JPanel jp = new JPanelDemo(); ? jp.setBorder(

? BorderFactory.createTitledBorder( ? \

? JFrame frame = new JFrame(\ ? frame.setSize(200, 150); ? frame.setContentPane(jp); ? frame.setDefaultCloseOperation( ? JFrame.EXIT_ON_CLOSE); ? frame.setVisible(true); ? } ? }

? 注:jp.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtched

Border(Color.red, Color.black),\

? 3.JApplet

? javax.swing.JApplet类是java.applet.Applet类的子类。使用Swing组件的小程序需继承

JApplet类。

? 除了所处的java包不同外,JApplet与Applet的主要区别还有: ? (1)缺省的布局管理器不同

? Applet缺省的布局管理器是FlowLayout,而JApplet(内容窗格)缺省的布局管理器是

BorderLayout。 ? (2)加入组件的方式不同

? Applet可直接加入组件,而JApplet缺省使用内容窗格ContentPane作为主容器。加入Swing组

件时,要先使用JApplet的方法getContentPane()获得一个Container对象,再调用这个对象的add()方法将Swing组件加入到JApplet的容器中。

见JAppletBorder.java 网页为JAppletBorder.htm

? 4.JTabbedPane

? javax. javax.swing.JTabbedPane类继承于javax.swing.JComponent,它的对象反映为一组带标

签的面板,每个面板都可以存放组件,因此JTabbedPane是一容器组件。 ? JTabbedPane类的构造方法有:

? JTabbedPane()创建空对象,该对象具有缺省的标签位置JTabbedPane.TOP和缺省的布

局策略JTabbedPane.WRAP_TAB_LAYOUT。

? JTabbedPane(int tabPlacement)创建空对象,该对象具有指定的标签位置:

JTabbedPane.TOP、JTabbedPane.BOTTOM、JTabbedPane.LEFT或JTabbedPane.RIGHT以及缺省的布局策略JTabbedPane.WRAP_TAB_LAYOUT。

? JTabbedPane(int tabPlacement, int tabLayoutPolicy)创建空对象,该对象具有指定

的标签位置和布局策略。布局策略可以是以下两种之一:JTabbedPane.WRAP_TAB_LAYOUT 或 JTabbedPane.SCROLL_TAB_LAYOUT。加滚动条

? JTabbedPane类的方法有:

? addTab(String title, Component component)

添加一个由 title 表示,且没有图标的 component。 ? addTab(String title, Icon icon, Component component)

添加一个由 title 和/或 icon 表示的 component,其任意一个都可以为 null。 ? addTab(String title, Icon icon, Component component, String tip)

添加由 title 和/或 icon 表示的 component 和 tip,其中任意一个都可以为 null。参数为:标题、图标、单击此选项卡时要显示的组件、此选项卡提示信息

? getSelectedIndex():返回当前选择的此选项卡窗格的索引。

? JTabbedPane类实现的接口有:

? implements ChangeListener ? 注册事件为:

? addChangeListener(ChangeListener l)

将一个 ChangeListener 添加到此选项卡窗格中。 ? 例:jt.addChangeListener(this); ? Jt为JTabbedPane对象

? 【例9.8】使用JTabbedPane容器。

import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class JTabbedPaneDemo{

public static void main(String args[]){ new MyTabbedPane(); } }

class MyTabbedPane extends JFrame implements ChangeListener,ActionListener{ JTabbedPane jt; JButton jb[]; int index = 0; MyTabbedPane(){

super(\使用标签面板容器\ jt = new JTabbedPane(); jb = new JButton[5]; for(int i = 0;i<5;i++){

jb[i] = new JButton(\第\页面板\ jb[i].addActionListener(this); jt.addTab(\页标签\ }

jt.addChangeListener(this);

getContentPane().add(jt,BorderLayout.CENTER); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300,200); setVisible(true); }

public void stateChanged(ChangeEvent e){ if(e.getSource()==jt){

int i = ((JTabbedPane)e.getSource()) .getSelectedIndex(); jb[index].setVisible(false); jb[i].setVisible(true);

index = i; } }

public void actionPerformed(ActionEvent e){ setTitle(“响应单击”

+((JButton)e.getSource()).getText()); } }

? 例9.8运行结果如下图所示。 ? 菜单组件 ? 类 JFrame方法 ? getJMenuBar()

返回此窗体上设置的菜单栏。 ? setJMenuBar(JMenuBar menubar)

设置此窗体的菜单栏。 ? 菜单组件

? JMenuBar添加到窗体的面板上 ? JMenu 添加到JMenuBar上 ? JMenuItem 添加到JMenu上 ? 菜单组件

? 菜单是GUI中非常重要和常见的组件。Swing的菜单组件件:

? JMenuBar JMenu ? JMuneItem JPopupMenu ? JCheckBoxMenuItem JRadioButtonMenuItem

? 菜单可分为下拉式菜单和弹出式菜单两种,

? 下拉式菜单:一般位于窗口的顶部,由菜单栏(JMenuBar)、菜单(JMenu)和菜单项

(JMuneItem)构成。

? 弹出式菜单(Jpopup Menu):不使用时是不可见的,需要时单击鼠标右键就可以弹出菜单。

? 菜单组件 (1)JMenuBar

? JMenuBar组件是摆放菜单的容器,可以使用其构造方法JMenuBar( )来创建菜单栏,但要把菜单

栏加入到容器中,与其他组件不同的,它不使用add( )方法,而使用专门设置菜单栏的方法setJMenuBar(JMenuBar menubar)。 ? 菜单栏不响应事件。 ? 菜单组件 (2)JMenu

? 菜单中包含若干菜单项,这些菜单项可随菜单添加到菜单栏中。如鼠标单击一个菜单时,就展开

该菜单,在菜单中显示一列菜单项,就会产生一个动作事件。JMenu的构造方法有:

● JMenu( ):创建一个没有文本的菜单。 ● JMenu(String s):创建一个有文本的菜单。 将菜单添加到菜单栏中使用add( )方法。 菜单不响应事件。

? 菜单组件 (3)JMenuItem

? 一个菜单项是包含在菜单中的一个字符串。当鼠标或键盘按键选中时,就触发一个动作事件,菜

单项可以是一个命令,也可以是另一个菜单(子菜单)。JMenuItem的构造方法有:

● JMenuItem( ):创建一个空的菜单项。

● JMenuItem(String text):创建一个具有指定文本的菜单项。 ● JMenuItem(Icon icon):创建一个有图标的菜单项。

● JMenuItem(String text, Icon icon):创建一个具有指定文本和图标的菜单项。 ● JMenuItem(String text,int mnemonic):创建一个具有指定文本且有快捷键的菜单项。

? 将菜单项加入到菜单中使用add( )方法。 ? 菜单组件 (4)下拉式菜单的创建

? 下拉式菜单的创建过程如下:

? ①首先创建菜单栏、创建菜单以及子菜单、创建菜单项,并将菜单项加入到子菜单或菜

单中,将子菜单加入到菜单中,将菜单加入到菜单栏中,将菜单栏加入到框架容器中。 ? ②设置菜单项的使用状态:通过setEnabled(Boolean b)方法设置菜单项是启用状态还

是禁用状态。

? 菜单组件:JMenuFrame.java (4)下拉式菜单的创建(续一)

? ③设置快捷键和加速器:快捷键显示为带有下画线的字母,加速器则显示为菜单项旁边的组合键。

? 可以通过setMnemonic(char mnemonic)设置快捷键,菜单项还可以在创建时利用构造方

法JMenuItem(String text,int mnemonic)设置快捷键。设置快捷键后,可以使用Alt+快捷键打开相应的菜单,在打开菜单后可以直接单击快捷键,实现对菜单项的选取。 ? 加速器可以在不打开菜单的情况下选择菜单项,当按下加速器组合键,相应的菜单项就

会被选中。加速器只能关联到菜单项,而不能关联到菜单,因为加速器从本质上讲是触发同菜单项相关联的事件监听器。可以利用方法setAccelerator(KeyStroke keystroke)设置菜单项的加速器。

? ④注册事件监听器,实现监听器接口

? swing的版面结构示例2:菜单界面的完整示例(ch9_49.java) ? import javax.swing.*; ? import java.awt.event.*;

? public class ch9_49 extends JFrame ? {

? public ch9_49() ? { ? ? ? ? ? } ?

? swing的版面结构示例2:菜单界面的完整示例(ch9_49.java) ? public static void main(String [] args) ? { ? ?

ch9_49 f=new ch9_49();

super(\菜单演示\

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(20,20,500,300);

本文来源:https://www.bwwdw.com/article/t0at.html

Top