Визуализация более одного объекта в одной ячейке JTable - PullRequest
0 голосов
/ 30 августа 2010

Мне нужно отобразить данные ячейки (20.2,true) в Jtable, в котором 20.2 - это число с плавающей запятой, а true - логическое значение в формате (20.2,[JCheckBox]). Можно ли таким образом отобразить 2 разных объекта?

1 Ответ

2 голосов
/ 30 августа 2010

Да, это так. Но я думаю, что вам понадобится Compound-Renderer, что означает, что вам нужно создать свой собственный CellRenderer, реализующий TableCellRenderer или расширяющий существующий DefaultTableCellRenderer . По крайней мере, до тех пор, пока вы просто хотите отобразить эти значения в своей таблице, это должно работать для вас.

Ваше соединение будет состоять из метки для отображения вашего числа с плавающей запятой и флажка для отображения вашего логического значения.

EDIT: Хорошо, вот небольшой пример:

/**
 * 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;
  }
}

Пока не идеально, но он должен дать вам идеи, как создать свой собственный рендер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...