我正在尝试向JTable添加一个侦听器,以删除选定的行。

我有一个ToolBar类,其中包含所有按钮,
但是我所有的JTable设置都在另一个类上:TablePanel。

我希望能够在用户单击工具栏类中的按钮时删除行。

工具栏

public class ToolBar extends JPanel
{

TablePanel tablePane;

JButton openButton, saveButton, addButton, delButton;
ImageIcon openIcon, saveIcon, addIcon, delIcon;
Image openImage, saveImage, addImage, delImage;
Image openImage2, saveImage2, addImage2, delImage2;

ButtonListener listener;

public ToolBar(TablePanel tablePane)
{

    this.tablePane = tablePane;

    //Bunch of codes here to initialize all the buttons and icons
}

//Button Listener
private class ButtonListener implements ActionListener
{

    public void actionPerformed(ActionEvent event)
    {

        if (event.getSource() == openButton)
            JOptionPane.showMessageDialog(null, "hello");
        if (event.getSource() == saveButton)
            tablePane.saveData();
        if (event.getSource() == addButton)
            tablePane.addRow();
        if (event.getSource() == delButton)
            tablePane.delRow();


    }

}

}


桌面面板

public class TablePanel extends JPanel
{

//Table's column name
private ArrayList<String> columnNames = new ArrayList<String>();


//List of data, later needs to be change
//so that it will be editable on the go
//It starts with 5 columns
//User can add more columns
private ArrayList<Object[]> data = new ArrayList<Object[]>();


//DefaultTableModel is needed for adding new rows
private JTable table;
private TModel tModel;

private JScrollPane scrollPane;

//For importing & exporting data
JFileChooser fileChooser;


public TablePanel()
{

    //Column Names:
    columnNames.add("Date");
    columnNames.add("Category");
    columnNames.add("Details");
    columnNames.add("Add/Subtract");
    columnNames.add("Total");

    //Example data:
    data.add(new Object[]{20140925, "Grocery", "Supermarket", -5.23,600.00});
    data.add(new Object[]{20141013,"Car Maintenance", "Changing Tires", -200.00, 400.00});



        //Some codes here
}
private class TModel extends AbstractTableModel implements TableModelListener
{
    //Bunch of codes(methods) in here such as:
    //public voide setValueAt, public Boolean isCellEditable, getColumnCount etc.
    //Method for deleting row
    public void delRow()
    {

    public void tableChanged(TableModelEvent event)
    {

        int row = event.getFirstRow();
        fireTableRowsDeleted(row, row);
    }

    }


} //End of TModel class



} //End of TablePanel Class


我应该如何实现listener和fireTableDeleted(int row)?
我应该在public void delRow()中添加什么?

最佳答案

有人需要参考别人,但您也想保持一定的隔离度,这样就不会最终将组件紧密耦合在一起

您可以使用某种类型的控制器,该控制器具有对表的引用,并且可以直接侦听工具栏上的按钮,也可以由工具栏调用并指示其要执行的操作。

例如,当单击时,删除按钮将仅指示控制器“删除选定的行”。控制器将要求TablePane“删除所选行”,并且TablePane将遵守。

这可以通过Actions API来实现,其中Action将充当控制器。

基本上,您将创建一个新的DeleteRowAction(这是您必须创建的类),该类具有对TablePane的引用,并将其传递给ToolBar窗格。然后,您将Action应用于删除按钮(JButton#setAction),并让它为您处理其他所有事情

09-26 06:08