# JTable, eine Zelle nicht editierbar machen



## Matze82 (12. August 2005)

Hallo,

habe das Problem das ich mir eine JTable mit 5 Spalten aufbaue.
In der 2. Spalten ist eine ComboBox.
Wenn ich in dieser Spalte einen bestimmten Wert auswähle soll die 3.Spalte nicht mehr editierbar sein und der 4.Spalte soll man meinetwegen einen Maximalwert von 100 eintragen dürfen.
Kann mir jemand helfen   

Mfg

Matthias


----------



## MeinerEiner_80 (12. August 2005)

hallöle,
was das editieren angeht, musst du dir einen eigenes TableModel schreiben. 
Dies sollte am besten von AbstractTableModel erben und die Funktion 
public boolean isCellEditable(int row, int col) überschreiben..
ich stell mir die funktion ungefähr so vor:

```
class OwnTableModel extends AbtractTableModel{
....

Object seletectedValueInComboBox;
public boolean isCellEditable(int row, int col){
          if(selectedValueInComboBox == referenceValue){
                   if(col == 3) return false;
                   else return true;
          }
          else return true;
}
...
...
```
Dann erstellst du eine Tabelle mit dem TableModel.
Deiner ComboBox weist du einen ItemListener zu, der bei auftretem Event, "seletectedValueInComboBox" dem  aktuellen selektierten Wert zuweist..
Denke mal, das sollte das Editproblem lösen..
Was den Maximalwert angeht, so gibt es biem TableModel die Methode 

```
setValueAt(Object aValue, int rowIndex, int columnIndex)
```
sollte dir der übergebene Wert in Spalte 4 nicht gefallen, dann lässt du den ürsprünglichen Wert halt..


So, ich hoffe mal, das hilft dir weiter
*grüssle*
MeinerEiner


----------



## Matze82 (13. August 2005)

Vielen Dank für die schnelle Antwort!

Meine Tabelle besitzt schon ein TableModel. 
Die Informationen klingen sehr gut. Muss ich die Methode mal umschreiben.
Melde mich nochmal wenn es geklappt hat oder auch nicht  

Mfg

Matze82


----------



## Thomas Darimont (13. August 2005)

Hallo!



> Wenn ich in dieser Spalte einen bestimmten Wert auswähle


     ... in meinem  Beispiel ist das der Wert A in der ComoBox der 2.ten Spalte.


```
/**
     * 
     */
    package de.tutorials;
    
    import javax.swing.DefaultCellEditor;
    import javax.swing.InputVerifier;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.JTextField;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableModel;
    import javax.swing.text.JTextComponent;
    
    /**
     * @author Tom
     * 
     */
    public class JTableExample extends JFrame {
    
    	public JTableExample() {
    		super("JTableExample");
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    
    		JTable table = new JTable(buildDummyTableModel()) {
    			public boolean isCellEditable(int row, int column) {
    				if (column == 2) {
 		 		return !"A".equals(getValueAt(row, 1));
    				}
 				return super.isCellEditable(row, column);
    			}
    		};
    
    		table.getColumnModel().getColumn(1).setCellEditor(
 		 	new DefaultCellEditor(new JComboBox(new String[] { "A", "B",
 						"C" })));
    
    		table.getColumnModel().getColumn(3).setCellEditor(
 		 	new ValidatingCellEditor(new JTextField(), new InputVerifier() {
 		 		public boolean verify(javax.swing.JComponent input) {
 		 			String text = ((JTextComponent) input).getText();
 		 			if (!text.matches("\\d+")) {
 		 		 	return false;
 						} else {
 		 		 	int value = Integer.parseInt(text);
 		 		 	boolean validInput = value <= 100;
 //		 		 	System.out.printf(
 //		 		 			"input (%s) is vaild input: %s\n", text,
 //		 		 			validInput);
 		 		 	return validInput;
 						}
    					}
    				}));
    
    		add(new JScrollPane(table));
    
    		pack();
    		setVisible(true);
    	}
    
    	private TableModel buildDummyTableModel() {
    		int i = 1;
    		Object[][] data = new Object[][] {
 				{ Integer.valueOf(i++), "B", "Bar" + Math.random(),
 		 		 Integer.valueOf(i * 10), "Fart" + Math.random() },
 				{ Integer.valueOf(i++), "C", "Bar" + Math.random(),
 		 		 Integer.valueOf(i * 10), "Fart" + Math.random() },
 				{ Integer.valueOf(i++), "B", "Bar" + Math.random(),
 		 		 Integer.valueOf(i * 10), "Fart" + Math.random() },
 				{ Integer.valueOf(i++), "C", "Bar" + Math.random(),
 		 		 Integer.valueOf(i * 10), "Fart" + Math.random() } };
    
    		DefaultTableModel dtm = new DefaultTableModel(data, new Object[] {
 		 	"Spalte1", "Spalte2", "Spalte3", "Spalte4", "Spalte5" });
    		return dtm;
    	}
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		new JTableExample();
    	}
    
    	class ValidatingCellEditor extends DefaultCellEditor {
    		InputVerifier verifier;
    
    		public ValidatingCellEditor(JTextField textField, InputVerifier verifier) {
    			super(textField);
    			this.verifier = verifier;
    		}
    
    		public boolean stopCellEditing() {
    			if (verifier.verify(editorComponent)) {
  				return super.stopCellEditing();
    			} else {
    				return false;
    			}
    		}
    	}
    }
```
 
     Gruß Tom


----------

