2016-01-26 3 views
1

Я пытаюсь создать jComboBox в определенной ячейке из jTable. Если в той же строке в столбце 4 вы имеете значение «FN», вы получите в столбце 5 jComboBox с тремя параметрами («SSAA-MM-JJ», «SSAA/MM/JJ», «SAAMMJJ») но все остальные ячейки на столбце 5 должны оставаться нетронутыми, если значение из ячейки в столбце 4 в той же строке не является «FN».Как получить jComboBox в определенной ячейке в jTable?

Что делать неправильно?

Вот что я пробовал:

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

Выход: JComboBox эс на каждую клетку из 5 колонны.

enter image description here

ответ

1

Ваше изображение показывает выход из визуализации ячейки, а не редактор ячейки, так как только один редактор ячейки должен быть виден в любое время. Вы не хотите, чтобы рендер выглядел как JComboBox, а скорее отображался как текст, как метка. Это говорит о других проблемах с вашей программой.

Другие вопросы:

  • Ваш код выше рискует NPE, поскольку lastSelected может быть пустым, когда она начинается.
  • Почему вы проверяете эту строку == 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

Спасибо! Ничего страшного. Я решил это, используя ваш код. –