2016-07-19 19 views
0

Ich habe eine Dropdown-und einfache Textfeld in meiner JTable und basierend auf dem spezifischen Wert in der Dropdown-Liste ausgewählt, möchte ich das Textfeld zum Löschen ändern auch runter.Wie man einzelne Zelle von einer bestimmten Spalte als Drop-Down in JTable

Unten ist der Code, den ich für das gleiche benutze und ich bin in der Lage, das Textfeld zu konvertieren, basierend auf der Auswahl, aber das Problem besteht darin, dass es alle Textfelder in der Spalte konvertiert, um abzulegen. Ich möchte nur die ausgewählte Zeile zu Drop-Down ändern, Rest sollte als Textfeld bleiben.

 comboBox2.addItemListener(new ItemListener() { 
     public void itemStateChanged(ItemEvent arg0) { 

      String properties = (String) comboBox2.getSelectedItem(); 
      try { 

       switch (properties) { 
       case "Choose Object": 
        dd_OR = table.getColumnModel().getColumn(3); 

        model1 = new DefaultComboBoxModel<String>(); 
        model1.addElement(""); 
        model1.addElement("Snowboarding"); 
        model1.addElement("Rowing"); 
        model1.addElement("Knitting"); 

        JComboBox comboBox3 = new JComboBox<String>(model1); 
        AutoCompleteDecorator.decorate(comboBox3); 
        dd_OR.setCellEditor(new DefaultCellEditor(comboBox3)); 
        break; 

       } 

Antwort

2

Eine Möglichkeit besteht darin, die getCellEditor(...)-Methode der JTable zu überschreiben, so dass Sie dynamisch bestimmen können, welcher Editor verwendet werden soll.

Hier ist ein einfaches Beispiel Ihren Einstieg:

import java.awt.*; 
import java.util.List; 
import java.util.ArrayList; 
import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.border.*; 
import javax.swing.table.*; 

public class TableComboBoxByRow extends JPanel 
{ 
    List<String[]> editorData = new ArrayList<String[]>(3); 

    public TableComboBoxByRow() 
    { 
     setLayout(new BorderLayout()); 

     // Create the editorData to be used for each row 

     editorData.add(new String[]{ "Red", "Blue", "Green" }); 
     editorData.add(new String[]{ "Circle", "Square", "Triangle" }); 
     editorData.add(new String[]{ "Apple", "Orange", "Banana" }); 

     // Create the table with default data 

     Object[][] data = 
     { 
      {"Color", "Red"}, 
      {"Shape", "Square"}, 
      {"Fruit", "Banana"}, 
      {"Plain", "Text"} 
     }; 
     String[] columnNames = {"Type","Value"}; 

     DefaultTableModel model = new DefaultTableModel(data, columnNames); 
     JTable table = new JTable(model) 
     { 
      // Determine editor to be used by row 
      public TableCellEditor getCellEditor(int row, int column) 
      { 
       int modelColumn = convertColumnIndexToModel(column); 

       if (modelColumn == 1 && row < 3) 
       { 
        JComboBox<String> comboBox1 = new JComboBox<String>(editorData.get(row)); 
        return new DefaultCellEditor(comboBox1); 
       } 
       else 
        return super.getCellEditor(row, column); 
      } 
     }; 

     JScrollPane scrollPane = new JScrollPane(table); 
     add(scrollPane); 
//  table.getColumnModel().getColumn(1).setCellRenderer(new ComboBoxRenderer2()); 
    } 
/* 
    class ComboBoxRenderer2 extends DefaultTableCellRenderer 
    { 
     @Override 
     public Component getTableCellRendererComponent(
      JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
     { 
      JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
      label.setIcon(UIManager.getIcon("Table.descendingSortIcon")); 
      return label; 
     } 
    } 
*/ 
    private static void createAndShowUI() 
    { 
     JFrame frame = new JFrame("Table Combo Box by Row"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new TableComboBoxByRow()); 
     frame.setSize(200, 200); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 
+0

Danke. Das hat für mich funktioniert. Prost. – Naseem

0

die Zelle Editor DefaultCellEditor Einstellung wird auf alle Zeilen in der Spalte gelten 3. Sie bitte Ihre obigen Code wie in unten angegebenen

TableColumn column = table.getColumnModel().getColumn(3); 
column.setCellEditor(new CustomTableCellEditor()); 

Und die CustomTableEditor wird

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

public class CustomTableCellEditor extends AbstractCellEditor implements TableCellEditor { 

/** 
* 
*/ 
private static final long serialVersionUID = -6924557080981304281L; 
private JComboBox<String> editor; 
private String [] values = {"","Snowboarding", "Rowing", "Knitting"}; 

public CustomTableCellEditor() { 
    // Create a new Combobox with the array of values. 
    editor = new JComboBox<String>(values); 
} 

@Override 
public Object getCellEditorValue() { 
    // TODO Auto-generated method stub 
    return editor.getSelectedItem(); 
} 



@Override 
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int rowIndex, int colIndex) { 
    // Set the model data of the table 
    if(isSelected) 
    { 
     // Do Whatever you want 
    } 

    return editor; 
} 

} 

Hoffe, es wird dir helfen

Danke Raj Kumar

+0

Dank Rajkumar für die Hilfe, aber der gegebene Code wird auch das gleiche tun. Es fügt das Drop-down zu allen Zellen in der Spalte3 hinzu. – Naseem