Я хотел бы использовать метод внутри моего класса 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 и просто выводить диалоговое окно, если оно не было успешным или что-то в этом роде, потому что методы были бы почти идентичны, поэтому я по сути, у меня есть дополнительный код по не очень хорошей причине.