All Downloads are FREE. Search and download functionalities are using the official Maven repository.

smile.swing.table.ButtonCellRenderer Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2010-2021 Haifeng Li. All rights reserved.
 *
 * Smile is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Smile is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Smile.  If not, see .
 */

package smile.swing.table;

import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

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.Border;
import javax.swing.border.LineBorder;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;



/**
 * The ButtonCellRenderer class provides a renderer and an editor that looks
 * like a JButton. The renderer and editor will then be used for a specified
 * column in the table. The TableModel will contain the String to be displayed
 * on the button.
 * 

* The button can be invoked by a mouse click or by pressing the space bar * when the cell has focus. Optionally a mnemonic can be set to invoke the * button. When the button is invoked the provided Action is invoked. The * source of the Action will be the table. The action command will contain * the model row number of the button that was clicked. * * @author Haifeng Li */ @SuppressWarnings("serial") public class ButtonCellRenderer extends AbstractCellEditor implements TableCellRenderer, TableCellEditor, ActionListener, MouseListener { private JTable table; private transient Action action; private int mnemonic; private Border originalBorder; private Border focusBorder; private JButton renderButton; private JButton editButton; private Object editorValue; private boolean isButtonColumnEditor; /** * Create the ButtonCellRenderer to be used as a renderer and editor. The * renderer and editor will automatically be installed on the TableColumn of * the specified column. * * @param table the table containing the button renderer/editor * @param action the Action to be invoked when the button is invoked * @param column the column to which the button renderer/editor is added */ public ButtonCellRenderer(JTable table, Action action, int column) { this.table = table; this.action = action; renderButton = new JButton(); editButton = new JButton(); editButton.setFocusPainted(false); editButton.addActionListener(this); originalBorder = editButton.getBorder(); setFocusBorder(new LineBorder(Color.BLUE)); TableColumnModel columnModel = table.getColumnModel(); columnModel.getColumn(column).setCellRenderer(this); columnModel.getColumn(column).setCellEditor(this); table.addMouseListener(this); } /** * Get foreground color of the button when the cell has focus * * @return the foreground color */ public Border getFocusBorder() { return focusBorder; } /** * The foreground color of the button when the cell has focus * * @param focusBorder the foreground color */ public void setFocusBorder(Border focusBorder) { this.focusBorder = focusBorder; editButton.setBorder(focusBorder); } public int getMnemonic() { return mnemonic; } /** * The mnemonic to activate the button when the cell has focus * * @param mnemonic the mnemonic */ public void setMnemonic(int mnemonic) { this.mnemonic = mnemonic; renderButton.setMnemonic(mnemonic); editButton.setMnemonic(mnemonic); } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { if (value == null) { editButton.setText(""); editButton.setIcon(null); editButton.setEnabled(true); } else if (value instanceof Icon) { editButton.setText(""); editButton.setIcon((Icon) value); editButton.setEnabled(true); } else { editButton.setText(value.toString()); editButton.setIcon(null); editButton.setEnabled(true); } this.editorValue = value; return editButton; } @Override public Object getCellEditorValue() { return editorValue; } @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")); } if (hasFocus) { renderButton.setBorder(focusBorder); } else { renderButton.setBorder(originalBorder); } if (value == null) { renderButton.setText(""); renderButton.setIcon(null); renderButton.setEnabled(false); } else if (value instanceof Icon) { renderButton.setText(""); renderButton.setIcon((Icon) value); renderButton.setEnabled(true); } else { renderButton.setText(value.toString()); renderButton.setIcon(null); renderButton.setEnabled(true); } return renderButton; } /* * The button has been pressed. Stop editing and invoke the custom Action */ @Override public void actionPerformed(ActionEvent e) { int row = table.convertRowIndexToModel(table.getEditingRow()); fireEditingStopped(); // Invoke the Action ActionEvent event = new ActionEvent( table, ActionEvent.ACTION_PERFORMED, Integer.toString(row)); action.actionPerformed(event); } /* * When the mouse is pressed the editor is invoked. If you then then drag * the mouse to another cell before releasing it, the editor is still * active. Make sure editing is stopped when the mouse is released. */ @Override public void mousePressed(MouseEvent e) { if (table.isEditing() && table.getCellEditor() == this) { isButtonColumnEditor = true; } } @Override public void mouseReleased(MouseEvent e) { if (isButtonColumnEditor && table.isEditing()) { table.getCellEditor().stopCellEditing(); } isButtonColumnEditor = false; } @Override public void mouseClicked(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy