java第七次实验作业

一、学习要点

认真看书并查阅相关资料,掌握以下内容:了解GUI开发的相关原理和技巧熟悉Swint组件的使用理解事件处理模型###

1.重要类的位置
(1)Java.awt.geom 中包含了集合图形Ellipse2D、Line2D、Point2D、Rectangle2D。(注意每个2D类都有Float和Double两种,经常用Double)
(2)java.awt.Graphics 是在Panel中绘制图形的类,可以绘制String文本、Graphics2D绘制几何图形(g2.draw());
2.在实现paintComponent(Graphics g)是别忘了调用super.paintComponent(g);
3.设置颜色:
g2.setPaint(Color.); //设置Graphics2D以后绘制的图像的颜色,
panel.setBackground(Color.
);
4.设置字体:
Font font=new Font("字体名",Font.BOLD|Font.ITALIC,size);
g2.setFont(font);//接下来的字符串会按照这个字体。
label.setFont(font);//把label的字体变换

2.

测试代码###

package cn.javastudy.summary;
 
import java.awt.*;
import java.awt.event.*;
 
public class TestTextField {
  public static void main(String args[]) {
    new MyFrameTextField();
  }
}
 
class MyFrameTextField extends Frame {
  MyFrameTextField() {
    TextField tf = new TextField();
    add(tf);
    tf.addActionListener(new Monitor3());
    tf.setEchoChar('*');
    /*
     * 这个setEchoChar()方法是设置文本框输入时显示的字符,这里设置为*, 
     * 这样输入任何内容就都以*显示出来,不过打印出来时依然可以看到输入的内容
     */
    setVisible(true);
    pack();
  }
}
 
class Monitor3 implements ActionListener {
  /*
   * 接口里面的所有方法都是public(公共的) 
   * 所以从API文档复制void actionPerformed(ActionEvent e)时 要在void前面加上public
   */
  public void actionPerformed(ActionEvent e) {
    /* 事件的相关信息都封装在了对象e里面,通过对象e的相关方法就可以获取事件的相关信息 */
    TextField tf = (TextField) e.getSource();
    /*
     * getSource()方法是拿到事件源,注意:拿到这个事件源的时候,
     * 是把它当作TextField的父类来对待 
     * getSource()方法的定义是:“public Object getSource()”返回值是一个Object对象,
     * 所以要强制转换成TextField类型的对象 
     * 在一个类里面想访问另外一个类的事件源对象可以通过getSource()方法
     */
    System.out.println(tf.getText());// tf.getText()是取得文本框里面的内容
    tf.setText("");// 把文本框里面的内容清空
  }
}

测试代码2###

package cn.javastudy.summary;
 
import java.awt.*;
import java.awt.event.*;
public class TestActionEvent2{
  public static void main(String args[]){
    Frame f = new Frame("TestActionEvent");
    Button btn1 = new Button("start");
    Button btn2 = new Button("stop");
    Monitor2 m2 = new Monitor2();//创建监听对象
    btn1.addActionListener(m2);
    /*一个监听对象同时监听两个按钮的动作*/
    btn2.addActionListener(m2);
    btn2.setActionCommand("GameOver");//设置btn2的执行单击命令后的返回信息
    f.add(btn1,BorderLayout.NORTH);
    f.add(btn2,BorderLayout.CENTER);
     
    f.pack();
    f.setVisible(true);
  }
}
 
class Monitor2 implements ActionListener{
  public void actionPerformed(ActionEvent e){
    System.out.println("a button has been pressed,"+"the relative info is:
"+e.getActionCommand());
    /*使用返回的监听对象e调用getActionCommand()方法获取两个按钮执行单击命令后的返回信息
    根据返回信息的不同区分开当前操作的是哪一个按钮,btn1没有使用setActionCommand()方法设置
    则btn1返回的信息就是按钮上显示的文本*/
  }
}

3.

代码测试###

package cn.javastudy.summary;
 
import java.awt.*;
import java.awt.event.*;
 
public class TestTextField {
  public static void main(String args[]) {
    new MyFrameTextField();
  }
}
 
class MyFrameTextField extends Frame {
  MyFrameTextField() {
    TextField tf = new TextField();
    add(tf);
    tf.addActionListener(new Monitor3());
    tf.setEchoChar('*');
    /*
     * 这个setEchoChar()方法是设置文本框输入时显示的字符,这里设置为*, 
     * 这样输入任何内容就都以*显示出来,不过打印出来时依然可以看到输入的内容
     */
    setVisible(true);
    pack();
  }
}
 
class Monitor3 implements ActionListener {
  /*
   * 接口里面的所有方法都是public(公共的) 
   * 所以从API文档复制void actionPerformed(ActionEvent e)时 要在void前面加上public
   */
  public void actionPerformed(ActionEvent e) {
    /* 事件的相关信息都封装在了对象e里面,通过对象e的相关方法就可以获取事件的相关信息 */
    TextField tf = (TextField) e.getSource();
    /*
     * getSource()方法是拿到事件源,注意:拿到这个事件源的时候,
     * 是把它当作TextField的父类来对待 
     * getSource()方法的定义是:“public Object getSource()”返回值是一个Object对象,
     * 所以要强制转换成TextField类型的对象 
     * 在一个类里面想访问另外一个类的事件源对象可以通过getSource()方法
     */
    System.out.println(tf.getText());// tf.getText()是取得文本框里面的内容
    tf.setText("");// 把文本框里面的内容清空
  }
}

4,

代码测试###

package cn.javastudy.summary;
 
import java.awt.*;
import java.awt.event.*;
 
public class TestMath3 {
 
  public static void main(String args[]) {
    new MyMathFrame().launchFrame();
  }
}
 
class MyMathFrame extends Frame {
  TextField num1, num2, num3;
 
  public void launchFrame() {
    num1 = new TextField(10);
    num2 = new TextField(15);
    num3 = new TextField(15);
    Label lblPlus = new Label("+");
    Button btnEqual = new Button("=");
    btnEqual.addActionListener(new MyMonitor());
    setLayout(new FlowLayout());
    add(num1);
    add(lblPlus);
    add(num2);
    add(btnEqual);
    add(num3);
    pack();
    setVisible(true);
  }
 
  /*
   * 这个MyMonitor类是内部类,它在MyFrame类里面定义 MyFrame类称为MyMonitor类的包装类
   */
  /*
   * 使用内部类的好处: 
   * 第一个巨大的好处就是可以畅通无阻地访问外部类(即内部类的包装类)的所有成员变量和方法 
   * 如这里的在MyFrame类(外部类)定义的三个成员变量num1,num2,num3, 
   * 在MyMonitor(内部类)里面就可以直接访问 
   * 这相当于在创建外部类对象时内部类对象默认就拥有了一个外部类对象的引用
   */
  private class MyMonitor implements ActionListener {
    public void actionPerformed(ActionEvent e) {
      int n1 = Integer.parseInt(num1.getText());
      int n2 = Integer.parseInt(num2.getText());
      num3.setText("" + (n1 + n2));
      num1.setText("");
      num2.setText("");
    }
  }
}

内部类带来的巨大好处是:可以很方便地访问外部类定义的成员变量和方法当某一个类不需要其他类访问的时候就把这个类声明为内部类。####

(一)学习总结##

1.

理解:####

这里的是将表格,内容,按钮,布局里面的内容逐一添加到窗体中,一并给按钮添加监听功能。

2.
监听之后的如果触发源触发相对应的功能按钮,则实现功能。此刻添加列只是一列,添加行就有很多内容了,所以用对象的数组进行包括和添加。所以实际的行数=得到的总行数-1,

3.

最重要的就是多个面板的顺序的问题,我想要在达到登录完成之后的条件之后在进行跳转到另一个面板,所以就是利用定义一个新的 new ChangeTable();放在登录成功之后的条件里面即可进行实现。

4.

分段,就是当dl(登录)按钮实现监听的时候,则验证是否满足要求,当tc(撤销)按钮实现监听的时候,在验证是否满足要求,不这样写也可以,另一种方法则就是让本类去接口本类 implements ACtionListener(){。。。};格式变成了

this.dl.addActionListener(this)和this.tc.addActionListener(this)

(二)实验总结

实验内容:

基本要求:

使用GUI,编写一个宠物商店管理系统实现对宠物信息的统一管理。假设宠物种类有猫、狗,宠物信息包括:编号、品种、年龄、数量、价格。系统启动进入登录界面,登录成功进入管理界面,否则提出错误信息后退出系统。
在管理界面实现以下功能:
(1)显示所有宠物列表
(2)添加宠物到列表
(3)删除宠物
(4)对宠物信息进行修改
(5)退出
功能扩展:
用户分为管理员和普通用户两种,增加普通用户注册功能,增加普通用户界面。
实现以下功能:
(1)显示所有宠物
(2)能够按照品种对宠物进行查找
(3)购买宠物
(4)显示购买清单
(5)退出


程序设计思路:就是分别定义设计两个面板,一个呢是登录的面板,另一个则是进行宠物信息的修改的面板,之后再将他们微妙的进行连接产生关系。

类图结构:

问题1:就是存在两个面板之间的先后顺序的切换的问题
原因:需要登录满足登录成功之后进行切换
解决方案:满足条件之后,把需要切换的面板用格式new 名称();的形式

码云截图###

码云链接:https://git.oschina.net/hebau_cs15/cg.git###

原文地址:https://www.cnblogs.com/chengang4747/p/6820932.html