李晓菁201771010114《面向对象程序设计(java)》第十三周学习总结

理论知识:事件处理

1.事件源:能够产生事件的对象都可以成为事件源,如文本框,按钮等。一个事件源是一个能够注册监听器并向监听器发送事件对象的对象。

2.事件监听器:事件监听器对象接收事件源发送的通告(事件对象),并对发生的事件作出响应。一个监听器对象就是一个实现了专门监听器接口的类实例,该类必须实现接口中的方法,这些方法当事件发生时,被自动执行。

3.事件对象:Java将事件的相关信息封装在一个事件对象中,所有的事件对象都最终被派生于Java.util.EventObject类。不同的事件源可以产生不同类别的事件。

2.AWT事件处理机制的概要;

监听器对象 :是一个实现了特定监听器接口 ( listener interface )的类实例 。

当事件发生时,事件源将事件对象自动传递给所有注册的监听器 。

监听器对象利用事件对象中的信息决定如何对事件做出响应。

 3.事件源与监听器之间的关系:

 

4.GUI设计中,程序员需要对组件的某种事件进行响应和处理时,必须完成两个步骤;

(1)定义实现某事件监听器接口的事件监听器类,并具体化接口中声明的事件的处理抽象方法。

(2)为组件注册实现了规定接口的事件监听器对象;

5.注册监听器方法:eventSourceObject.addEventListener(eventListenerObject)

 6.动态事件:当特定组件动作(点击按钮)发生时,该组件生成此动作事件。

该事件被传递给组件注册的每一个ActionListener对象,并调用监听器对象的actionPerformed方法以接受这类事件对象。

能够触发事件动作的动作,主要包括:

(1)点击按钮

(2)双击一个列表中的选项

(3)选择菜单项

(4)在文本框中输入回车

7.监听器接口的实现

监听器类必须实现与事件源相对应的接口,即必须提供接口中方法的实现。

监听器接口的方法实现

class MyListener implenments ActionListener

{

    public void actionPerformed(ActionEvent 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 listener=new 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 在事件处理相关代码处添加注释;

lambda表达式简化程序;

掌握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 panel
      buttonPanel.add(yellowButton);buttonPanel.add(blueButton);buttonPanel.add(redButton);//向内容窗格添加三个容器组件// add panel to frame
      add(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 buttons
      yellowButton.addActionListener(yellowAction);blueButton.addActionListener(blueAction);redButton.addActionListener(redAction);//将对应的监听器类和组件之间进行注册
   }/*** An action listener that sets the panel's 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 panel's 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 stub
                buttonPanel.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 ArrayList<Rectangle2D> 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();//返回该图形的X,Y坐标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 isn't 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 block
            e1.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/412753.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记一次 OOM 的原因和处理 出现大量 close_wait,项目无法访问 activeMq和 poi 出现的 OOM

大家好&#xff0c;我是烤鸭: 记一次项目无法访问的事件和处理。由于某个模块每隔几天就会出现无法访问&#xff0c;目前的最简单粗暴的方法就是重启。 1. 现象 项目内日志打印正常&#xff0c;经过dubbo的rpc服务和接口调用正常。http接口无法访问。提示nginx 502。 2.…

谷歌浏览器中安装JsonView扩展程序

实际开发工作中经常用到json数据&#xff0c;那么就会有这样一个需求&#xff1a;在谷歌浏览器中访问URL地址返回的json数据能否按照json格式展现出来。 比如&#xff0c;在谷歌浏览器中访问&#xff1a;http://jsonview.com/example.json 展现效果如下&#xff1a; 那么安装了…

Serialized class com.xxx.xxxService must implement java.io.Serializable

大家好&#xff0c;我是烤鸭&#xff1a; 使用dubbo的时候&#xff0c;遇到如下的问题。 Serialized class com.xxx.xxxService must implement java.io.Serializable 1. 异常 dubbo无论使用哪个协议传递参数的时候&#xff0c;都需要参数实现序列化接口。 所以提示这个…

CS229 7.1应用机器学习中的一些技巧

本文所讲述的是怎么样去在实践中更好的应用机器学习算法&#xff0c;比如如下经验风险最小化问题&#xff1a; 当求解最优的 后&#xff0c;发现他的预测误差非常之大&#xff0c;接下来如何处理来使得当前的误差尽可能的小呢&#xff1f;这里给出以下几个选项&#xff0c;下面…

8号团队-团队任务三:每日立会(2018-11-27)

团队信息&#xff1a; 1.团队序号 8 2.开发软件 飞机大战 3.今日整理人&#xff1a;徐浩茗 职位&#xff1a;项目经理 学号&#xff1a;2016035107247 4.本次团队会议共有8人参加 无缺席 团队汇报&#xff1a; &#xff08;截图&#xff09;如下 . 4.燃尽图 5.本次会议中遇…

Alibaba 开源工具 Arthas 使用

大家好&#xff0c;我是烤鸭&#xff1a; 很长时间没更新了&#xff0c;最近太忙了&#xff0c;只能抽空水点文章了&#xff0c;今天给大家介绍的是阿里的开源工具 Arthas 的使用。 1. 开源地址 Arthas 是Alibaba开源的Java诊断工具 https://github.com/alibaba/arthas 中文说…

Password

题目 题解 由打表得对于任意\(i \geq 1\)&#xff0c;都有第\(i1\)行和第\(i3\)行相等、 于是我们可以分块维护一下。 然后做完了。 代码 #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <algorithm>us…

[maven] springboot将jar包打包到指定目录

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一下springboot将jar包打包到指定目录下。 由于之前上线都是一个打包到一个jar&#xff0c;由于服务多了&#xff0c;1个包100多M&#xff0c;哪怕是小版本上线都需要重新上传jar包。 1.目的 将不常用的比如spring,druid等不常…

springboot启动后卡住 无日志的几种情况

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一下springboot启动后无日志的问题。 1.场景复现 springboot项目启动后卡住无日志&#xff0c;肯定是报错了或者其他原因&#xff0c;并且日志没有打印出来。 1.1 说一下比较通用常见的场景。 检查一下 是否 exc…

VMware下Centos7快速搭建vsftpd

最简单快捷的实现ftp的功能,不考虑安全问题. 1.配置防火墙和selinux vi /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX can take one of these three values: # enforcing - SELinux security policy is enforced. # per…

PMP读书笔记(第1章)

大家好&#xff0c;我是烤鸭&#xff1a;     今天做一个PMP的读书笔记。 第一章 引论1.1 概述指南和目的1.1.1 项目管理标准1.1.2 通用词汇1.1.3 道德与专业行为规范1.2 概述指南和目的1.2.1 项目1.2.2 项目管理的重要性1.2.3 项目、项目集、项目组合以及运营管理之间的关…

PMP读书笔记(第2章)

大家好&#xff0c;我是烤鸭&#xff1a;     今天做一个PMP的读书笔记。 第二章 项目运行环境2.1 概述2.2 事业环境因素2.2.1 组织内部的事业环境因素2.2.2 组织外部的事业环境因素2.3 组织过程资产2.3.1 过程、政策和程序2.3.2 组织知识库2.4 组织系统2.4.1 概述2.4.2 组…

do文件的编写(转)

以前在使用ModelSim进行仿真的时候&#xff0c;一直是使用其GUI进行操作的&#xff0c;但是这样很繁琐也很费时。故希望学习其自动化仿真do文件&#xff0c;下面是学习的一些总结。 一、编写基本的do文件 下面按照实际仿真的步骤来说明do文件中需要用到的各个tcl命令。 1、quit…

PMP读书笔记(第4章)

大家好&#xff0c;我是烤鸭&#xff1a;     今天做一个PMP的读书笔记。 第四章 项目整合管理概述项目整合管理的核心概念项目整合管理的发展趋势和新兴实践裁剪时需要考虑的因素在敏捷或适应型环境中需要考虑的因素4.1 制定项目章程4.1.1 制定项目章程&#xff1a;输入4.…

php中foreach循环遍历二维数组

最近在用tp3.2框架&#xff0c;在查询的时候用到了select()&#xff0c;这条语句返回的是二维数组&#xff0c;所以在对返回的数据做处理时&#xff0c;遇到了些麻烦&#xff0c;百度了下foreach&#xff0c;终于用foreach解决了数据的筛选问题 &#xff08;因为不知道该怎么设…

PMP读书笔记(第6章)

大家好&#xff0c;我是烤鸭&#xff1a;     今天做一个PMP的读书笔记。 第六章 项目进度管理项目进度管理项目进度管理的核心概念项目进度管理的发展趋势和新兴实践裁剪考虑因素关于敏捷/适应型环境的考虑因素6.1 规划进度管理6.1.1 规划进度管理&#xff1a;输入6.1.1.1…

connect ECONNREFUSED 151.101.0.133:443 | spawn xxx ENOENT

大家好&#xff1a; 我是烤鸭&#xff0c;今天分享一个node项目打包失败的问题。 1. 问题复现 之前一直出现node项目打包失败的情况&#xff0c;使用测试环境的jenkins没问题&#xff0c;生产的有问题。基本可以排除代码层面的问题。 报错信息如图。另外说一下出现了 con…

Python(八) 函数、模块

函数 定义函数 1、意义&#xff1a;函数是实现某个功能的一些代码&#xff0c;提高代码的复用性。 2、定义:用def关键字定义函数&#xff0c; 3、函数组成&#xff1a;函数由函数名、形参、函数体、调用函数&#xff08;里面会有函数体&#xff09;组成 4、要使用函数&#xff…

PMP读书笔记(第7章)

大家好&#xff0c;我是烤鸭&#xff1a;     今天做一个PMP的读书笔记。 第七章 项目成本管理项目成本管理项目成本管理的核心概念项目成本管理的趋势和新兴实践裁剪考虑因素关于敏捷/适应型环境的考虑因素7.1 规划成本管理7.1.1 规划成本管理&#xff1a;输入7.1.1.1 项目…

PMP 第六版 p25 矩阵图 方便记忆 口诀

大家好&#xff0c;我是烤鸭&#xff1a;     这是我第六版PMP矩阵图和自己总结的方便记忆的方法。 记忆方法&#xff1a; 首先是6大管理过程&#xff0c;10大知识领域。这个需要背下来。 过程&#xff1a;启动-规划-执行-监控-收尾 知识领域&#xff1a;整合-范围-进度-…