2015-01-08 5 views
0

У меня есть объект JTable, и я бы добавил 5 разных JComboBox на один столбец.JComboBox на ячейке JTable

Я так пробовал:

table.getColumnModel().getColumn(3).setCellEditor(new DefaultCellEditor(jcombo)); 

, но это добавить тот же JComboBox ко всем клеткам этого столбца. Как я могу сделать, чтобы добавить разные те же колонки?

Спасибо!

+0

Хотите ли вы все из них будут отображаться сразу, или вы хотите, чтобы изменить их в зависимости от некоторых условий? – MadProgrammer

ответ

1

В принципе, вам необходимо изменить модель, которую использует combobox в зависимости от строки.

В следующем примере вы можете указать ComboBoxModel для данной строки и указать значение по умолчанию ComboBoxModel, которое не используется для строки.

Вообще говоря, хотя, каждый столбец должен быть того же типа ...

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.util.HashMap; 
import java.util.Map; 
import javax.swing.ComboBoxModel; 
import javax.swing.DefaultCellEditor; 
import javax.swing.DefaultComboBoxModel; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.table.DefaultTableModel; 

public class TestCombo { 

    public static void main(String[] args) { 
     new TestCombo(); 
    } 

    public TestCombo() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       DefaultTableModel model = new DefaultTableModel(new Object[]{"Stuff"}, 5); 
       JTable table = new JTable(model); 
       table.setGridColor(Color.LIGHT_GRAY); 

       MyComboBoxCellEditor editor = new MyComboBoxCellEditor(); 
       editor.setModelForRow(0, new DefaultComboBoxModel(new Object[]{"Banana", "Peach", "Pear"})); 
       editor.setModelForRow(1, new DefaultComboBoxModel(new Object[]{"Dog", "Cat", "T-Rex"})); 
       editor.setModelForRow(2, new DefaultComboBoxModel(new Object[]{"Car", "Truck", "Hovercraft"})); 
       editor.setModelForRow(3, new DefaultComboBoxModel(new Object[]{"Helicopter", "Plane", "Rocket"})); 
       editor.setModelForRow(4, new DefaultComboBoxModel(new Object[]{"PC", "Mac", "Linux"})); 
       table.getColumnModel().getColumn(0).setCellEditor(editor); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new JScrollPane(table)); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class MyComboBoxCellEditor extends DefaultCellEditor { 

     private ComboBoxModel defaultModel; 
     private Map<Integer, ComboBoxModel> mapModels; 

     public MyComboBoxCellEditor() { 
      super(new JComboBox()); 
      mapModels = new HashMap<>(25); 
      defaultModel = new DefaultComboBoxModel(); 
     } 

     public void setDefaultModel(ComboBoxModel model) { 
      defaultModel = model; 
     } 

     public void setModelForRow(int row, ComboBoxModel model) { 
      mapModels.put(row, model); 
     } 

     public ComboBoxModel getDefaultModel() { 
      return defaultModel; 
     } 

     public ComboBoxModel getModelForRow(int row) { 
      return mapModels.get(row); 
     } 

     @Override 
     public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { 
      JComboBox comboBox = (JComboBox) getComponent();    
      ComboBoxModel model = getModelForRow(row); 
      if (model == null) { 
       model = getDefaultModel(); 
      } 
      comboBox.setModel(model); 
      return super.getTableCellEditorComponent(table, value, isSelected, row, column); //To change body of generated methods, choose Tools | Templates. 
     } 

    } 

} 
+0

Да, с этим я могу вставить разные комбобокс на моем JTable. Но в тех же столбцах у меня бы были такие же строки с JComboBox и некоторыми другими с JTextArea. Как я могу это сделать? – user3253955

+0

Это намного сложнее. Каждый раз, когда 'getTableCellEditorComponent', вам нужно будет определить, какой редактор вы хотите вернуть, основываясь на информации о строках и столбцах. FYI: Это не то, как «JTable» был разработан для использования, просто чтобы вы знали – MadProgrammer

Смежные вопросы