Adding jRadioButton into jTable
- If you want to edit the value of a table cell, you must set a
TableCellEditor
. - You should create a single
JRadioButton
in your renderer and reuse it everywhere, that is the purpose of TableCellRenderer. - If you are not calling
super.getTableCellRendererComponent
, it is not need to extendDefaultTableCellRenderer
, simply implementTableCellRenderer
.
Consider reading the JTable tutorial to understand better the concepts of renderers and editors.
EDIT:
Here is an example on how you can make this work. Of course, you'll have to adapt to your model but you should get the gist:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractCellEditor;
import javax.swing.JFrame;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
public class TestTable {
public class RadioButtonCellEditorRenderer extends AbstractCellEditor implements TableCellRenderer, TableCellEditor, ActionListener {
private JRadioButton radioButton;
public RadioButtonCellEditorRenderer() {
this.radioButton = new JRadioButton();
radioButton.addActionListener(this);
radioButton.setOpaque(false);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
radioButton.setSelected(Boolean.TRUE.equals(value));
return radioButton;
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
radioButton.setSelected(Boolean.TRUE.equals(value));
return radioButton;
}
@Override
public void actionPerformed(ActionEvent e) {
stopCellEditing();
}
@Override
public Object getCellEditorValue() {
return radioButton.isSelected();
}
}
private JFrame f;
private JTable table;
private class MyObjectManager {
private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
private List<MyObject> objects = new ArrayList<TestTable.MyObject>();
public void addObject(MyObject object) {
objects.add(object);
object.setManager(this);
propertyChangeSupport.firePropertyChange("objects", null, object);
}
public List<MyObject> getObjects() {
return objects;
}
public void setAsSelected(MyObject myObject) {
for (MyObject o : objects) {
o.setSelected(myObject == o);
}
}
}
private class MyObject {
private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
private MyObjectManager manager;
private String value;
private boolean selected;
public MyObject(String value) {
this.value = value;
}
public PropertyChangeSupport getPropertyChangeSupport() {
return propertyChangeSupport;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
propertyChangeSupport.firePropertyChange("value", null, value);
}
public MyObjectManager getManager() {
return manager;
}
public void setManager(MyObjectManager manager) {
this.manager = manager;
propertyChangeSupport.firePropertyChange("manager", null, manager);
}
public boolean isSelected() {
return selected;
}
public void setSelected(boolean selected) {
if (this.selected != selected) {
this.selected = selected;
if (selected) {
manager.setAsSelected(this);
}
propertyChangeSupport.firePropertyChange("selected", !selected, selected);
}
}
}
protected void initUI() {
MyObjectManager manager = new MyObjectManager();
for (int i = 0; i < 200; i++) {
MyObject object = new MyObject("Row " + (i + 1));
manager.addObject(object);
}
table = new JTable(new MyTableModel(manager));
table.setRowHeight(20);
TableColumn column = table.getColumnModel().getColumn(1);
column.setCellEditor(new RadioButtonCellEditorRenderer());
column.setCellRenderer(new RadioButtonCellEditorRenderer());
f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new JScrollPane(table), BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
public class MyTableModel extends AbstractTableModel implements PropertyChangeListener {
private final MyObjectManager manager;
public MyTableModel(MyObjectManager manager) {
super();
this.manager = manager;
manager.propertyChangeSupport.addPropertyChangeListener(this);
for (MyObject object : manager.getObjects()) {
object.getPropertyChangeSupport().addPropertyChangeListener(this);
}
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getSource() == manager) {
// OK, not the cleanest thing, just to get the gist of it.
if (evt.getPropertyName().equals("objects")) {
((MyObject) evt.getNewValue()).getPropertyChangeSupport().addPropertyChangeListener(this);
}
fireTableDataChanged();
} else if (evt.getSource() instanceof MyObject) {
int index = manager.getObjects().indexOf(evt.getSource());
fireTableRowsUpdated(index, index);
}
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public int getRowCount() {
return manager.getObjects().size();
}
public MyObject getValueAt(int row) {
return manager.getObjects().get(row);
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
switch (columnIndex) {
case 0:
return getValueAt(rowIndex).getValue();
case 1:
return getValueAt(rowIndex).isSelected();
}
return null;
}
@Override
public void setValueAt(Object value, int rowIndex, int columnIndex) {
if (columnIndex == 1) {
getValueAt(rowIndex).setSelected(Boolean.TRUE.equals(value));
}
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex == 1;
}
@Override
public Class<?> getColumnClass(int column) {
switch (column) {
case 0:
return String.class;
case 1:
return Boolean.class;
}
return Object.class;
}
@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return "Value";
case 1:
return "Selected";
}
return null;
}
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException,
UnsupportedLookAndFeelException {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestTable().initUI();
}
});
}
}
Can I add JRadioButton into JTable
It's not clear how you want to use JRadioButton
in a JTable
; consider these alternatives:
Use
SINGLE_SELECTION
mode to select individual rows.table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
Use a column of type
Boolean.class
, which will be rendered using aJCheckBox
. This example limits selections to a single row.Use a
JComboBox
as an editor for mutually exclusive choices within a row.Addendum: If
JRadioButton
is required, they can be added to aJPanel
, as shown in this example due to @mKorbel.Addendum: If each
JRadioButton
has its own column, you can't use aButtonGroup
because a single button is used for all cells having the same renderer. You can update other button(s) in the same row from yourTableModel
, which should overridesetValueAt()
to enforce the single-selection rule that is usually managed by theButtonGroup
. There's an example here.Addendum: This example due to @Guillaume Polet illustrates a way to manage one radio button per row.
jRadioButton value in jTable
bgButtonGroup.getSelection()
this is returning the model of the selected radio button, not the text of it. If you set action command to your radio buttons you can get the text by bgButtonGroup.getSelection().getActionCommand()
. For example after create your yesRadioButton
set "yes" as action command for it with yesRadioButton.setActionCommand("Yes")
.
private void bAdd11ActionPerformed(java.awt.event.ActionEvent evt) {
ErrorMessage.setText("");
DefaultTableModel model3;
model3 = (DefaultTableModel) tblProduct11.getModel();
if(!tfChassi.getText().trim().equals("")){
model3.addRow(new Object[]{
tf1.getText(),
tf2.getText(),
tf3.getText(),
cb1.getSelectedItem().toString(),
cb2.getSelectedItem().toString(),
cb3.getSelectedItem().toString(),
cb4.getSelectedItem().toString(),
tf4.getText(),
tf5.getText(),
bgButtonGroup.getSelection().getActionCommand()
}
);
Insert Radiobuttons in JTable Netbeans
You have to implement TableCellEditor and override getTableCellEditorComponent like this
public java.awt.Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
{
return new JRadioButton();
}
Hope this helps
EDIT:
You can write like this
this.jTable1.getColumnModel().getColumn(0).setCellEditor(new javax.swing.table.TableCellEditor(){
@Override
public java.awt.Component getTableCellEditorComponent(javax.swing.JTable table, java.lang.Object value, boolean isSelected, int row, int column) {
return new javax.swing.JRadioButton();
}
@Override
public java.lang.Object getCellEditorValue() {
return null;//Here you can return the radio button status
}
@Override
public boolean isCellEditable(java.util.EventObject anEvent) {
return false; //uneditable cell
}
@Override
public boolean shouldSelectCell(java.util.EventObject anEvent) {
return false;
}
@Override
public boolean stopCellEditing() {
return true;
}
@Override
public void cancelCellEditing() {
}
@Override
public void addCellEditorListener(javax.swing.event.CellEditorListener l) {
}
@Override
public void removeCellEditorListener(javax.swing.event.CellEditorListener l) {
}
});
You can take out the cell editor implementation to a separate class.
Also you have to set the flags accordingly to your requirement.
Radio button in JTable not working properly
From your illustration, it appears that you want to enforce mutual exclusion among the rows of a JTable
, where each row has a single JRadioButton
. As a ButtonGroup
is unsuitable, this example due to @Guillaume Polet uses a custom manager.
Insert Radiobuttons in JTable Netbeans
You have to implement TableCellEditor and override getTableCellEditorComponent like this
public java.awt.Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
{
return new JRadioButton();
}
Hope this helps
EDIT:
You can write like this
this.jTable1.getColumnModel().getColumn(0).setCellEditor(new javax.swing.table.TableCellEditor(){
@Override
public java.awt.Component getTableCellEditorComponent(javax.swing.JTable table, java.lang.Object value, boolean isSelected, int row, int column) {
return new javax.swing.JRadioButton();
}
@Override
public java.lang.Object getCellEditorValue() {
return null;//Here you can return the radio button status
}
@Override
public boolean isCellEditable(java.util.EventObject anEvent) {
return false; //uneditable cell
}
@Override
public boolean shouldSelectCell(java.util.EventObject anEvent) {
return false;
}
@Override
public boolean stopCellEditing() {
return true;
}
@Override
public void cancelCellEditing() {
}
@Override
public void addCellEditorListener(javax.swing.event.CellEditorListener l) {
}
@Override
public void removeCellEditorListener(javax.swing.event.CellEditorListener l) {
}
});
You can take out the cell editor implementation to a separate class.
Also you have to set the flags accordingly to your requirement.
Related Topics
Spring Scheduling Task - Run Only Once
Calling Base Class Overridden Function from Base Class Method
Spring Choose Bean Implementation at Runtime
Auto Resizing the Jtable Column Widths
Make Simpledateformat.Parse() Fail on Invalid Dates (E.G. Month Is Greater Than 12)
Tomcat 7 "Severe: a Child Container Failed During Start"
How to Stop Parsing Xml Document with Sax at Any Time
Run Java File as Administrator with Full Privileges
Java: How to Split a String by a Number of Characters
Centering Text in a Jtextarea or Jtextpane - Horizontal Text Alignment
Why Does Getrealpath() Return Null When Deployed with a .War File
@Valid When Creating Objects with Jackson Without Controller
Java 8 Chained Method Reference
How to Use Jersey as Jax-Rs Implementation Without Web.Xml
How to Display Bar Value on Top of Bar Javafx