Как получить экземпляр клиентского класса, из которого модель была создана изнутри AbstractTableModel? - PullRequest
0 голосов
/ 19 апреля 2020

Я хотел бы использовать метод внутри моего класса Client, который является окном GUI, из которого я делаю все свои вещи внутри. У меня есть модель таблицы, которая является экземпляром моей MyTableModel, которая расширяет AbstractTableModel. Дело в том, что мне нужно что-то сделать для изменения jTable, поэтому мне нужно, чтобы метод setValueAt не только изменил этот объект внутри модели таблицы, но и запустил метод из Client, то есть myMethod. Я не могу сделать метод stati c, потому что хочу также изменить метку состояния внутри клиента, из которого создается эта табличная модель, что представляется невозможным из метода stati c.

Это лучшее, что я мог сделать для примера:

Клиент. java:

package javaapplication2;

import java.awt.FlowLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;

public class Client extends JFrame
{
    private JLabel label;

    public Client()
    {
        this.setLayout(new FlowLayout());

        Employee row1 = new Employee(1, "John", 40.0, false);
        Employee row2 = new Employee(2, "Rambo", 70.0, false);
        Employee row3 = new Employee(3, "Zorro", 60.0, true);

        //build the list
        List<Employee> employeeList = new ArrayList<Employee>();
        employeeList.add(row1);
        employeeList.add(row2);
        employeeList.add(row3);

        //create the model
        myTableModel model = new myTableModel(employeeList);
        //create the table
        JTable table = new JTable(model);

        //add the table to the frame
        this.add(new JScrollPane(table));

        label = new JLabel("Status: ");
        this.add(label);

        this.setTitle("Editable Table Example");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       
        this.pack();
        this.setVisible(true);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Client();
            }
        });
    }  

    public void myMethod() {
        label.setText("This will output some information in current client about the status");
        System.out.println("Some method");
    }

}

Сотрудник. java:

package javaapplication2;

public class Employee
{
    private int id;
    private String name;
    private double hourlyRate;
    private boolean partTime;

    public Employee(int id, String name, double hourlyRate, boolean partTime)
    {
        this.id = id;
        this.name = name;
        this.hourlyRate = hourlyRate;
        this.partTime = partTime;
    }

    public int getId()
    {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public double getHourlyRate()
    {
        return hourlyRate;
    }

    public void setHourlyRate(double hourlyRate)
    {
        this.hourlyRate = hourlyRate;
    }

    public boolean isPartTime()
    {
        return partTime;
    }

    public void setPartTime(boolean partTime)
    {
        this.partTime = partTime;
    }

}

myTableModel. java:

package javaapplication2;

import java.util.List;
import javax.swing.table.AbstractTableModel;


import java.util.List;
import javax.swing.table.AbstractTableModel;

public class myTableModel extends AbstractTableModel
{
    private final List<Employee> employeeList;

    private final String[] columnNames = new String[] {
            "Id", "Name", "Hourly Rate", "Part Time"
    };
    private final Class[] columnClass = new Class[] {
        Integer.class, String.class, Double.class, Boolean.class
    };

    public myTableModel(List<Employee> employeeList)
    {
        this.employeeList = employeeList;
    }

    @Override
    public String getColumnName(int column)
    {
        return columnNames[column];
    }

    @Override
    public Class<?> getColumnClass(int columnIndex)
    {
        return columnClass[columnIndex];
    }

    @Override
    public int getColumnCount()
    {
        return columnNames.length;
    }

    @Override
    public int getRowCount()
    {
        return employeeList.size();
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex)
    {
        Employee row = employeeList.get(rowIndex);
        if(0 == columnIndex) {
            return row.getId();
        }
        else if(1 == columnIndex) {
            return row.getName();
        }
        else if(2 == columnIndex) {
            return row.getHourlyRate();
        }
        else if(3 == columnIndex) {
            return row.isPartTime();
        }
        return null;
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex)
    {
        return true;
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex)
    {
        Employee row = employeeList.get(rowIndex);
        if(0 == columnIndex) {
            row.setId((Integer) aValue);
        }
        else if(1 == columnIndex) {
            row.setName((String) aValue);
        }
        else if(2 == columnIndex) {
            row.setHourlyRate((Double) aValue);
        }
        else if(3 == columnIndex) {
            row.setPartTime((Boolean) aValue);
        }

        //I need to run myMethod here on the client from which this current model is from...
        //Client.myMethod();        //this doesnt work.
    }

}

Как я могу запустить myMethod клиента из модели таблицы для того, где эта модель таблицы создается?

Редактировать: Просто для получения дополнительной информации, я не могу действительно отредактировать таблицу, не выполнив сначала myMethod, поэтому я не хочу отрицать изменение, как если бы myMethod сказал, что не удалось выполнить то, что ему нужно делать. Если я просто обнаружу изменение в jTable вместо Client, то по сути я не смогу отрицать изменения в jTable, поэтому то, что у меня есть в таблице, не будет тем, что есть в базе данных (так как myMethod обновляет база данных). Было бы гораздо приятнее, если бы статус был там, чем просто слепо делать это из метода abstractTableModel и просто выводить диалоговое окно, если оно не было успешным или что-то в этом роде, потому что методы были бы почти идентичны, поэтому я по сути, у меня есть дополнительный код по не очень хорошей причине.

...