Реализовать кнопки для обработки строк в JTable на основе ActionListener - Java
Формулировка задачи:
Помогите пожалуйста. Мне нужно реализовать кнопки с помощью ActionListener. 1.Добавить(нужно добавить строку). 2.Удалить(удалить выделенную строку) 3.Очистить(все очистить). Пыталась что-то сделать сама, при нажатии на кнопку выдает ошибку : Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: table.TableModel cannot be cast to javax.swing.table.DefaultTableModel
package table;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class TableImplementation extends JFrame{
private static final long seriaVersionUID = 2269971701250845501L;
private String title;
private Dimension d;
JButton button1= new JButton("Добавить");
JButton button2= new JButton("Удалить");
JButton button3= new JButton("Очистить");
public TableImplementation(String title, Dimension d){
this.title = title;
this.d = d;
}
public void init(){
setTitle(title);
setSize(d);
setLayout(new GridBagLayout());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
button2.addActionListener(new Button2ActionListener());//по нажатию на кнопку button1 выполняется метод Button1ActionListener
button3.addActionListener(new Button3ActionListener());
TableModel tm = new TableModel();
JTable table = new JTable(tm);//создаем таблицу и у нее модель tm
JScrollPane tableSkroll = new JScrollPane(table);//Этот класс описывает прокрутку
tableSkroll.setPreferredSize(new Dimension(400,400));//создали размеры таблицы
String [] str = new String [4];//добавляе данные в строку
str[0]="0";
str[1]="Название книги";
str[2]="45689";
str[3]="Описание книги";
for(int i=0;i<100;i++)tm.addDate(str);// в классе TableModel (tm) мы описали метод addDate, вот в него и добавляем нашу строку
add (tableSkroll,new GridBagConstraints(0,0,3,1,1,1,GridBagConstraints.NORTH,GridBagConstraints.BOTH,new Insets(1,1,1,1),0,0));
add ( button1,new GridBagConstraints(0,1,1,1,1,1,GridBagConstraints.NORTH,GridBagConstraints.HORIZONTAL,new Insets(1,1,1,1),0,0));
add ( button2,new GridBagConstraints(1,1,1,1,1,1,GridBagConstraints.NORTH,GridBagConstraints.HORIZONTAL,new Insets(1,1,1,1),0,0));
add ( button3,new GridBagConstraints(2,1,1,1,1,1,GridBagConstraints.NORTH,GridBagConstraints.HORIZONTAL,new Insets(1,1,1,1),0,0));
setVisible(true);
pack();
}
public class Button2ActionListener implements ActionListener{//вешаем слушателя на кнопку button1
TableModel tm = new TableModel();
JTable table = new JTable(tm);//
@Override
public void actionPerformed(ActionEvent event) {
if(event.getSource()instanceof JButton){
int sel =table.getSelectedRow();// или номер строки
DefaultTableModel model = (DefaultTableModel)table.getModel();
model.removeRow(sel);
}
}
}
public class Button3ActionListener implements ActionListener{//вешаем слушателя на кнопку button1
TableModel tm = new TableModel();
JTable table = new JTable(tm);//
@Override
public void actionPerformed(ActionEvent event) {
if(event.getSource()instanceof JButton){
DefaultTableModel model = (DefaultTableModel)table.getModel();
while (model.getRowCount()>0) {
model.removeRow(0);
}
}
}
}
}
package table;
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
public class TableModel extends AbstractTableModel[/B][/B]{//модель таблицы описывается вспомощью класса AbstractTableModel
private int columnCount = 4;
private ArrayList<String[]>dataArrayList;//в dataArrayList будут храниться данные таблицы
public TableModel(){
dataArrayList=new ArrayList<String[]>();
for(int i =0; i<dataArrayList.size();i++){
dataArrayList.add(new String[getColumnCount()]);//добавили кол-во колонок в dataArrayList
}
}
@Override
public int getRowCount() {//кол-во строк
return dataArrayList.size();//метод возвращает кол-во строк(кол-во строк в таблице=столько, сколько данных было занесено в ArrayList<String[]>
}
@Override
public int getColumnCount() {//кол-во колонок
return columnCount;
}
@Override
public String getColumnName(int columnIndex){//получили название итой колонки
switch(columnIndex){
case 0:return "#id";
case 1:return "title";
case 2:return "isbn";
case 3:return "desciption";
}
return "";
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {//возвращает определенное значение в определенной ячейки
String []rows = dataArrayList.get(rowIndex);//по индексу возвращает элемент нашей коллекции
return rows[columnIndex];//получаем итую колонку(ту колонку, которую передали по параметрам конструктора)
//получили итый столбец rowIndex, итой строки columnIndex и вернули его
}
public void addDate(String[]row){//метод который будет добавлять данные в таблицу, передаем массив строк для каждой ячейки
String [] rowTable = new String[getColumnCount()];
rowTable=row;//создали 1 массив и ему будем присваивать
dataArrayList.add(rowTable);//добавили 1 элемент таблицы, это 1 строка
}
}Решение задачи: «Реализовать кнопки для обработки строк в JTable на основе ActionListener»
textual
Листинг программы
public class Button2ActionListener implements ActionListener{//вешаем слушателя на кнопку button1
@Override
public void actionPerformed(ActionEvent event) {
if(event.getSource()instanceof JButton){
int sel =table.getSelectedRow();//получаем номер выделенной строки
tm.dataArrayList.remove(sel);//удаляем данную позицию из ArrayList в TableModel
tm.fireTableDataChanged();//обновляем таблицу
}
}
}