package org.robotframework.swing.testapp; import java.awt.Component; import java.awt.Dimension; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Arrays; import javax.swing.DefaultCellEditor; import javax.swing.JComboBox; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import org.robotframework.javalib.util.ArrayUtil; @SuppressWarnings("serial") public class TestTable extends JScrollPane { public TestTable(String name, Object[][] data, final JTextField textField) { super(createTable(name, data, textField)); } @Override public Dimension getPreferredSize() { return new Dimension(200, 100); } private static JTable createTable(String name, Object[][] data, final JTextField textField) { JTable table = new JTable(); table.setName(name); table.addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON3) { new TablePopupMenu((JTable) e.getSource(), e.getX(), e.getY()); } } }); table.setModel(new MyTabeModel(data)); TableColumn col = table.getColumnModel().getColumn(0); String[] comboBoxValues = new String[]{"one/one", "two/one", "three/one", "four/one"}; col.setCellEditor(new MyComboBoxEditor(comboBoxValues)); col.setCellRenderer(new MyComboBoxRenderer(comboBoxValues)); table.setCellSelectionEnabled(true); table.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { textField.setText( String.format("%s cell clicked %s times, button: %s modEx: %s", e.getComponent().getName(), e.getClickCount(), e.getButton(), e.getModifiersEx()) ); } }); TableColumn col2 = table.getColumnModel().getColumn(2); col2.setCellRenderer(new CustomRenderer()); return table; } public static class MyComboBoxRenderer extends JComboBox implements TableCellRenderer { public MyComboBoxRenderer(String[] items) { super(items); } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { setSelectedIndex(row); return this; } } static class CustomRenderer extends DefaultTableCellRenderer { public void setValue(Object value) { String s = value.toString(); if (s.equals("four/three!!!")) setText("four/three"); else setText(s); } } public static class MyComboBoxEditor extends DefaultCellEditor { public MyComboBoxEditor(String[] items) { super(new JComboBox(items)); } } private static class TablePopupMenu extends JPopupMenu { private final JTable invoker; public TablePopupMenu(JTable invoker, int x, int y) { this.invoker = invoker; addMenu(getCellCoordinates(x, y)); show(invoker, x, y); } private Point getCellCoordinates(int x, int y) { int columnCount = invoker.getModel().getColumnCount(); int rowCount = invoker.getModel().getRowCount(); int cellX = x / (invoker.getWidth() / columnCount); int cellY = y / (invoker.getHeight() / rowCount); return new Point(cellX, cellY); } private void addMenu(final Point cellCoordinates) { add(new MenuItemWithCommand("Replace text") { public void actionPerformed(ActionEvent e) { invoker.setValueAt("newValue", cellCoordinates.y, cellCoordinates.x); } }); add(new JMenuItem("Disabled menuitem") {{ setEnabled(false); }}); add(new JMenu("Submenu") {{ add(new JMenuItem("Disabled menuitem") {{ setEnabled(false); }}); add(new JMenuItem("Enabled menuitem")); }}); add(new MenuItemWithCommand("Replace text in selected") { public void actionPerformed(ActionEvent e) { int[] cols = invoker.getSelectedColumns(); int[] rows = invoker.getSelectedRows(); for (int col : cols) for (int row : rows) invoker.setValueAt("newValue", row, col); } }); setOpaque(true); setLightWeightPopupEnabled(true); setName("popupMenu"); } } private static class MyTabeModel extends DefaultTableModel { private Object[][] data; public MyTabeModel(Object[][] data) { this.data = data; for (Object[] datarow : data) addColumn(datarow[0], ArrayUtil.copyOfRange(datarow, 1, datarow.length)); } public Class<?> getColumnClass(int col) { return data[col][1].getClass(); } } }