Главная страница
Навигация по странице:

  • MyTableModel

  • jButtonNewPersActionPerformed

  • jButtonIncSalaryActionPerformed

  • Увеличить оклад по рейтингу

  • Самостоятельная работа Java 30. Методические указания студентам по выполнению самостоятельнойкурсовой работы


    Скачать 153.8 Kb.
    НазваниеМетодические указания студентам по выполнению самостоятельнойкурсовой работы
    Дата24.01.2022
    Размер153.8 Kb.
    Формат файлаdocx
    Имя файлаСамостоятельная работа Java 30.docx
    ТипМетодические указания
    #340005
    страница7 из 9
    1   2   3   4   5   6   7   8   9

    Этап 2. Использование таблицы (JTable)


    В существующем приложении для отображения или изменения полей объектов, помещенных в список, используются текстовые поля, при этом пользователю в каждый момент доступен только один объект (мы называем его текущим). Удобно иметь возможность работы сразу с несколькими объектами, такую возможность предоставляет компонент JTable.

    Разработчики JTable создали его на основе принципа «модель-вид-контроллер». Другими словами, это разделило JTable на части таким образом, что одна часть отвечает за способы отображения информации, другая за внешний вид, третья за получение данных.

    Для JTable данные поставляются классом, который называется модель (TableModel). TableModel — это интерфейс, который мы должны реализовать сами в своей собственной модели для JTable. Создадим свою собственную TableModel для JTable.

    Задача следующая. У нас имеется список экземпляров класса «Работник» (Class2). Необходимо отобразить (а также обеспечить изменение полей и выполнение методов) данный список в JTable при помощи TableModel.

    Итак последовательность действий следующая:

    1. Создаем новое приложение на основе существующего;

    2. Удаляем все поля, через которые происходило взаимодействие с полями класса (JtextFieldName, JtextFieldPosition, JtextFieldSalary) и обозначающие их метки.

    3. Удаляем компонент JSpinner. Теперь во фрагментах текста, которые ссылаются на удаленные компоненты, будут выявлены ошибки.

    4. Удаляем все методы связанные с удаленными компонентами, в частности getPerson, setPerson..

    5. Удаляем все ссылки на удаленные методы – теперь ошибок в программе быть не должно

    6. Размещаем на форме компонент JTable, так как это показано на рисунке. (Имя таблицы компонента будет JTable1). Теперь нужно будет написать код, определяющий поведение таблицы, т.е. как информация об объектах отображается в строках таблицы и как объекты получают данные из таблицы.



    1. К определению поля personList добавляем модификатор static, это нужно для того чтобы можно обращаться к статическому полю (в нашем случае personList) используя имя класса (а не объекта).

    static ArrayList personList;

    Обращение к полю personList потребуется , чтобы модель для таблицы имела доступ к списку объектов.

    1. К списку импортированных классов добавляем DefaultTableModel

    import javax.swing.table.DefaultTableModel;

    1. Определим класс MyTableModel, являющийся наследником DefaultTableModel

    class MyTableModel extends DefaultTableModel {

    };

    Теперь нужно дописать все нужные нам методы MyTableModel. Эти методы были изначально определены в родительском классе DefaultTableModel.

    1. Определяем конструктор класса, при создании экземпляра MyTableModel добавим в таблицу столбцы, при этом заполним заголовок для каждого столбца.

    // Добавим столбцы и заполним их шапку

    public MyTableModel() {

    addColumn("Фамилия");

    addColumn("Должность");

    addColumn("Оклад");

    addColumn("Рейтинг");

    }

    1. Определим метод getRowCount(), который задает количество строк таблицы. В нашем случае количество строк равно количеству элементов в списке personList.

    //кол строк

    public int getRowCount() {

    return Example11_30JFrame.personList.size();

    }

    1. Определим метод Object getValueAt(int row, int column), который вернет содержимое ячейки таблицы для каждой заданной строки и столбца. Т.е. Метод getValueAt отвечает за то, какие данные в каких ячейках JTable будут показываться. Данные для отображения извлекаем из полей объектов, хранящихся в списке personList.


    //данные таблицы

    public Object getValueAt(int row, int column){

    switch (column) {

    case 0:

    return Example11_30JFrame.personList.get(row).name;

    case 1:

    return Example11_30JFrame.personList.get(row).position;

    case 2:

    return Example11_30JFrame.personList.get(row).salary;

    case 3:

    return Example11_30JFrame.personList.get(row).rating;

    }

    return "";

    }

    1. Определим метод, обеспечивающий запись данных из таблицы в объект.

    // Изменение элемента

    public void setValueAt(Object o, int i, int i1) {

    switch (i1) {

    case 0: {

    Example11_30JFrame.personList.get(i).name=(String)o;

    break; }

    case 1: {

    Example11_30JFrame.personList.get(i).position=(String)o;

    break; }

    case 2: {

    try {

    Example11_30JFrame.personList.get(i).salary = new Integer((String)o);

    }

    catch (Exception e) {

    Example11_30JFrame.personList.get(i).salary = 0; }

    break; }

    case 3:

    try {

    Example11_30JFrame.personList.get(i).rating = new Integer((String)o); }

    catch (Exception e) {

    Example11_30JFrame.personList.get(i).rating=0; }

    }

    }

    В методе происходит преобразование объекта ( Object) o в строку для записи поля name или в целое число для заполнения полей position, salary или rating . При преобразовании в целое число используется блок try , чтобы обработать исключительную ситуацию, возникающую при попытке выполнить преобразование того, что не является числом, используем блок catch. Внутри этого блока соответствующее поле устанавливаем в нуль.

    Приведем полный текст класса MyTableModel:

    class MyTableModel extends DefaultTableModel {

    // Добавим столбцы и заполним их шапку

    public MyTableModel() {

    addColumn("Фамилия");

    addColumn("Должность");

    addColumn("Оклад");

    addColumn("Рейтинг");

    }

    //кол строк

    public int getRowCount() {

    return Example11_30JFrame.personList.size();

    }

    //данные таблицы

    public Object getValueAt(int row, int column){

    switch (column) {

    case 0:

    return Example11_30JFrame.personList.get(row).name;

    case 1:

    return Example11_30JFrame.personList.get(row).position;

    case 2:

    return Example11_30JFrame.personList.get(row).salary;

    case 3:

    return Example11_30JFrame.personList.get(row).rating;

    }

    return "";

    }

    // Изменение элемента

    public void setValueAt(Object o, int i, int i1) {

    switch (i1) {

    case 0: {

    Example11_30JFrame.personList.get(i).name=(String)o;

    break; }

    case 1: {

    Example11_30JFrame.personList.get(i).position=(String)o;

    break; }

    case 2: {

    try {

    Example11_30JFrame.personList.get(i).salary = new Integer((String)o);

    }

    catch (Exception e) {

    Example11_30JFrame.personList.get(i).salary = 0; }

    break; }

    case 3:

    try {

    Example11_30JFrame.personList.get(i).rating = new Integer((String)o); }

    catch (Exception e) {

    Example11_30JFrame.personList.get(i).rating=0; }

    }

    }

    }

    1. В конструкторе Example11_30JFrame создадим экземпляр класса MyTableModel

    model = new MyTableModel()

    1. Назначим созданную нами модель в качестве модели для таблицы jTable1

    jTable1.setModel(model);

    1. Теперь нужно изменить реакцию на нажатие кнопок. В обработчики для реакции на нажатие кнопок, которые создают или удаляют объекты класса, вставляем строку для обновления таблицы. Метод jTable1.getSelectedRow() возвращает номер выделенной строки таблицы.


    private void jButtonNewPersActionPerformed(java.awt.event.ActionEvent evt) {

    personList.add(new Class2());
    jTable1.updateUI(); //обновить таблицу

    }
    private void jButtonDelPersActionPerformed(java.awt.event.ActionEvent evt) {

    try {

    personList.remove(jTable1.getSelectedRow());

    jTable1.updateUI();} //обновить таблицу }

    catch (Exception e) {}

    }

    Изменяем реализацию выполнения методов обработки данных Class1/ Class2:

    Код, обеспечивающий выполнение функции-метода 1 обработки данных класса-родителя для кнопки "Увеличить оклад" ( JButtonIncSalary):

    private void jButtonIncSalaryActionPerformed(java.awt.event.ActionEvent evt) {

    //метод для текущего объекта

    personList.get(jTable1.getSelectedRow()).incSalary();

    jTable1.updateUI(); //обновить таблицу

    }

    Обработчик события для кнопки "Иванвинженеры" (JButtonPosition2Engieer):

    private void jButtonPosition2EngineerActionPerformed(java.awt.event.ActionEvent evt) {

    //метод для всех объектов из списка

    for (int i = 0; i < personList.size(); i++) {

    if (personList.get(i).name.toUpperCase().startsWith("ИВАН")) {

    personList.get(i).Position2Engieer();

    }

    }

    jTable1.updateUI(); //обновить таблицу

    }

    Обработчик события для кнопки "Увеличить оклад по рейтингу" (JbuttonChngRating):

    private void jButtonChngRatingActionPerformed(java.awt.event.ActionEvent evt) {

    //метод для всех объектов из списка

    for (int i = 0; i < personList.size(); i++) {

    personList.get(i).chngSalary();

    }

    jTable1.updateUI(); //обновить таблицу

    }


    1   2   3   4   5   6   7   8   9


    написать администратору сайта