/* * JTableButtonMouseListener.java * * This code was found at http://www.devx.com/getHelpOn/10MinuteSolution/20425. * It was written by Daniel F. Savarese. * * I, Catherine Fitzpatrick, have made a trivial change by adding a subclass * of JTable for easier use of the code. */ package shoddybattleclient.utils; import java.awt.Color; import javax.swing.*; import javax.swing.table.*; import java.awt.event.*; import java.awt.Component; /** * * @author Daniel F. Savarese * @author Catherine James Fitzpatrick */ public class JButtonTable extends SortableJTable { /** * Set up this table so that it can be used to render JButtons in cells. */ public JButtonTable() { setDefaultRenderer(String.class, new RightAlignRenderer()); setDefaultRenderer(JButton.class, new JTableButtonRenderer( getDefaultRenderer(JButton.class))); JTableButtonMouseListener listener = new JTableButtonMouseListener(this); addMouseListener(listener); addMouseMotionListener(listener); } } /** * Renders components that are numerical or --- to be right aligned * @author Benjamin Gwin */ class RightAlignRenderer implements TableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object val, boolean isSelected, boolean hasFocus, int row, int column) { JLabel label = new JLabel(val.toString()); label.setFont(label.getFont().deriveFont(12.0f)); if ((val instanceof Integer) || "---".equals(val)) { label.setHorizontalAlignment(JLabel.RIGHT); } label.setForeground(table.getForeground()); return label; } } /** * * @author Daniel F. Savarese */ class JTableButtonRenderer implements TableCellRenderer { private TableCellRenderer __defaultRenderer; public JTableButtonRenderer(TableCellRenderer renderer) { __defaultRenderer = renderer; } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (value instanceof Component) { return (Component) value; } return __defaultRenderer.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column); } } /** * * @author Daniel F. Savarese */ class JTableButtonMouseListener implements MouseListener, MouseMotionListener { private JTable __table; private JButton previousButton; private JButton __getButton(MouseEvent e) { TableColumnModel columnModel = __table.getColumnModel(); int column = columnModel.getColumnIndexAtX(e.getX()); int row = e.getY() / __table.getRowHeight(); Object value; if (row >= __table.getRowCount() || row < 0 || column >= __table.getColumnCount() || column < 0) { return null; } value = __table.getValueAt(row, column); if (!(value instanceof JButton)) return null; return (JButton) value; } public JTableButtonMouseListener(JTable table) { __table = table; } public void mouseClicked(MouseEvent e) { JButton button = __getButton(e); if(button == null) return; MouseEvent buttonEvent = (MouseEvent) SwingUtilities.convertMouseEvent(__table, e, button); button.dispatchEvent(buttonEvent); __table.repaint(); } public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) { if(previousButton != null) { previousButton.dispatchEvent(new MouseEvent(previousButton, MouseEvent.MOUSE_EXITED, e.getWhen(), e.getModifiers(), 5, 5, 0, false)); } previousButton = null; __table.repaint(); } public void mousePressed(MouseEvent e) { mouseClicked(e); } public void mouseReleased(MouseEvent e) { mouseClicked(e); } public void mouseDragged(MouseEvent e) {} public void mouseMoved(MouseEvent e) { JButton button = __getButton(e); if(button == previousButton) return; if(previousButton != null) { previousButton.dispatchEvent(new MouseEvent(previousButton, MouseEvent.MOUSE_EXITED, e.getWhen(), e.getModifiers(), 5, 5, 0, false)); } if (button != null) { button.dispatchEvent(new MouseEvent(button, MouseEvent.MOUSE_ENTERED, e.getWhen(), e.getModifiers(), 5, 5, 0, false)); } __table.repaint(); previousButton = button; } }