Napisałem program, który umożliwia dodanie wiersza w tabeli lub usunięcie wybranych. Ale pojawiają się 2 problemy. Dodaję 4 wiersze. Zaznaczam 2, 3 i 4 - klikam "Delete" i usuwa - ale kiedy próbuję zaznaczyć pozostały 1 wiersz wybija exception. Poza tym - tworząc np. 4 wiersze - w każdym wpisuję kolejno 1, 2, 3, 4 w JComboBoxie (w JTextFieldzie też tak działa) - i zaznaczam wiersz 2, usuwam i teraz w miejscu, w którym przed chwilą był wiersz nr 2 powinien być wiersz o nr 3. Ale pozostaje 2 - mimo, że to nie ten wiersz, bo w JTextFieldzie wartość się zmieniła - pod warunkiem, że nie jest właśnie zaznaczony. ALE ! - klikając na nagłówek tabeli (a nazwami kolumn) - 2ka zmienia się już prawidłowo na 3. Mimo to, kiedy próbuje po usunięciu zakodować utratę focusa (2 zakomentowane linie) to już się na 3 nie zmienia i zostaje 2ka, która powinna być usunięta. Ale kiedy kliknie się nie na nagłówek tabeli, ale np. na inną komórkę, to 2-ka też nie zamienia się w 3. O co chodzi ?
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.border.LineBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
class TableDialog extends JDialog
{
private static final long serialVersionUID = 1L;
private DefaultTableModel model;
private JComboBox combo = null;
private JPanel buttons = null;
private JPanel panel = null;
private JScrollPane scroll = null;
private JTable table = null;
private JTextField cell = null;
private TableDialog(JFrame owner, String title)
{
super(owner, title, false);
setContentPane(getPanel());
pack();
setResizable(false);
setVisible(true);
}
private JPanel getPanel()
{
if(panel == null)
{
panel = new JPanel(new BorderLayout());
panel.add(getTable(0), BorderLayout.NORTH);
panel.add(getButtons(), BorderLayout.SOUTH);
}
return panel;
}
private JScrollPane getTable(int rowcount)
{
if(scroll == null)
{
model = new DefaultTableModel(new String[]{"COL1", "COL2"}, rowcount);
table = new JTable(model);
table.setRowSelectionAllowed(true);
cell = new JTextField("0");
cell.setBorder(new LineBorder(Color.black));
combo = new JComboBox(new Object[]{"ELEMENT"});
combo.setEditable(true);
TableColumnModel columnModel = table.getColumnModel();
TableColumn col = null;
DefaultCellEditor cellEditor = new DefaultCellEditor(combo);
cellEditor.setClickCountToStart(0);
col = columnModel.getColumn(0);
col.setCellEditor(cellEditor);
cellEditor = new DefaultCellEditor(cell);
cellEditor.setClickCountToStart(0);
columnModel.getColumn(0).setPreferredWidth(20);
col = columnModel.getColumn(1);
col.setCellEditor(cellEditor);
scroll = new JScrollPane(table);
scroll.setPreferredSize(new Dimension(300, 100));
}
return scroll;
}
private JPanel getButtons()
{
if(buttons == null)
{
JButton add = new JButton("Add");
add.setFont(new Font(add.getFont().getFontName(), Font.BOLD, add.getFont().getSize()));
add.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
addRow();
}
});
JButton delete = new JButton("Delete");
delete.setFont(new Font(delete.getFont().getFontName(), Font.BOLD, delete.getFont().getSize()));
delete.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
removeSelectedRows();
}
});
buttons = new JPanel(new GridLayout());
buttons.add(add);
buttons.add(delete);
}
return buttons;
}
private void addRow()
{
Object[] newRow = new Object[model.getColumnCount()];
for(int col = 0; col < model.getColumnCount(); col++)
newRow[col] = "";
model.addRow(newRow);
}
private void removeSelectedRows()
{
int[] selectedRows = table.getSelectedRows();
for(int i = 0; i < selectedRows.length ; i++)
model.removeRow(table.getSelectedRow());
// variablesTable.clearSelection();
// variablesTable.getCellEditor().stopCellEditing();
}
public static void showTablePane(JFrame owner, String title)
{
new TableDialog(owner, title);
}
}
public class Table extends JFrame
{
private static final long serialVersionUID = 1L;
public static void main(String[] args)
{
TableDialog.showTablePane(null, "Window");
}
}