题目要求
设计如下
- 思路
整体布局采用GridLayout的方式,将界面分为3行,一列(GridLayout(3,1)),顶部布局采用GridLayout(2,2)的方式,包含JLabel标签作为提示,及JTextField输入框。中间布局采用GridLayout(1,2),包含JLabel标签和JTextField,且JTextField不允许用户输入。底部布局采用FlowLayout的方式,包含一个JButton控件。
做一个Rectangle的封装类,含有length和width两个属性,有三个方法:设置length和width,输出周长,输出面积。
给Button添加监听事件,用户未输入数据或输入的数据不完整,监听事件可以直接判断出来,在结果框里显示“请输入数据!”,若输入完整,则在监听事件内给Rectangle类进行赋值后调用Rectangle的周长面积函数来输出。
- 源代码
package GUItest;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class experiment {
public static class Rectangle{//封装的矩形类
private double length;
private double width;
public void setlandw(double l,double w){
length = l;
width = w;
}
public double perimeter(){
return (length+width)*2;
}
public double area(){
return length*width;
}
}
public static class Frame extends JFrame {
//定义三个布局
private JPanel paneltop = new JPanel();
private JPanel panelmiddle = new JPanel();
private JPanel panelbottom = new JPanel();
//定义GUI中要用到的组件
private JLabel labellength = new JLabel("长度:");
private JLabel labelwidth = new JLabel("宽度:");
private JTextField textlength = new JTextField();
private JTextField textwidth = new JTextField();
private JLabel labelresult = new JLabel("结果:");
private JTextField textresult = new JTextField();
private JButton button = new JButton("求值");
// 写监听事件
public class Mybuttonlistener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String l = textlength.getText();//获取两个单行文本中的内容
String w = textwidth.getText();
double length = Double.parseDouble(l);
double width = Double.parseDouble(w);
if(l.isEmpty()||w.isEmpty()){//如果未输入完整则要求输入数据
textresult.setText("请输入正确数据!");
}
else{
Rectangle rectangle = new Rectangle();
rectangle.setlandw(length,width);
textresult.setText("周长为:"+rectangle.perimeter()+"面积为:"+rectangle.area());
}
}
}
//构造函数
Frame() {
setTitle("计算矩形的周长和面积");
setSize(500, 200);
setLocation(400, 400);
// 整体布局
setLayout(new GridLayout(3, 1));
add(paneltop);
add(panelmiddle);
add(panelbottom);
// 顶部布局
paneltop.setLayout(new GridLayout(2, 2));
paneltop.add(labellength);
paneltop.add(textlength);
paneltop.add(labelwidth);
paneltop.add(textwidth);
// 中间布局
panelmiddle.setLayout(new GridLayout(1, 2));
panelmiddle.add(labelresult);
panelmiddle.add(textresult);
textresult.setEditable(false);
// 底部布局
panelbottom.setLayout(new FlowLayout());
panelbottom.add(button);
button.addActionListener(new Mybuttonlistener());
setVisible(true);
}
}
public static void main(String[] args){
Frame frame = new Frame();
}
}
- 测试数据
测试1:
测试2:
测试3:
- 小结
通过这个GUI实验,我理解最多的就是控制文本区域的禁止输入使用setEditable(false);在文本区域输出东西使用setText(“内容”)函数。以及监听事件的具体使用,使用监听事件时候要注意重载,要不然程序就会报错。