当前位置: 首页 > 知识库问答 >
问题:

向JTable单元格添加JComboBox。所选项目不停留

向实
2023-03-14

我在这里看了几篇文章,但找不到答案。

我已经成功地将JComboBox添加到Jtable单元格中。但是,所选项目没有被“记住”。

更具体地说:

澄清一下,信息并没有丢失。虽然组合框没有直观地显示选择了什么设备,但选择是保存的。然而,我希望用户能够直观地看到他们刚刚选择的内容,而不必再次选择行。

这使我相信我使用的自定义呈现器一定有错误

public class PreDefJobPlanDialogDataTable extends CygnusAbstractTableModel{

 private static final long serialVersionUID = 1344977933386754731L;

 static final ColumnData columns[] = {
    new ColumnData( "Sel." , 25, 10000, JLabel.LEFT),
    new ColumnData( "Type", 25, 10000, JLabel.LEFT),
    new ColumnData( "Status", 25,  10000,JLabel.LEFT ),
    new ColumnData( "Title", 100,  10000,JLabel.LEFT ),
    new ColumnData( "Equipment Class", 50, 10000, JLabel.LEFT),
    new ColumnData( "Equipment", 100, 10000, JLabel.LEFT)
};

...

public boolean isCellEditable(int rowIndex, int columnIndex) {
    boolean ret = false;
    if( columnIndex == 0 || columnIndex == 5 ) {
        ret = true;             
    }
    return ret;
}

...

public Object getValueAt(int rowIndex, int columnIndex) {
    Object ret = " ";

    if( rowIndex >= 0 && rowIndex < getRowCount() ) {
        PreDefJobPlan obj = (PreDefJobPlan)modelData.get( rowIndex );
        switch( columnIndex ) {

            case 0: ret = obj.getGroupFlag();
            break;
            case 1: ret = obj.getType();
            break;
            case 2: ret = obj.getStatus();
            break;
            case 3: ret = obj.getTitle();
            break;
            case 4: ret = obj.getLevel1Area();
            break;
            case 5: ret = obj.getLevel2Area();
            break;
            case 9: ret = obj.getPreDefJobPlanID();
            break;
            default: ret = " ";
        }
    }
    return ret;
}

...

public void setValueAt( Object obj, int row, int col ) {
    // get the object
    PreDefJobPlan o = (PreDefJobPlan) this.modelData.get( row );
    switch( col ) {
        case 0:
            o.setGroupFlag((Boolean) obj);
        break;
        case 5:
            o.setLevel2Area((Equipment) obj);
        break;
        default: ;
    }
}
protected void createTable() {
    PreDefJobPlanDialogDataTable dataModel = new PreDefJobPlanDialogDataTable();
    dataModel.setTimeOffset( 0 );

    this.view.getOrdersTable().setHighlighters(HighlighterFactory.createAlternateStriping());
    this.view.getOrdersTable().setAutoCreateColumnsFromModel( false );
    this.view.getOrdersTable().setModel( dataModel );
    this.view.getOrdersTable().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    this.view.getOrdersTable().setTransferHandler(new TableRowTransferHandler(this.view.getOrdersTable())); 

  for( int i = 0; i < dataModel.getColumnCount(); i++ ) {   
            if( i== 0 ) {
                ...
            }
            else if (i == 5){

                TableCellRenderer renderer = new ComboCellRenderer(); 
                ca.cygnusconsulting.utilities.ColumnData col = dataModel.getColumn( i );
                JComboBox tableCheckBox = new JComboBox();
                tableCheckBox.setModel( lvl1Model );
                tableCheckBox.setAlignmentX(JComboBox.LEFT_ALIGNMENT);
                tableCheckBox.setBackground(this.view.getOrdersTable().getBackground());
                TableCellEditor editor = new ComboBoxCellEditor(tableCheckBox);
                TableColumnExt column = new TableColumnExt( i, col.getWidth(), renderer, editor );
                column.setMaxWidth(col.getMaxWidth());
                this.view.getOrdersTable().addColumn( column ); 
            }
            else{
                ...
            }
        } 

呈现器:

public class ComboCellRenderer extends JComboBox implements TableCellRenderer {

protected static Border noFocusBorder = new EmptyBorder(1,1,1,1);
protected static Border focusBorder = UIManager.getBorder("Table.focusCellHighlightBorder");

 public ComboCellRenderer() {
  super();
  setOpaque(true);

 }

  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
  boolean hasFocus, int row, int column) {

    setBackground(isSelected && !hasFocus ? table.getSelectionBackground() : table.getBackground());
    setForeground(isSelected && !hasFocus ? table.getSelectionForeground() : table.getForeground());
    setFont(table.getFont());
    setSelectedItem(value);

  return this;
  }


}

共有1个答案

端木昱
2023-03-14

通常,您应该使用默认的单元格呈现器来显示您的单元格内容,并且只在编辑时显示组合框。

要理解JTable单元格呈现器的一个关键概念是,单个单元格呈现器通常用于绘制包含相同类型数据的所有单元格。

如果您特别希望组合框用于呈现单元格,则单元格为空的原因是自定义呈现器组合框中没有添加项。您应该使用与单元格编辑器组合框相同的值填充单元格呈现器组合框。

 类似资料:
  • 问题内容: 什么是空指针异常(),什么原因导致它们? 可以使用哪些方法/工具确定原因,以阻止异常导致程序过早终止? 问题答案: 声明引用变量(即对象)时,实际上是在创建指向对象的指针。考虑以下代码,您在其中声明基本类型的变量: 在此示例中,变量是an ,Java会为您初始化它。在第二行为其分配值时,您的值将写入所指的存储位置。 但是,当您尝试声明引用 类型时 ,会发生一些不同的事情。采取以下代码:

  • 我想要一个有4列的jtable。一列必须是组合框。其他列是字符串。 只要找到问题:在注释语句jcb.seteditable(true)时;,如果我在comboxcell上单击一次,它就会打开这个单元格。但我不知道为什么效果更好。此外,我希望combox可编辑。 我怎么能对其他细胞有同样的行为。 再次您好,我已经更新了代码,以便使-如果我通过重写方法在单元格上单击一次,单元格可以编辑-如果我通过重写

  • 我有和我在上编写了以下代码,以从选定项中添加行。 如果用户键入了所需的名称并点击了enter,则必须将其添加到jtable,但它不会添加一行。 我认为事件是原因, 通常我们首先从jComboBox中选择项,然后对 事件(例如JButton)进行编码。 所以在这里,我希望jComboBox中考虑所选项事件被添加到JTable中。 那么对于哪一个事件我必须编写代码或另一种方法来处理呢?

  • 我正在Java创建一个 代码:

  • 我创建了一个表单,其中添加了一个,它有3列。第二列和第三列有编辑器。 我希望当我们选择第二列组合框的第一项时,第三列组合框的第一个组合框也应该被选择,反之亦然。 我该怎么做?

  • 我有一个JTable对象,我会在一个列上添加5个不同的JComboBox。 我已经尽力了: 但这会将相同的JComboBox添加到该列的所有单元格中。如何在同一列中添加不同的内容? 非常感谢。