一、实验项目要求
实验目的
1.熟悉AWT编写图形用户界面程序
2.熟悉AWT事件处理模型、AWT构件库
3.使用Swing编写图形用户界面程序
实验题目
1.形界面中有一个标签、一个文本框和一个按钮,编写程序实现:点击按钮后,将文本的内容取出,作为标签文本复制给标签。
要求:
(1)根据题目要求,选择合适的布局方案,添加相应的组件,完成程序窗口界面的设计。
(2)根据程序的功能,为相应组件添加需要的事件监听者,并对事件做相应的相应处理。
2.用GridLayout的布局方式设计一个界面,如图所示,共八个按钮。当点击有加号的按钮时,则第一排第二个按钮文本变为加号;当点击OK时,将计算的结果添加到第一排最后一个按钮文本中。当点击有*号的按钮时,则第一排第二个按钮文本变为*号;点击OK,将1*4的结果添加到第一排最后一个按钮文本中。
二、实验环境
Eclipse
三、理论分析或算法分析
实验步骤
- 复习有关类的相关内容;
- 根据界面要求,分析需要用到的布局管理器及组件;
- 根据功能要求,分析需要对哪些组件的哪些事件做怎样的响应处理;
- 根据上述分析结果编写代码;
- 调试代码,完善程序。
逻辑分析
问题1:
1.根据题意可以知道,在这个布局管理中需要一个标签,一个文本框,一个复制按钮,当你按按钮的时候,将文本框中的文字复制到标签中;
2.使用Frame的时候,需要关闭窗口这个功能,要特意写一个关闭的监听器,以达到你按关闭按钮的时候可以关闭这个窗口;
3.设置三个类型,Lable标签,TextFiled文本框,Button按钮,对每个器件功能进行编译,首先文本框,设置它的行数和列数,设置当你按复制按钮的时候可以把文本框中的东西复制到标签中,在代码中使用了一个pack() 作用:调整窗口的大小,使其适应组件的大小和布局。如果该窗口或其所有者仍不可显示,则两者在计算首选大小之前变得可显示。在计算首选大小之后,将会验证该Window。窗口自动适应大小,使窗口能正好显示里面所有的控件。
4.使用Panel容器来实现对其他组件的容纳,加入lable和自己输入的内容,合理设
置布局;
问题2:
- 分析问题,可以知道,这是一个需要计算1+4和1*4的计算面板,所以需要一个控制面板,题中要求使用GridLayout的布局方式,在这个布局管理器中不能直接添加组件,需要使用getContenPane()来获取面板,然后在面板中进行添加组件;
- 设置GridLayout布局,根据题意是2行5列,布局为流式布局,根据题意可以看出来1 、4 、=这三个按钮是始终不动的,所以直接把内容添加进去即可,但是* 、+ 、OK这三个按钮就是根据用户的选择,所以这三个按钮就需要变化,这里使用setRolloverEnabled ()来实现图标的变化功能;
- 因为这个按钮的内容是变化的,所以需要为按钮注册监听者对象,以达到你按这个按钮这个按钮可以给你反应,使用addActionListener(this)实现;
- 有+ 、*、OK这三个按钮引起变化,需要判断是哪个按钮造成了结果,设置一个函数来实现此功能。
四、实现方法
问题1
package chaptor;
import java.awt.*;
import java.awt.event.*;
@SuppressWarnings("serial")
public class apperant extends Frame implements ActionListener
{
private Label label = new Label();
private TextField output = new TextField();
private Button copy = new Button("Copy");
private class WindowCloser extends WindowAdapter
{
public void windowClosing(WindowEvent we)
{
System.exit(0);
}
}
public apperant ()
{
super("Copy a String To Label");
setup();
copy.addActionListener(this);
addWindowListener(new WindowCloser());
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == copy)
{
label.setText(output.getText());
}
}
private void setup()
{
Panel textGrid = new Panel();
textGrid.setLayout(new GridLayout(2,1));
textGrid.add(label);
textGrid.add(output);
setLayout(new BorderLayout());
add("Center",textGrid);
add("South",copy);
pack();
setVisible(true);
}
@SuppressWarnings("unused")
public static void main(String[] args) {
apperant cop = new apperant();
}
}
问题2
package chaptor2;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Scanner;
import javax.swing.Action;
import javax.swing.JApplet;
import javax.swing.JButton;
public class Add extends JApplet implements ActionListener{
Container cp = getContentPane();
//创建按钮对象
JButton bt1 = new JButton("");
//创建按钮对象
JButton bt2 = new JButton("");
//创建按钮对象
JButton bt3 = new JButton("+");
//创建按钮对象
JButton bt4 = new JButton("*");
//创建按钮对象
JButton bt5 = new JButton("OK");
public void init() {
//设置GridLayout布局
GridLayout myLayout = new GridLayout(2, 5, 40, 60);
//GridLayout(int rows, int cols, int hgap, int vgap)
cp.setLayout(myLayout);
cp.add(new JButton("1"));
//将按钮图标变化功能打开
bt1.setRolloverEnabled(true);
cp.add(bt1);
cp.add(new JButton("4"));
cp.add(new JButton("="));
//将按钮图标变化功能打开
bt2.setRolloverEnabled(true);
cp.add(bt2);
cp.add(bt3);
//注册bt的监听者对象this
bt3.addActionListener(this);
cp.add(bt4);
//注册bt的监听者对象this
bt4.addActionListener(this);
cp.add(bt5);
//注册bt的监听者对象this
bt5.addActionListener(this);
cp.add(new JButton());
}
public void actionPerformed(ActionEvent e) {
//判断动作事件是否由bt3引发的
if(e.getSource()==bt3) {
bt1.setText("+");
}
//判断动作事件是否由bt4引发的
if(e.getSource()==bt4) {
bt1.setText("*");
}
//判断动作事件是否由bt5引发的
if(e.getSource()==bt5) {
if(bt1.getText()=="+")
bt2.setText("5");
if(bt1.getText()=="*")
bt2.setText("4");
}
}
}
五、实验结果分析
问题1结果
问题2结果
测试中遇到的问题
1.这两个问题是参照网上的代码来实现的,好多内容不是很熟悉,比如容器和组件这里的函数好多自己都不是很熟悉,每个函数的含义不知道啥意思,每次看一个函数需要在网上搜索一下它的含义,感觉书上的知识和自己所要用的东西有些不一样,估计是自己还没有很熟悉每个器件的含义;
2.感觉自己的逻辑不是很好,在使用内部类的时候套用一些函数的时候,自己就不是很能看懂,所以要把这种逻辑多捋一捋,这样才可以更好的编程;
3.使用监听事件的时候不知道哪里该用,哪里需要,对这个部分不是很能理解,自己多看看这个类型的东西可以解决;
4.基础知识不是很稳固,要多加看书,把自己的基本知识搞扎实,多看书;