I need to display a cell data (20.2,true)
in Jtable in which 20.2 is float and true is a boolean value in the format (20.2,[JCheckBox])
.Is it possible to render 2 different objects in such a manner?
views:
34answers:
1
+2
A:
Yeah it is. But I think u will need a Compound-Renderer, which means you have to create your own CellRenderer extending AbstractDefaultCellRenderer or DefaultCellRenderer. At least as long as you just want to display these values in your table, this should work fine for you.
Your Compound will consist of a Label for displaying your float and a checkbox for displaying your boolean.
EDIT: Ok, here a small example:
/**
* Example for CompoundRenderer
*
* @author ymene
*/
public class CompoundRendererExample extends JPanel
{
public static void main( String[] args )
{
JFrame frame = new JFrame( "Example for rendering JTable - values with CompoundRenderer" );
frame.setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE );
frame.add( new CompundRendererExample() );
frame.pack();
frame.setVisible( true );
}
public CompoundRendererExample()
{
JScrollPane scrollPane = new JScrollPane();
JXTable table;
table = new JXTable( new TableModel() );
table.setFillsViewportHeight( true );
for ( int i = 0; i < table.getModel().getColumnCount(); i++ )
table.getColumn( i ).setPreferredWidth( 200 );
scrollPane.setViewportView( table );
add( scrollPane );
//Declaring compound-renderer
table.setDefaultRenderer( FloatBool.class, new FloatBoolRenderer() );
}
}
class TableModel extends AbstractTableModel
{
private String[] columnNames = { "Float-Boolean" };
private Object[][] data = { { new FloatBool( 2.2f, true ) }, { new FloatBool( 3.2f, false ) } };
public int getColumnCount()
{
return columnNames.length;
}
public int getRowCount()
{
return data.length;
}
@Override
public String getColumnName( int col )
{
return columnNames[ col ];
}
public Object getValueAt( int row, int col )
{
return data[ row ][ col ];
}
@Override
public Class getColumnClass( int c )
{
if ( getValueAt( 0, c ) == null )
return Object.class;
return getValueAt( 0, c ).getClass();
}
@Override
public boolean isCellEditable( int row, int col )
{
return true;
}
@Override
public void setValueAt( Object value, int row, int col )
{
data[ row ][ col ] = value;
fireTableCellUpdated( row, col );
}
}
class FloatBoolRenderer extends DefaultTableCellRenderer
{
JLabel floatPartLabel;
JCheckBox booleanPartCheckBox;
JPanel container;
public FloatBoolRenderer()
{
floatPartLabel = new JLabel();
booleanPartCheckBox = new JCheckBox();
container = new JPanel();
container.setLayout( new BorderLayout() );
container.add( floatPartLabel, BorderLayout.CENTER );
container.add( booleanPartCheckBox, BorderLayout.EAST );
container.setVisible( true );
}
@Override
public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column )
{
if ( value != null )
{
super.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column );
if ( value instanceof FloatBool )
{
FloatBool floatboolean = (FloatBool) value;
booleanPartCheckBox.setSelected( floatboolean.getBooleanValue() );
floatPartLabel.setText( "" + floatboolean.getFloatValue() );
}
}
return container;
}
}
class FloatBool
{
float floatValue;
boolean booleanValue;
public FloatBool( float floatValue, boolean booleanValue )
{
this.floatValue = floatValue;
this.booleanValue = booleanValue;
}
public boolean getBooleanValue()
{
return booleanValue;
}
public float getFloatValue()
{
return floatValue;
}
}
Not perfect yet, but should help ya.
ymene
2010-08-30 07:14:43