java - 将 JComboBox 添加到 JTable 单元格。所选项目不保留

标签 java swing jtable jcombobox selecteditem

我浏览了这里的一些帖子,但找不到答案。

我已成功将 JComboBox 添加到 Jtable 单元格中。然而,所选项目并未被“记住”。

更具体地说:

1) 从 A 行的组合框中选择一个项目 Step 1

2) 去选择B行的组合框,但是A行的显示项消失了(只要失去焦点,A行组合框的选择就会消失) Step 2

3) 返回 A 行,选择被记住。 Step 3

需要明确的是,信息不会丢失。尽管组合框没有直观地显示选择了什么设备,但选择已保存。但是,我希望用户能够直观地看到他们刚刚选择的内容,而不必再次选择该行。

这让我相信我使用的自定义渲染器一定有错误

以下是相关代码。

TableModel (请注意,Level2Area 相当于 Equipment):

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


}

有人对此有任何合理的建议或见解吗?

最佳答案

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

使用 JTable 单元格渲染器需要理解的一个关键概念是 a single cell renderer is generally used to draw all of the cells that contain the same type of data .

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

关于java - 将 JComboBox 添加到 JTable 单元格。所选项目不保留,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28707028/

相关文章:

java - 如何从 jsoup 请求更改远程 IP 地址?

java - 如何计算选中的 JCheckboxes 的数量?

java - 如何在Java中的按钮中设置单键助记符?

java - 在JTable中显示内存消耗较高的ResultSet

java - 如何让JScrollPane不隐藏JTable?

java - Hibernate 根据日期添加序列

java - 字母顶部的 vector 箭头作为字符或字符串

java - 根据鼠标点击的 x,y 动态更改 JLabel 图标

java - JTable 和 GUI 查询?

java - 如何使 JTable 单元格中的 JButton 可点击?