Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>You'll need to supply you own custom <code>TableCellRenderer</code> that is capable of providing the functionality you want...</p> <p><img src="https://i.stack.imgur.com/nakaT.png" alt="enter image description here"></p> <pre><code>import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.EventQueue; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableModel; public class TestTableRenderer { public static void main(String[] args) { new TestTableRenderer(); } public TestTableRenderer() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { public TestPane() { TableModel model = new AbstractTableModel() { @Override public int getRowCount() { return 2; } @Override public int getColumnCount() { return 1; } @Override public Object getValueAt(int rowIndex, int columnIndex) { return rowIndex == 0 ? true : false; } @Override public Class&lt;?&gt; getColumnClass(int columnIndex) { return Boolean.class; } }; JTable table = new JTable(model); table.setDefaultRenderer(Boolean.class, new CustomBooleanCellRenderer()); setLayout(new BorderLayout()); add(new JScrollPane(table)); } @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } } public class CustomBooleanCellRenderer extends JCheckBox implements TableCellRenderer { private ImageIcon sad; private ImageIcon happy; public CustomBooleanCellRenderer() { try { happy = new ImageIcon(ImageIO.read(getClass().getResource("/Happy.png"))); sad = new ImageIcon(ImageIO.read(getClass().getResource("/Sad.png"))); } catch (IOException ex) { Logger.getLogger(TestTableRenderer.class.getName()).log(Level.SEVERE, null, ex); } } @Override public void setSelected(boolean selected) { super.setSelected(selected); if (selected) { setIcon(happy); } else { setIcon(sad); } } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (value instanceof Boolean) { boolean selected = (boolean) value; setSelected(selected); } return this; } } } </code></pre> <p>Now, you could just as easily use a <code>JLabel</code> or <code>DefaultTableCellRenderer</code>, check the <code>Object</code> value for <code>true</code>/<code>false</code> and set the icon accordingly...but where would the fun be in that ;)</p> <p><strong>Updated to include the editor...</strong></p> <p>I've rearranged the code slightly to include a cell editor...</p> <pre><code>public class CustomCheckBox extends JCheckBox { private ImageIcon sad; private ImageIcon happy; public CustomCheckBox() { try { happy = new ImageIcon(ImageIO.read(getClass().getResource("/Happy.png"))); sad = new ImageIcon(ImageIO.read(getClass().getResource("/Sad.png"))); } catch (IOException ex) { ex.printStackTrace(); } } @Override public void setSelected(boolean selected) { super.setSelected(selected); if (selected) { setIcon(happy); } else { setIcon(sad); } } } public class CustomBooleanCellRenderer extends CustomCheckBox implements TableCellRenderer { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (value instanceof Boolean) { boolean selected = (boolean) value; setSelected(selected); } return this; } } public class CustomBooleanCellEditor extends AbstractCellEditor implements TableCellEditor { private CustomCheckBox editor; public CustomBooleanCellEditor() { editor = new CustomCheckBox(); } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { if (value instanceof Boolean) { boolean selected = (boolean) value; editor.setSelected(selected); } return editor; } @Override public Object getCellEditorValue() { return editor.isSelected(); } } </code></pre> <p>You can apply the in a similar way you did the renderer...</p> <pre><code>table.setDefaultEditor(Boolean.class, new CustomBooleanCellEditor()); </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload