实例5用动态数组储存学生姓名

/ java精彩编程200例 / 没有评论 / 60浏览


实例005.实例5用动态数组储存学生姓名

这个因为要用到可视化窗体那种开发,c#以前用过,在Eclipse上用java搞这个着实让我迷了.......

先说说思路:

1.创建JFrmae类,明确必需的组件有什么:(1)“学生姓名”label”,(2)“添加学生”button1,(3)“删除学生”button2,(4)用于输入学生姓名的textField,(5)用于显示输入姓名的list,这是最关键的五个组件。明确本例中重要的动态数组要贯穿(2)(3)(4)(5)组件

2.确定上述五个组件的具体功能代码,并将它们联系起来,这个过程会用到其他组件来优化它们的功能:JPanel(面板容器用于布局)、JScrollPane(页面滚动用于保证窗口内容可完全显示)。

具体代码如下,我也很懵懂,感觉这种窗口化的编程是java的另一种新天地,广阔而又蔚蓝......

源代码如下:

package java05;

import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.List; import java.awt.Panel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList;

import javax.swing.AbstractListModel; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.border.EmptyBorder;

public class DynamicArray extends JFrame { private JPanel contentPane;//创建JPanel类,用来组织组件,合理布局

private static final long serialVersionUID = 1L;    //不知道啥意思,百度看不懂
private JTextField textField;     //输入姓名的文本框    
private ArrayList<String> arraylist = new ArrayList<String>();//存储输入姓名的集合    
private JList<String> list;       //创建列表控件

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {//事件分配线程
        public void run() {
            try {
                DynamicArray frame = new DynamicArray();//创建对象,构造函数启动
                frame.setVisible(true);//窗口可见
            } catch (Exception e) {//捕获异常
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public DynamicArray() {        //构造函数   初始化JFrame对象
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭这个框架时的响应动作(简单退出)
    setBounds(100, 100, 450, 332);//设置窗口的位置与尺寸
    contentPane = new JPanel();//代码一开始已创建对象,但没有初始化(把对象的创建放到前边是为了方便同一个类中各个方法对其的调用)
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));//contentPane内部边框为空,并且有5个像素的厚度
    setTitle("用动态数组保存学生姓名");//窗口顶部的标题
    contentPane.setLayout(null);//初始化JPanle的页面布局为null,这样我们就可以自己随意布局了
    setContentPane(contentPane);//将contentPane添加到界面中

    JScrollPane scrollPane = new JScrollPane();//滚动面板
    contentPane.add(scrollPane,BorderLayout.CENTER);//添加滚动面板,并且使布局居中
    scrollPane.setBounds(10, 10, 300, 280);//设置位置和长宽

    list = new JList<String>();//代码一开始已创建对象,但没有初始化(把对象的创建放到前边是为了方便同一个类中各个方法对其的调用)
    scrollPane.setViewportView(list);//创建一个视口(如果有必要)并设置其视图。(不懂)

    final JPanel panel = new JPanel();//面板容器类
    scrollPane.setColumnHeaderView(panel);//创建一个列标题视口(如果有必要),设置其视图然后将此列标题视口添加到滚动窗格(不懂)

    final JLabel label = new JLabel("学生姓名:");//创建标签
    panel.add(label);

    textField = new JTextField();//代码一开始已创建对象,但没有初始化(把对象的创建放到前边是为了方便同一个类中各个方法对其的调用)
    textField.setColumns(10);//设宽度,每个单位宽度等于当前字体下 'm' 字符的宽度10 就是:10 * 这个单位宽度,输入文本框的初始宽度
    panel.add(textField);

    final JButton button1 = new JButton();//创建按钮1
    button1.setBounds(320, 10, 100, 30);//位置宽高
    button1.setText("添加学生");//按钮上所显示文本
    button1.addActionListener(new ActionListener() {//添加事件监听            
        @Override
        public void actionPerformed(ActionEvent e) {//点击按钮触发(重写)
            do_button1_actionPerformed(e);//调用该方法,方法在下边
        }
    });
    contentPane.add(button1);//将按钮1加入

    final JButton button2 = new JButton();//创建按钮2
    button2.setBounds(320, 60, 100, 30);//位置宽高
    contentPane.add(button2);//将按钮1加入
    button2.setText("删除学生");//按钮上所显示文本
    button2.addActionListener(new ActionListener() {//添加事件监听                
        @Override
        public void actionPerformed(ActionEvent e) {//点击按钮触发(重写)
            do_button2_actionPerformed(e);//调用该方法
        }
    });
}

protected void do_button1_actionPerformed(ActionEvent e) {
    textField.requestFocusInWindow();//为文本框初始化一个输入焦点,也就是说当生成窗口时,不需要用鼠标点击文本框就可以在该文本框中输入数值
    textField.selectAll();//选择文本框中输入的全部文本,准备下次输入
    String text = textField.getText();//获得文本框输入的内容
    if (text.isEmpty()) {//如果文本框为空,无返回值
        return;
    }        
    arraylist.add(text);//动态数组加入文本
    repalceModel();//调用方法 ?问什么可以直接调用
}

protected void do_button2_actionPerformed(ActionEvent e) {
    Object value = list.getSelectedValue();//获得鼠标选定的列表中的数据
    arraylist.remove(value);//删除数据      
    repalceModel();//调用方法 ?问什么可以直接调用
}

private void repalceModel() {
    list.setModel(new AbstractListModel() {//为列表控件设置数据模型,用于显示数组几何中的数据
        private static final long serialVersionUID = -3406879889366471211L;//不知道啥意思,百度看不懂
        @Override
        public int getSize() {//得到动态数组的长度,用于按钮1和按钮2进行操作将动态数组长度改变后再次确定新的长度
            return arraylist.size();
        }
        @Override
        public Object getElementAt(int index) {//获得动态数组中特定索引位置的数据值
            return arraylist.get(index);
        }

    });
}

}

为方便理解,下图为各个组件目录结构:


程序实现-添加学生姓名:


程序实现-删除学生姓名: