JTable, eine Zelle nicht editierbar machen

Matze82

Mitglied
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 :confused:

Mfg

Matthias
 
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:
Code:
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
Code:
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
 
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
 
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.

Code:
   /**
     * 
     */
    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
 
Zurück