2016-01-26 58 views
1

我想从jTable的某个单元格中创建一个jComboBox。如果在第4列的同一行上具有值“FN”,则在第5列中将具有带有3个选项(“SSAA-MM-JJ”,“SSAA/MM/JJ”,“SAAMMJJ”)的jComboBox,但如果同一行的第4列上的单元格的值不是“FN”,则第5列上的所有其他单元格都必须保持不变。如何在jTable的某个单元格上获取jComboBox?

我该怎么做?

这里是我已经试过:

package rdjcsv; 

import java.awt.Component; 
import javax.swing.AbstractCellEditor; 
import javax.swing.DefaultCellEditor; 
import javax.swing.JComboBox; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.table.TableCellEditor; 

/** 
* 
* @author acucu 
*/ 
class MyCellEditor extends AbstractCellEditor implements TableCellEditor { 

DefaultCellEditor other = new DefaultCellEditor(new JTextField()); 
DefaultCellEditor checkbox = new DefaultCellEditor(new JComboBox(new Object[] {"abc"})); 

private DefaultCellEditor lastSelected; 

@Override 
public Object getCellEditorValue() { 

    return lastSelected.getCellEditorValue(); 
} 

@Override 
public Component getTableCellEditorComponent(JTable table, 
     Object value, boolean isSelected, int row, int column) { 
    if(column == 4 && table.getValueAt(row, column-1).toString().contains("FN")){ 


    if(row == 0) { 
     lastSelected = checkbox; 
     return checkbox.getTableCellEditorComponent(table, value, isSelected, row, column); 
    } 
    lastSelected = other; 
    return other.getTableCellEditorComponent(table, value, isSelected, row, column); 
} 
    return other.getTableCellEditorComponent(table, value, isSelected, row, column); 
} 

} 

和呼叫:

String[] values = new String[] {"SSAA-MM-JJ", "SSAA/MM/JJ", "SAAMMJJ"}; 
    TableColumn col = jTable1.getColumnModel().getColumn(4); 
col.setCellEditor(new MyComboBoxEditor(values)); 
col.setCellRenderer(new MyComboBoxRenderer(values)); 

输出:从第5列的每一个细胞 的JComboBox ES。

enter image description here

回答

1

您的图片是从单元格渲染器,而不是单元格编辑器的输出,因为只有一个单元格编辑器应该是随时可见。您不希望渲染器看起来像JComboBox,而是将其显示为文本,作为标签。这表明你的程序存在其他问题。

其他问题:

  • 上面你的代码,因为风险一lastSelected NPE可以为空时,它开始了。
  • 你为什么要检查那行== 0?您是否仅为第一行使用JComboBox编辑器?
  • 如果仍然停留发布你的小例子程序,

例如,矿山:

import java.awt.BorderLayout; 
import java.awt.Component; 

import javax.swing.*; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableCellEditor; 

@SuppressWarnings("serial") 
public class ComboEditorEg extends JPanel { 
    private MyTableModel model = new MyTableModel(); 
    private JTable table = new JTable(model); 

    public ComboEditorEg() { 
     for (int i = 0; i < 10; i++) { 
      String textA = i % 2 == 0 ? "SA" : "FN"; 
      String textB = i % 2 == 0 ? "A" : "B"; 

      Object[] row = new String[] { textA, textB }; 
      model.addRow(row); 
     } 

     table.getColumnModel().getColumn(1).setCellEditor(new MyCellEditor()); 

     setLayout(new BorderLayout()); 
     add(new JScrollPane(table)); 
    } 

    private static void createAndShowGui() { 
     ComboEditorEg mainPanel = new ComboEditorEg(); 

     JFrame frame = new JFrame("ComboEditorEg"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> { 
      createAndShowGui(); 
     }); 
    } 
} 

@SuppressWarnings("serial") 
class MyTableModel extends DefaultTableModel { 
    public static final String[] COL_NAMES = { "Foo 1", "Foo 2" }; 

    public MyTableModel() { 
     super(COL_NAMES, 0); 
    } 

    @Override 
    public Class<?> getColumnClass(int columnIndex) { 
     return String.class; 
    } 
} 

@SuppressWarnings("serial") 
class MyCellEditor extends AbstractCellEditor implements TableCellEditor { 

    DefaultCellEditor other = new DefaultCellEditor(new JTextField()); 
    DefaultCellEditor checkbox = new DefaultCellEditor(new JComboBox<String>(new String[] { "abc", 
      "def", "ghi" })); 

    private DefaultCellEditor lastSelected = other; // so it's not null 

    @Override 
    public Object getCellEditorValue() { 

     return lastSelected.getCellEditorValue(); 
    } 

    @Override 
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, 
      int row, int column) { 
     if (table.getValueAt(row, column - 1).toString().contains("FN")) { 
      lastSelected = checkbox; 
      return checkbox.getTableCellEditorComponent(table, value, isSelected, row, column); 
     } 
     return other.getTableCellEditorComponent(table, value, isSelected, row, column); 
    } 

} 
+0

谢谢!没关系。我用你的代码解决了它。 –

相关问题