将Jbutton添加到JTable

需要一个简单的Swing代码来演示如何使用tablecellrenderer和tablecelleditor在Jtable的列中添加一个按钮。

JTable添加按钮

 JTable table = new JTable(new JTableModel()); JScrollPane scrollPane = new JScrollPane(table); table.setFillsViewportHeight(true); TableCellRenderer buttonRenderer = new JTableButtonRenderer(); table.getColumn("Button1").setCellRenderer(buttonRenderer); table.getColumn("Button2").setCellRenderer(buttonRenderer); 

示例JTableModel ,这是管理列和行,设置组件

 public static class JTableModel extends AbstractTableModel { private static final long serialVersionUID = 1L; private static final String[] COLUMN_NAMES = new String[] {"Id", "Stuff", "Button1", "Button2"}; private static final Class[] COLUMN_TYPES = new Class[] {Integer.class, String.class, JButton.class, JButton.class}; @Override public int getColumnCount() { return COLUMN_NAMES.length; } @Override public int getRowCount() { return 4; } @Override public String getColumnName(int columnIndex) { return COLUMN_NAMES[columnIndex]; } @Override public Class getColumnClass(int columnIndex) { return COLUMN_TYPES[columnIndex]; } @Override public Object getValueAt(final int rowIndex, final int columnIndex) { /*Adding components*/ switch (columnIndex) { case 0: return rowIndex; case 1: return "Text for "+rowIndex; case 2: // fall through /*Adding button and creating click listener*/ case 3: final JButton button = new JButton(COLUMN_NAMES[columnIndex]); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { JOptionPane.showMessageDialog(JOptionPane.getFrameForComponent(button), "Button clicked for row "+rowIndex); } }); return button; default: return "Error"; } } } 

示例Button click listener ,用于管理在组件上单击鼠标的时间

 private static class JTableButtonMouseListener extends MouseAdapter { private final JTable table; public JTableButtonMouseListener(JTable table) { this.table = table; } public void mouseClicked(MouseEvent e) { int column = table.getColumnModel().getColumnIndexAtX(e.getX()); // get the coloum of the button int row = e.getY()/table.getRowHeight(); //get the row of the button /*Checking the row or column is valid or not*/ if (row < table.getRowCount() && row >= 0 && column < table.getColumnCount() && column >= 0) { Object value = table.getValueAt(row, column); if (value instanceof JButton) { /*perform a click event*/ ((JButton)value).doClick(); } } } } 

示例JTable Cell Renderer,管理单元组件

 private static class JTableButtonRenderer implements TableCellRenderer { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { JButton button = (JButton)value; return button; } } 

这是一个非常好的例子,它将JButton添加到JTable一个单元格:

在此处输入图像描述

 import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.DefaultCellEditor; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; public class JButtonTableExample { public JButtonTableExample() { JFrame frame = new JFrame("JButtonTable Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); DefaultTableModel dm = new DefaultTableModel(); dm.setDataVector(new Object[][]{{"button 1", "foo"}, {"button 2", "bar"}}, new Object[]{"Button", "String"}); JTable table = new JTable(dm); table.getColumn("Button").setCellRenderer(new ButtonRenderer()); table.getColumn("Button").setCellEditor(new ButtonEditor(new JCheckBox())); JScrollPane scroll = new JScrollPane(table); table.setPreferredScrollableViewportSize(table.getPreferredSize());//thanks mKorbel +1 http://stackoverflow.com/questions/10551995/how-to-set-jscrollpane-layout-to-be-the-same-as-jtable table.getColumnModel().getColumn(0).setPreferredWidth(100);//so buttons will fit and not be shown butto.. frame.add(scroll); frame.pack(); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new JButtonTableExample(); } }); } } class ButtonRenderer extends JButton implements TableCellRenderer { public ButtonRenderer() { setOpaque(true); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (isSelected) { setForeground(table.getSelectionForeground()); setBackground(table.getSelectionBackground()); } else { setForeground(table.getForeground()); setBackground(UIManager.getColor("Button.background")); } setText((value == null) ? "" : value.toString()); return this; } } class ButtonEditor extends DefaultCellEditor { protected JButton button; private String label; private boolean isPushed; public ButtonEditor(JCheckBox checkBox) { super(checkBox); button = new JButton(); button.setOpaque(true); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { fireEditingStopped(); } }); } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { if (isSelected) { button.setForeground(table.getSelectionForeground()); button.setBackground(table.getSelectionBackground()); } else { button.setForeground(table.getForeground()); button.setBackground(table.getBackground()); } label = (value == null) ? "" : value.toString(); button.setText(label); isPushed = true; return button; } @Override public Object getCellEditorValue() { if (isPushed) { JOptionPane.showMessageDialog(button, label + ": Ouch!"); } isPushed = false; return label; } @Override public boolean stopCellEditing() { isPushed = false; return super.stopCellEditing(); } } 

参考文献: