// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.widgets; import java.awt.Color; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.AbstractCellEditor; import javax.swing.Action; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JTable; import javax.swing.UIManager; import javax.swing.border.LineBorder; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; /** * Class based on: http://www.camick.com/java/source/ButtonColumn.java * https://tips4java.wordpress.com/2009/07/12/table-button-column/ * @since 10536 */ public class ButtonColumn extends AbstractCellEditor implements TableCellRenderer, TableCellEditor, ActionListener { private final Action action; private final JButton renderButton; private final JButton editButton; private Object editorValue; private String buttonName; /** * Creates a column that is rendered as a button with no action bound to the click event */ public ButtonColumn() { this(null); } /** * Constructs a new {@code ButtonColumn}. * @param action action * @param buttonName button name */ public ButtonColumn(Action action, String buttonName) { this(action); this.buttonName = buttonName; } /** * Creates a column that is rendered as a button * * @param action action to be performed when button is pressed */ public ButtonColumn(Action action) { this.action = action; renderButton = new JButton(); editButton = new JButton(); editButton.setFocusPainted(false); editButton.addActionListener(this); editButton.setBorder(new LineBorder(Color.BLUE)); } @Override public Object getCellEditorValue() { return editorValue; } @Override public void actionPerformed(ActionEvent e) { this.action.actionPerformed(e); } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { this.editorValue = value; if (buttonName != null) { editButton.setText(buttonName); editButton.setIcon(null); } else if (value == null) { editButton.setText(""); editButton.setIcon(null); } else if (value instanceof Icon) { editButton.setText(""); editButton.setIcon((Icon) value); } else { editButton.setText(value.toString()); editButton.setIcon(null); } this.editorValue = value; return editButton; } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (isSelected) { renderButton.setForeground(table.getSelectionForeground()); renderButton.setBackground(table.getSelectionBackground()); } else { renderButton.setForeground(table.getForeground()); renderButton.setBackground(UIManager.getColor("Button.background")); } renderButton.setFocusPainted(hasFocus); if (buttonName != null) { renderButton.setText(buttonName); renderButton.setIcon(null); } else if (value == null) { renderButton.setText(""); renderButton.setIcon(null); } else if (value instanceof Icon) { renderButton.setText(""); renderButton.setIcon((Icon) value); } else { renderButton.setText(value.toString()); renderButton.setIcon(null); } return renderButton; } }