衡水网站建设维护,宝安官网网站建设比较好的,营销型网站策划,建一个论坛网站怎么建理论知识#xff1a;事件处理 1.事件源#xff1a;能够产生事件的对象都可以成为事件源#xff0c;如文本框#xff0c;按钮等。一个事件源是一个能够注册监听器并向监听器发送事件对象的对象。 2.事件监听器#xff1a;事件监听器对象接收事件源发送的通告#xff08;事…理论知识事件处理 1.事件源能够产生事件的对象都可以成为事件源如文本框按钮等。一个事件源是一个能够注册监听器并向监听器发送事件对象的对象。 2.事件监听器事件监听器对象接收事件源发送的通告事件对象并对发生的事件作出响应。一个监听器对象就是一个实现了专门监听器接口的类实例该类必须实现接口中的方法这些方法当事件发生时被自动执行。 3.事件对象Java将事件的相关信息封装在一个事件对象中所有的事件对象都最终被派生于Java.util.EventObject类。不同的事件源可以产生不同类别的事件。 2.AWT事件处理机制的概要; 监听器对象 :是一个实现了特定监听器接口 listener interface 的类实例 。 当事件发生时事件源将事件对象自动传递给所有注册的监听器 。 监听器对象利用事件对象中的信息决定如何对事件做出响应。 3.事件源与监听器之间的关系 4.GUI设计中程序员需要对组件的某种事件进行响应和处理时必须完成两个步骤; 1定义实现某事件监听器接口的事件监听器类并具体化接口中声明的事件的处理抽象方法。 2为组件注册实现了规定接口的事件监听器对象 5.注册监听器方法:eventSourceObject.addEventListenereventListenerObject 6.动态事件当特定组件动作点击按钮发生时该组件生成此动作事件。 该事件被传递给组件注册的每一个ActionListener对象并调用监听器对象的actionPerformed方法以接受这类事件对象。 能够触发事件动作的动作主要包括: 1点击按钮 2双击一个列表中的选项 3选择菜单项 4在文本框中输入回车 7.监听器接口的实现 监听器类必须实现与事件源相对应的接口即必须提供接口中方法的实现。 监听器接口的方法实现 class MyListener implenments ActionListener { public void actionPerformedActionEvent event {......} } 8.命令按钮Jbutton主要API 1创建按钮对象 Jbutton类常用的一组构造方法; (1) JButton(String text)创建一个带文本的按钮。(2) JButton(Icon icon) 创建一个带图标的按钮。(3)JButton(String text, Icon icon) 创建一个带文本和图标的按钮 2按钮对象的常用方法 ① getLabel( )返回按钮的标签字符串② setLabel(String s)设置按钮的标签为字符串s。 9. 用匿名类、lambda表达式简化程序 例ButtonTest.java中各按钮需要同样的处理1) 使用字符串构造按钮对象2) 把按钮添加到面板上3) 用对应的颜色构造一个动作监听器4) 注册动作监听器 10.适配器类 当程序用户试图关闭一个框架窗口时Jframe对象就是WindowEvent的事件源。⚫ 捕获窗口事件的监听器 WindowListener listener…..;frame.addWindowListener(listener);⚫ 窗口监听器必须是实现WindowListener接口的类的一个对象WindowListener接口中有七个方法它们的名字是自解释的。 11.鉴于代码简化的要求对于有不止一个方法的AWT监听器接口都有一个实现了它的所有方法但却 不做任何工作的适配器类。例WindowAdapter类。 适配器类动态地满足了Java中实现监视器类的技术要求。 ⚫ 通过扩展适配器类来实现窗口事件需要的动作 12.注册事件监听器 可将一个Terminator对象注册为事件监听器WindowListener listenernew Terminator();frame.addWindowListener(listener);⚫ 只要框架产生一个窗口事件该事件就会传递给监听器对象。 创建扩展于WindowAdapter的监听器类是很好的改进但还可以进一步将上面语句也可简化为frame.addWindowListener(new Terminator()); 13.动作事件 1激活一个命令可以有多种方式如用户可以通过菜单、击键或工具栏上的按钮选择特定的功能。2在AWT事件模型中无论是通过哪种方式下达命令如点击按钮、菜单选项、按下键盘其操作动作都是一样的。 14.动作接口及其类 Swing包提供了非常实用的机制来封装命令并将它们连接到多个事件源这就是Action接口。⚫ 动作对象是一个封装下列内容的对象–命令的说明一个文本字符串和一个可选图标–执行命令所需要的参数。 ⚫ Action是一个接口而不是一个类实现这个接口的类必须要实现它的7个方法。⚫ AbstractAction 类 实 现 了 Action 接 口 中 除actionPerformed方法之外的所有方法这个类存储了所有名/值对并管理着属性变更监听器。 在 动 作 事 件 处 理 应 用 中 可 以 直 接 扩 展AbstractAction 类 并 在 扩 展 类 中 实 现actionPerformed方法。 15.鼠标事件 ⚫ 鼠标事件– MouseEvent⚫ 鼠标监听器接口– MouseListener– MouseMotionListener⚫ 鼠标监听器适配器– MouseAdapter– MouseMotionAdapter 用户点击鼠标按钮时,会调用三个监听器方法– 鼠标第一次被按下时调用mousePressed方法– 鼠标被释放时调用mouseReleased方法– 两个动作完成之后,调用mouseClicked方法。⚫ 鼠标在组件上移动时,会调用mouseMoved方法。 如果鼠标在移动的时候还按下了鼠标,则会调用mouseDragged方法 ⚫ 鼠标事件返回值– 鼠标事件的类型是MouseEvent当发生鼠标事件时MouseEvent类自动创建一个事件对象以及事件发生位置的x和y坐标作为事件返回值。 MouseEvent类中的重要方法– public int getX( );– public int getY( );– public Point getPoint( );– public int getClickCount( ); 实验十三 图形界面事件处理技术 实验时间 2018-11-22 1、实验目的与要求 (1) 掌握事件处理的基本原理理解其用途 (2) 掌握AWT事件模型的工作机制 (3) 掌握事件处理的基本编程模型 (4) 了解GUI界面组件观感设置方法 (5) 掌握WindowAdapter类、AbstractAction类的用法 (6) 掌握GUI程序中鼠标事件处理技术。 2、实验内容和步骤 实验1 导入第11章示例程序测试程序并进行代码注释。 测试程序1 l 在elipse IDE中调试运行教材443页-444页程序11-1结合程序运行结果理解程序 l 在事件处理相关代码处添加注释 l 用lambda表达式简化程序 l 掌握JButton组件的基本API l 掌握Java中事件处理的基本编程模型。 package button;import java.awt.*;
import javax.swing.*;/*** version 1.34 2015-06-12* author Cay Horstmann*/
public class ButtonTest
{public static void main(String[] args){EventQueue.invokeLater(() - {JFrame frame new ButtonFrame();frame.setTitle(ButtonTest);//设置窗口的标题frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);//将窗口设为可见的});}
} button package button;import java.awt.*;
import java.awt.event.*;
import javax.swing.*;/*** A frame with a button panel*/
public class ButtonFrame extends JFrame
{private JPanel buttonPanel;//该类对象属性private static final int DEFAULT_WIDTH 300;private static final int DEFAULT_HEIGHT 200;public ButtonFrame(){ setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);//通过setsize来更改框架的宽度和高度// create buttonsJButton yellowButton new JButton(Yellow);JButton blueButton new JButton(Blue);JButton redButton new JButton(Red);//生成三个按钮对象string影响的是显示在button上的文本
buttonPanel new JPanel();// add buttons to panelbuttonPanel.add(yellowButton);buttonPanel.add(blueButton);buttonPanel.add(redButton);//向内容窗格添加三个容器组件// add panel to frameadd(buttonPanel);// create button actionsColorAction yellowAction new ColorAction(Color.YELLOW);ColorAction blueAction new ColorAction(Color.BLUE);ColorAction redAction new ColorAction(Color.RED);//生成三个ColorAction监听器类对象// associate actions with buttonsyellowButton.addActionListener(yellowAction);blueButton.addActionListener(blueAction);redButton.addActionListener(redAction);//将对应的监听器类和组件之间进行注册}/*** An action listener that sets the panels background color.*/private class ColorAction implements ActionListener//实现监听器接口{private Color backgroundColor;public ColorAction(Color c){backgroundColor c;}public void actionPerformed(ActionEvent event){buttonPanel.setBackground(backgroundColor);//更改背景色}}
} buttonFrame 通过内部类方法实现 package button;import java.awt.*;
import java.awt.event.*;
import javax.swing.*;/*** A frame with a button panel*/
public class ButtonFrame extends JFrame {private JPanel buttonPanel;// 该类对象属性private static final int DEFAULT_WIDTH 300;private static final int DEFAULT_HEIGHT 200;public ButtonFrame() {setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);// 通过setsize来更改框架的宽度和高度
buttonPanel new JPanel();add(buttonPanel);makeButton(yellow, Color.yellow);makeButton(blue, Color.blue);makeButton(red, Color.red);makeButton(green, Color.green);//添加一个新的组件只需要该条语句}public void makeButton(String name, Color backgroundColor) {JButton button new JButton(name);buttonPanel.add(button);ColorAction action new ColorAction(backgroundColor);button.addActionListener(action);}/*** An action listener that sets the panels background color.*/private class ColorAction implements ActionListener// 实现监听器接口{private Color backgroundColor;public ColorAction(Color c) {backgroundColor c;}public void actionPerformed(ActionEvent event) {buttonPanel.setBackground(backgroundColor);// 更改背景色}}
} buttonFrame 通过匿名内部类方法实现 package button;import java.awt.*;
import java.awt.event.*;
import javax.swing.*;/*** A frame with a button panel*/
public class ButtonFrame extends JFrame {private JPanel buttonPanel;// 该类对象属性private static final int DEFAULT_WIDTH 300;private static final int DEFAULT_HEIGHT 200;public ButtonFrame() {setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);// 通过setsize来更改框架的宽度和高度
buttonPanel new JPanel();add(buttonPanel);makeButton(yellow, Color.yellow);makeButton(blue, Color.blue);makeButton(red, Color.red);makeButton(green, Color.green);// 添加一个新的组件只需要该条语句}public void makeButton(String name, Color backgroundColor) {JButton button new JButton(name);buttonPanel.add(button);// ColorAction action new ColorAction(backgroundColor);// button.addActionListener(action);button.addActionListener(new ActionListener() {// 不能直接使用接口new后面有一个匿名的类名后面的ActionListener通过匿名类调用Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubbuttonPanel.setBackground(backgroundColor);}});}} buttonFrame 通过lambda表达式实现 package button;import java.awt.*;
import java.awt.event.*;
import javax.swing.*;/*** A frame with a button panel*/
public class ButtonFrame extends JFrame {private JPanel buttonPanel;// 该类对象属性private static final int DEFAULT_WIDTH 300;private static final int DEFAULT_HEIGHT 200;public ButtonFrame() {setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);// 通过setsize来更改框架的宽度和高度
buttonPanel new JPanel();add(buttonPanel);makeButton(yellow, Color.yellow);makeButton(blue, Color.blue);makeButton(red, Color.red);makeButton(green, Color.green);// 添加一个新的组件只需要该条语句}public void makeButton(String name, Color backgroundColor) {JButton button new JButton(name);buttonPanel.add(button);button.addActionListener((e) - {buttonPanel.setBackground(backgroundColor);});}} buttonFrame 通过以上三种方式实现事件处理的基本代码越来越简化。 测试程序2 l 在elipse IDE中调试运行教材449页程序11-2结合程序运行结果理解程序 l 在组件观感设置代码处添加注释 l 了解GUI程序中观感的设置方法。 package plaf;import java.awt.*;
import javax.swing.*;/*** version 1.32 2015-06-12* author Cay Horstmann*/
public class PlafTest
{public static void main(String[] args){EventQueue.invokeLater(() - {JFrame frame new PlafFrame();frame.setTitle(PlafTest);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);});}
} plaf package plaf;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;/*** A frame with a button panel for changing look-and-feel*/
public class PlafFrame extends JFrame
{private JPanel buttonPanel;public PlafFrame(){buttonPanel new JPanel();
//组件观感设置UIManager.LookAndFeelInfo[] infos UIManager.getInstalledLookAndFeels();//UIManager 管理当前外观、可用外观集合及获取各种默认值的便捷方法。//返回表示当前可用的 LookAndFeel 实现的 LookAndFeelInfo 数组。应用程序可以使用 LookAndFeelInfo 对象为用户构造外观选项的菜单或确定在启动时要设置哪个外观 for (UIManager.LookAndFeelInfo info : infos)makeButton(info.getName(), info.getClassName());
//适合菜单或其他展示的形式返回外观的名称 ,返回实现此外观的类名称add(buttonPanel);pack();//调整此窗口的大小以适合其子组件的首选大小和布局}/*** Makes a button to change the pluggable look-and-feel.* param name the button name* param className the name of the look-and-feel class*/private void makeButton(String name, String className){// add button to panel
JButton button new JButton(name);buttonPanel.add(button);// set button action
button.addActionListener(event - {// button action: switch to the new look-and-feeltry{UIManager.setLookAndFeel(className);SwingUtilities.updateComponentTreeUI(this);//简单的外观更改pack();}catch (Exception e){e.printStackTrace();}});}
} plafFrame 不同的组件有不同的观感 测试程序3 l 在elipse IDE中调试运行教材457页-458页程序11-3结合程序运行结果理解程序 l 掌握AbstractAction类及其动作对象 l 掌握GUI程序中按钮、键盘动作映射到动作对象的方法。 package action;import java.awt.*;
import javax.swing.*;/*** version 1.34 2015-06-12* author Cay Horstmann*/
public class ActionTest
{public static void main(String[] args){EventQueue.invokeLater(() - {JFrame frame new ActionFrame();frame.setTitle(ActionTest);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);});}
} action package action;import java.awt.*;
import java.awt.event.*;
import javax.swing.*;/*** A frame with a panel that demonstrates color change actions.*/
public class ActionFrame extends JFrame
{private JPanel buttonPanel;private static final int DEFAULT_WIDTH 300;private static final int DEFAULT_HEIGHT 200;public ActionFrame(){setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);buttonPanel new JPanel();// define actionsAction yellowAction new ColorAction(Yellow, new ImageIcon(yellow-ball.gif),//Action 接口提供 ActionListener 接口的一个有用扩展以便若干控件访问相同的功能Color.YELLOW);//可以将此接口添加到现有类中或者用它创建一个适配器通常通过子类化 AbstractAction 来实现。Action blueAction new ColorAction(Blue, new ImageIcon(blue-ball.gif), Color.BLUE);Action redAction new ColorAction(Red, new ImageIcon(red-ball.gif), Color.RED);
//根据指定的文件创建一个 ImageIcon。使用 MediaTracker 预载图像以监视图像的加载状态。指定 String 可以是一个文件名或是一条文件路径。// add buttons for these actionsbuttonPanel.add(new JButton(yellowAction));buttonPanel.add(new JButton(blueAction));buttonPanel.add(new JButton(redAction));// add panel to frameadd(buttonPanel);//添加组件// associate the Y, B, and R keys with namesInputMap imap buttonPanel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);//使用继承自 JComponent 的组件//当接收组件是获得焦点的组件的祖先或者其本身就是获得焦点的组件时应该调用命令。 imap.put(KeyStroke.getKeyStroke(ctrl Y), panel.yellow);imap.put(KeyStroke.getKeyStroke(ctrl B), panel.blue);imap.put(KeyStroke.getKeyStroke(ctrl R), panel.red);//InputMap 提供输入事件目前只使用 KeyStroke和 Object 之间的绑定。InputMap 通常与 ActionMap 一起使用//以确定按下键时执行一个 Action。InputMap 可以有一个父级可搜索它来获得 InputMap 中未定义的绑定。// associate the names with actionsActionMap amap buttonPanel.getActionMap();amap.put(panel.yellow, yellowAction);amap.put(panel.blue, blueAction);amap.put(panel.red, redAction);//ActionMap 提供从 Object称为键 或 Action 名到 Action 的映射。当按下某一个键时ActionMap 通常与 InputMap 一起使用来定位特定操作。//与 InputMap 一同使用时ActionMap 可以有一个父级用来搜索没有在该 ActionMap 中定义的键。}public class ColorAction extends AbstractAction{/*** Constructs a color action.* param name the name to show on the button* param icon the icon to display on the button* param c the background color*/public ColorAction(String name, Icon icon, Color c){//putvalue设置与指定键关联的值putValue(Action.NAME, name);//用于菜单或按钮的名字putValue(Action.SMALL_ICON, icon);//该键通常用于菜单,同时指定了要使用SMALL-ICONputValue(Action.SHORT_DESCRIPTION, Set panel color to name.toLowerCase());//用来存储动作的简短 String 描述的键用于工具提示文本。//toLowerCase使用默认语言环境的规则将此 String 中的所有字符都转换为小写putValue(color, c);}public void actionPerformed(ActionEvent event)//actionListener中的一个方法{Color c (Color) getValue(color);buttonPanel.setBackground(c);}}
} actionFrame 测试程序4 l 在elipse IDE中调试运行教材462页程序11-4、11-5结合程序运行结果理解程序 l 掌握GUI程序中鼠标事件处理技术。 package mouse;import java.awt.*;
import javax.swing.*;/*** version 1.34 2015-06-12* author Cay Horstmann*/
public class MouseTest
{public static void main(String[] args){EventQueue.invokeLater(() - {JFrame frame new MouseFrame();frame.setTitle(MouseTest);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);});}
} mouse package mouse;import javax.swing.*;/*** A frame containing a panel for testing mouse operations*/
public class MouseFrame extends JFrame
{public MouseFrame(){add(new MouseComponent());pack();}
} mouseFrame package mouse;import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;/*** A component with mouse operations for adding and removing squares.*/
public class MouseComponent extends JComponent
{private static final int DEFAULT_WIDTH 300;private static final int DEFAULT_HEIGHT 200;private static final int SIDELENGTH 10;private ArrayListRectangle2D squares;//Rectangle2D 类描述通过位置 (x,y) 和尺寸 (w x h) 定义的矩形private Rectangle2D current; // the square containing the mouse cursorpublic MouseComponent(){squares new ArrayList();//构造一个空列表current null;addMouseListener(new MouseHandler());//添加鼠标监听器addMouseMotionListener(new MouseMotionHandler());//添加指定的鼠标移动侦听器以接收发自此组件的鼠标移动事件。}public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); } //如果 preferredSize 已设置为一个非 null 值则返回该值。如果 UI 委托的 getPreferredSize 方法返回一个非 null 值则返回该值public void paintComponent(Graphics g){Graphics2D g2 (Graphics2D) g;// draw all squaresfor (Rectangle2D r : squares)g2.draw(r);//在画布上画出一个矩形}/*** Finds the first square containing a point.* param p a point* return the first square that contains p*/public Rectangle2D find(Point2D p)//通过位置 (x,y) 和尺寸 (w x h) 定义的矩形。{for (Rectangle2D r : squares){if (r.contains(p)) return r;//测试指定的 Point2D 是否在 Shape 的边界内}return null;}/*** Adds a square to the collection.* param p the center of the square*/public void add(Point2D p){double x p.getX();//返回该图形的XY坐标double y p.getY();current new Rectangle2D.Double(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH,SIDELENGTH);squares.add(current);repaint();}/*** Removes a square from the collection.* param s the square to remove*/public void remove(Rectangle2D s){if (s null) return;if (s current) current null;squares.remove(s);repaint();}private class MouseHandler extends MouseAdapter//鼠标监听器适配器{public void mousePressed(MouseEvent event)//鼠标按键在组件上按下时调用mousepressed方法{// add a new square if the cursor isnt inside a squarecurrent find(event.getPoint());if (current null) add(event.getPoint());//若鼠标指针不在之前的矩形内则点击鼠标时重新画一个矩形}public void mouseClicked(MouseEvent event)//鼠标按键在组件上单击按下并释放时调用。 {// remove the current square if double clickedcurrent find(event.getPoint());if (current ! null event.getClickCount() 2) remove(current);//当鼠标在矩形框内双击时取消该矩形框}}private class MouseMotionHandler implements MouseMotionListener//实现移动监听器接口{public void mouseMoved(MouseEvent event)//鼠标光标移动到组件上但无按键按下时调用{// set the mouse cursor to cross hairs if it is inside// a rectangleif (find(event.getPoint()) null) setCursor(Cursor.getDefaultCursor());//为指定的光标设置光标图像else setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));//十字光标类型。}public void mouseDragged(MouseEvent event)//鼠标按键在组件上按下并拖动时调用。在释放鼠标按键前MOUSE_DRAGGED 事件被连续地传递到发起该拖动的组件而不管鼠标位置是否处于该组件的边界内。{if (current ! null){int x event.getX();int y event.getY();
//当发生鼠标事件时 MouseEvent类自动创建一个事件对象以及事件发生位置的x和y坐标作为事件返回值。// drag the current rectangle to center it at (x, y)current.setFrame(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH, SIDELENGTH);repaint();//重组此绘件}}}
} mousecomponent 当鼠标点击画布时绘制一个矩形当鼠标在窗体上移动时如果鼠标经过一个小方块的内部光标会变成一个十字形 当双击一个小方块内部时会擦除该小方块实现用鼠标拖动小方块。 当鼠标点击在所有小方块的像素之外时会绘制一个新的小方块 实验2结对编程练习 利用班级名单文件、文本框和按钮组件设计一个有如下界面图1的点名器要求用户点击开始按钮后在文本输入框随机显示2017级网络与信息安全班同学姓名如图2所示点击停止按钮后文本输入框不再变换同学姓名此同学则是被点到的同学姓名。 图1 点名器启动界面 图2 点名器点名界面 package 点名器;import java.util.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.File;
import java.io.FileNotFoundException;import javax.swing.event.*;public class NameFrame extends JFrame implements ActionListener {//采用多线程private JLabel jla;//JLabel 对象可以显示文本、图像或同时显示二者。private JLabel jlb;private JButton jba;private static boolean flag true;//定义一个静态常量并将其值设置为truepublic NameFrame() {this.setLayout(null);//类 Container 中的 setLayout,设置 LayoutManager。重写此方法从而有条件地将调用转发到 contentPane
jla new JLabel(姓名);jlb new JLabel(准备中);jba new JButton(开始);//创建按钮并将其命名为开始this.add(jla);this.add(jlb);jla.setFont(new Font(Courier, Font.PLAIN, 25));//设置该组件的字体jla.setHorizontalAlignment(JLabel.CENTER);//设置标签内容沿 X 轴的对齐方式并在该区域的中心位置jla.setVerticalAlignment(JLabel.CENTER);//设置标签内容沿 Y 轴的对齐方式并在该区域的中心位置jla.setBounds(20, 100, 180, 30);jlb.setOpaque(true);//如果为 true则该组件绘制其边界内的所有像素。否则该组件可能不绘制部分或所有像素从而允许其底层像素透视出来。 jlb.setBackground(Color.cyan);//设置此组件的背景色。jlb.setFont(new Font(Courier, Font.PLAIN, 22));jlb.setHorizontalAlignment(JLabel.CENTER);jlb.setVerticalAlignment(JLabel.CENTER);jlb.setBounds(150, 100, 120, 30);this.add(jba);//设置开始按钮的一些属性jba.setBounds(150, 150, 80, 26);//移动组件并调整其大小。由 x 和 y 指定左上角的新位置由 width 和 height 指定新的大小。
jba.addActionListener(this);//将一个 ActionListener 添加到按钮中this.setTitle(点名器);this.setBounds(400, 400, 400, 300);this.setVisible(true);this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);//调用任意已注册 WindowListener 的对象后自动隐藏并释放该窗体。 }public void actionPerformed(ActionEvent e) {int i 0;String names[] new String[50];//创建一个数组该数组的最大容量为50try {Scanner in new Scanner(new File(D:\\studentnamelist.txt));while (in.hasNextLine()) {//如果在此扫描器的输入中存在另一行则返回 true。在等待输入信息时此方法可能阻塞。扫描器不执行任何输入。 names[i] in.nextLine();i;//遍历名单}} catch (FileNotFoundException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}if (jba.getText() 开始) {//返回按钮的文本jlb.setBackground(Color.BLUE);//设置组件的背景色flag true;new Thread() {//分配新的 Thread 对象。这种构造方法与 Thread(null, null, gname) 具有相同的作用其中 gname 是一个新生成的名称。自动生成的名称的形式为 Thread-n其中的 n 为整数。public void run() {while (NameFrame.flag) {Random r new Random();int i r.nextInt(47);jlb.setText(names[i]);//定义此组件将要显示的单行文本。如果 text 值为 null 或空字符串则什么也不显示,此时为name则显示停止时的名字}}}.start();//使该线程开始执行Java 虚拟机调用该线程的 run 方法。jba.setText(停止);jba.setBackground(Color.ORANGE);} else if (jba.getText() 停止) {flag false;//当点击按钮的停止时返回该按钮的名字并且变量flag的布尔值为flasejba.setText(开始);//按钮的名字为开始jba.setBackground(Color.WHITE);//开始按钮的颜色为白色jlb.setBackground(Color.gray);//未开始点击开始按钮时姓名输入框为灰色}}public static void main(String arguments[]) {new NameFrame();}
} nameframe 在点名器的程序设计中完全没有思路该如何写在学长的实例程序上做了注释及稍许改动但对于多线程还是没有理解该如何使用。 实验总结通过本周学习我基本掌握了事件处理的基本原理及AWT事件模型的工作机制掌握事件处理的基本编程模型并用多种方法简化代码在老师和学长的教导进一步 理解了匿名内部类但对于 GUI界面组件观感设置方法还不太理解 掌握了AbstractAction类的用法及GUI程序中鼠标事件处理技术。 转载于:https://www.cnblogs.com/li-xiaojing/p/10002768.html