package org.droiddraw.gui; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; public abstract class AbstractDataPanel extends JPanel { private static final long serialVersionUID = 1L; private class DataTableModel extends AbstractTableModel { private static final long serialVersionUID = 1L; private Class<?>[] classes; public DataTableModel(Class<?>[] classes) { this.classes = classes; } public int getColumnCount() { return classes.length; } @Override public boolean isCellEditable(int row, int col) { return true; } @Override public Class<?> getColumnClass(int col) { return classes[col]; } @Override public String getColumnName(int col) { if (col == 0) { return "Name"; } else { return "Value"; } } public int getRowCount() { return parentRowCount(); } public Object getValueAt(int row, int col) { return parentValueAt(row, col); } @Override public void setValueAt(Object value, int rowIndex, int columnIndex) { parentSetValueAt(value, rowIndex, columnIndex); this.fireTableCellUpdated(rowIndex, columnIndex); } public void deleteRow(int row) { parentDeleteRow(row); this.fireTableDataChanged(); } } Dimension d; JTable dataTable; JButton save; JButton create; JButton delete; DataTableModel model; public AbstractDataPanel(Class<?>[] classes) { d = new Dimension(500, 300); model = new DataTableModel(classes); dataTable = new JTable(model); dataTable.setShowHorizontalLines(true); // dataTable.setShowGrid(true); setLayout(new BorderLayout()); add(new JScrollPane(dataTable), BorderLayout.CENTER); // add(dataTable.getTableHeader(), BorderLayout.NORTH); JPanel jp = new JPanel(); jp.setLayout(new FlowLayout()); JButton save; JButton create; JButton delete; save = new JButton("Save"); save.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { doSave(); } }); create = new JButton("New"); create.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String name = JOptionPane.showInputDialog(dataTable, "Enter a name for this new value:"); if (name != null) { addValue(name); model.fireTableDataChanged(); } } }); delete = new JButton("Delete"); delete.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int row = dataTable.getSelectedRow(); model.deleteRow(row); } }); jp.add(save); jp.add(create); jp.add(delete); add(jp, BorderLayout.SOUTH); } @Override public Dimension getPreferredSize() { return d; } @Override public Dimension getMinimumSize() { return d; } protected abstract int parentRowCount(); protected abstract Object parentValueAt(int row, int col); protected abstract void parentSetValueAt(Object value, int rowIndex, int columnIndex); protected abstract void parentDeleteRow(int row); protected abstract void doSave(); protected abstract void addValue(String name); }