gpt4 book ai didi

java - 在同一 JTable 单元格中渲染多个对象

转载 作者:行者123 更新时间:2023-12-02 08:30:14 26 4
gpt4 key购买 nike

我需要显示一个单元格数据(20.2,true)在 Jtable 中,其中 20.2 是 float ,true 是格式为 (20.2,[JCheckBox]) 的 boolean 值.是否可以以这种方式渲染两个不同的对象?

最佳答案

是的。但我认为您将需要一个复合渲染器,这意味着您必须创建自己的 CellRenderer 实现 TableCellRenderer或扩展现有的 DefaultTableCellRenderer 。至少只要您只想在表格中显示这些值,这应该适合您。

您的化合物将包含一个用于显示 float 的标签和一个用于显示 boolean 值的复选框。

编辑:好的,这是一个小例子:

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

尚不完美,但应该可以为您提供如何设计自己的渲染器的想法。

关于java - 在同一 JTable 单元格中渲染多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3598023/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com