Editieren abbrechen

Status
Nicht offen für weitere Antworten.

Kaladial

Bekanntes Mitglied
moin

noch ne frage zu meinen tabellen:

also ich hab ja verschiedene objekte die, wenn ich sie anklicke auf der rechten seite meines programms eine eigenschaftstabelle öffnen (so ungefähr kann man sich das vorstellen wie bei eclipse wenn ich auf nen jpanel klick und mir dann die eigenschaften (parameter) anguck)...

mein problem: in der tabelle sind verschiedene sachen in den feldern, mal sind es textfelder mal sind es comboboxen

das problem was ich hab stellt sich wie folgt dar:

ich klicke auf objekt 1 und habe da z.b. die eigenschaft binaerschwelle als textfeld... also klick ich da rein und kann zahlen eingeben...

wenn ich jetzt diese eingabe NICHT mit enter bestätige oder per maus auf ein anderes feld klicke bricht er das editieren nicht ab, wenn ich auf ein anderes objekt klicke...

was ich aber schon mache ist: sobald ich ein anderes objekt anklicke lösche ich die tabelle und zeichne sie neu mit den neuen parametern....

efekt der mich hier aber stört:
ich habe nun dadurch das er das editieren des 1. objektes nicht abgebrochen hat, in den eigenschaften des 2. objektes immer noch die eigenschaft des 1. objektes...

in bildern sieht das so aus:

1. objekt ist halt die pharmacode-erkennung anvisiert und ich editiere die binärschwelle:
31752.jpg


2. objekt hier zeige ich ein anderes objekt an, aber da ich das 1. editieren nicht abgebrochen hab ist das feld mit in dieser tabelle obwohl es das da so eigentlich nicht geben dürfte:

31753.jpg



code des betreffenden abschnittes (tabelmodel + editor):

Code:
    class MyTableModel extends AbstractTableModel {
    	boolean zell_typ=false;
    	Object typ_vars[][] = new Object [500][10];
        private String[] columnNames = {Text.TKEigenschaft, Text.TKWert};
        
        private Object[][] data={
	    		{"Config", ""} 
	    };;

        public int getColumnCount() {
            return columnNames.length;
        }

        public int getRowCount() {
            return data.length;
        }

        public String getColumnName(int col) {
            return columnNames[col];
        }

        public Object getValueAt(int row, int col) {
            return data[row][col];
        }

        public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }

        public boolean isCellEditable(int row, int col) {
        	if(zell_typ){
        		if (row < 1){
	        	    return false;
	        	}else{
	        		if(Integer.parseInt(""+typ_vars[row][col])==GlobaleVariablen.table_typ_wert_0){
	        			return false;
	        		}else{
	        			if(Integer.parseInt(""+typ_vars[row][col])==GlobaleVariablen.table_typ_wert_1){
	        				setObjectTypCBox(0, 1);//Mögliche CBox entfernen
	        				return true;
	        			}else{
		        			if(Integer.parseInt(""+typ_vars[row][col])==GlobaleVariablen.table_typ_wert_2){
		        				setObjectTypCBox(row, col);
		        				return true;
		        			}else{
			        			if(Integer.parseInt(""+typ_vars[row][col])==GlobaleVariablen.table_typ_wert_3){
			        				setObjectTypFarbAuswahl(row, col);
			        				return false;
			        			}else{
				        			if(Integer.parseInt(""+typ_vars[row][col])==GlobaleVariablen.table_typ_wert_4){
				        				
				        		        for(int i=0 ;i<labelarray.length; i++){
				        		        	if(labelarray[i]==null){
				        		        		break;
				        		        	}
				        		        	String akt_obj_titel = labelarray[i].getTitle();
				        		        	String akt_obj[] = GlobaleFunction.split(akt_obj_titel, ":");
				        		        	if(akt_obj[0].compareToIgnoreCase(""+model.data[row][0])==0){
				        		        		Color color = new Color (GlobaleFunction.HEXtoRGB(GlobaleVariablen.select_farbe));
				        		        		String titel = labelarray[i].getTitle();
				        		        		String titelgetrennt[]=GlobaleFunction.split(titel, ":");
				        		        		labelarray[i].setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(color, 2), titelgetrennt[1], TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51)));
				        		        	}
				        		        }				        				
				        				
				        				int obj_id=Integer.parseInt(""+data[row][0]);
				        				String config=""+data[0][1];
				        				String erg[]=DB.getObject(config, obj_id);
				        				filltabel(obj_id, erg[2], Integer.parseInt(erg[3]), Integer.parseInt(erg[4]), Integer.parseInt(erg[5]), Integer.parseInt(erg[6]), erg[7]);				        				
				        				return false;
				        			}else{
				        				return false;
				        			}
			        			}
		        			}
	        			}
	        		}
	        	}
        	}else{
        		if (row < 2){
	        	    return false;
	        	}else{
	        		if (col < 1) {
		                return false;
		            } else {
		                return true;
		            }
	        	}
        	}
        }
        
        public void setValueAt(Object value, int row, int col) {
			if(!zurueckbutton){
				data[row][col] = value;
				fireTableCellUpdated(row, col);
			}
        }
        
        public void add(Object value[][]) {
        	zell_typ=false;
        	int neueZeilen=0;
        	for(int i=0;i<value.length; i++){
    			neueZeilen++;
        		if(value[i]==null){
        			break;
        		}
        	}        	 
        	
        	Object[][] oldData = data; 
        	int alteLaenge = data.length; 
        	data = new Object[alteLaenge +neueZeilen][10]; 
        	for (int i=0; i < alteLaenge; i++ ) { 
        	  data[i] = oldData[i]; 
        	} 
        	for (int i=0; i < neueZeilen; i++) { 
        	  data[alteLaenge+i] = value[i]; 
        	} 
        	jTableEigenschaften.setRowHeight(20);
        	fireTableRowsInserted(alteLaenge, alteLaenge+neueZeilen);	
        }

        public void add(Object value[][], Object typ[][]) {
        	zell_typ=true;
        	int typ_vars_len=typ_vars.length;
        	int anz_typs_vorhanden=0;
        	for(int i=0; i<typ_vars_len; i++){
        		if(typ_vars[i][0]==null){
        			break;
        		}
        		anz_typs_vorhanden++;
        	}

        	int typ_len=typ.length;
        	int neue_typen=0;
        	for(int i=0; i<typ_len; i++){
        		if(typ[i][0]==null){
        			break;
        		}        		
        		neue_typen++;
        	}
        	if(anz_typs_vorhanden==0){
        		int anz_felder=anz_typs_vorhanden+neue_typen+1;
        		typ_vars = new Object[anz_felder][10]; 
        		typ_vars[0][0] = 0;
    			typ_vars[0][1] = 0;
    			for(int i=0; i<neue_typen; i++){
        			typ_vars[anz_typs_vorhanden+i+1] = typ[i];
        		}
    		}else{
    			int anz_felder=anz_typs_vorhanden+neue_typen;
    			Object typ_vars_old[][] = new Object[anz_typs_vorhanden][10];
    			for(int i=0; i<anz_typs_vorhanden; i++){
        			typ_vars_old[i] = typ_vars[i];
        		}
    			typ_vars = new Object[anz_felder][10]; 
    			for(int i=0; i<anz_typs_vorhanden; i++){
        			typ_vars[i] = typ_vars_old[i];
        		}

    			for(int i=0; i<neue_typen; i++){
        			typ_vars[anz_typs_vorhanden+i] = typ[i];
        		}
        	}
        	
        	int neueZeilen=0;
        	for(int i=0;i<value.length; i++){
    			neueZeilen++;
        		if(value[i]==null){
        			break;
        		}
        	}        	 
        	
        	Object[][] oldData = data; 
        	int alteLaenge = data.length; 
        	data = new Object[alteLaenge +neueZeilen][10]; 
        	for (int i=0; i < alteLaenge; i++ ) { 
        	  data[i] = oldData[i]; 
        	} 
        	for (int i=0; i < neueZeilen; i++) { 
        	  data[alteLaenge+i] = value[i]; 
        	} 
        	jTableEigenschaften.setRowHeight(20);
        	fireTableRowsInserted(alteLaenge, alteLaenge+neueZeilen);	
        }

        public void del_all() {
        	int alteZeilen=0;
        	for(int i=0;i<data.length; i++){
    			alteZeilen++;
        		if(data[i]==null){
        			break;
        		}
        	}        	
        	Object[][] data_new = new Object[2][10];
        	for (int i=0; i < 1; i++) { 
          	  data_new[i] = data[i]; 
          	} 
        	data = new Object[1][10];
        	for (int i=0; i < 1; i++) { 
           	  data[i] = data_new[i]; 
           	} 
        	typ_vars=new Object[10][10];
        	typ_vars[0][0]=0;
        	typ_vars[0][1]=0;
        	    	
        	fireTableRowsDeleted(0,alteZeilen);
        }
    }
    
    //Der Editor selbst ist ein einfaches JTextField 
	class Editor extends JTextField implements TableCellEditor, DocumentListener{ 
	    private List<CellEditorListener> listeners = new ArrayList<CellEditorListener>(); 
	    private int akt_row=0; 
	    private int akt_col=0;
	    public Editor(){ 
	        // Der Editor hört sich selbst ab, so kann er auf jede Benutzereingabe reagieren 
	        getDocument().addDocumentListener( this );
	    } 

	    
	    public Component getTableCellEditorComponent( JTable table, Object value, boolean isSelected, int row, int column ) { 
	        // Diese Methode wird von der JTable aufgerufen, wenn der Editor angezeigt werden soll
	    	akt_row=row;
	    	akt_col=column;
    		setText( value.toString() );
	        return this; 
	    } 

	    public void setAktRowCol() { 
	    	akt_row=0;
	    	akt_col=1;
	    } 

	    public void addCellEditorListener( CellEditorListener l ) { 
	        listeners.add( l ); 
	    } 

	    public void cancelCellEditing() { 
	    	// Falls abgebrochen wird, werden alle Listeners informiert 
	        ChangeEvent event = new ChangeEvent( this ); 
	        for( CellEditorListener listener : listeners.toArray( new CellEditorListener[ listeners.size() ] )) 
	            listener.editingCanceled( event ); 
	    } 

        public Object getCellEditorValue() { 
	        // Gibt den aktuellen Wert des Editors zurück 
	    	return getText(); 
	    } 

	    public boolean isCellEditable( EventObject anEvent ) { 
	        // Im Falle eines MouseEvents, muss ein Doppelklick erfolgen, um den Editor zu aktivieren. 
	        // Ansonsten wird der Editor auf jeden Fall aktiviert 
	        if( anEvent instanceof MouseEvent ) 
	            return ((MouseEvent)anEvent).getClickCount() > 1; 
	            
	        return true; 
	    } 

	    public void removeCellEditorListener( CellEditorListener l ) { 
	        listeners.remove( l ); 
	    } 

	    public boolean shouldSelectCell( EventObject anEvent ) { 
	        return true; 
	    } 

	    public boolean stopCellEditing() { 
	        // Sollte die Eingabe falsch sein, darf das editieren nich gestoppt werden
	    	if(zurueckbutton){
	    		zurueckbutton=false;
	    		setAktRowCol();
	    		cancelCellEditing();
	    		return true; 
	    	}
	        if( !isValid_Spalte() ) {
	        	return false;	            
	        }
	        // Ansonsten werden die Listener vom stop unterrichtet 
	        ChangeEvent event = new ChangeEvent( this ); 
	        for( CellEditorListener listener : listeners.toArray( new CellEditorListener[ listeners.size() ] )) 
	            listener.editingStopped( event ); 
	        
	        return true; 
	    } 

	    public void changedUpdate( DocumentEvent e ) { 
	        update(); 
	    } 

	    public void insertUpdate( DocumentEvent e ) { 
	        update(); 
	    } 

	    public void removeUpdate( DocumentEvent e ) { 
	        update(); 
	    } 

	    private boolean isValid_Spalte(){ 
	    	String parameter=""+model.getValueAt(akt_row, akt_col-1).toString();
	    	int objects_id=Integer.parseInt(""+model.getValueAt(2, 1).toString());
	    	// Bestimmt, was eine gültige Eingabe ist.
	    	int erg = DB.getSpaltenDeklaration(parameter,objects_id);
	    	if(erg==GlobaleVariablen.zellen_inhalts_beschreibung_1){
	    		if(getText().matches( "[0-9]+" )){
		    		if((parameter.compareToIgnoreCase("Pos_X")==0)||(parameter.compareToIgnoreCase("Pos_Y")==0)||(parameter.compareToIgnoreCase("Size_X")==0)||(parameter.compareToIgnoreCase("Size_Y")==0)){
		    			return true;
		    		}else{
		    			int max = DB.getMaxWert(parameter,objects_id);
		    			int min = DB.getMinWert(parameter,objects_id);
			    		if((Integer.parseInt(getText())>=min)&&(Integer.parseInt(getText())<=max)){
		    				return true;
		    			}else{
		    				return false;
		    			}
		    		}
	    		}else{
	    			return false;
	    		}
	    	}else{
	    		if(erg==GlobaleVariablen.zellen_inhalts_beschreibung_2){
		    		if(DB.isNurZahlen(objects_id, parameter)){
		    			return getText().matches( "[0-9]+" );
		    		}else{
			    		if(DB.isFloatWert(objects_id, parameter)){
				    		return getText().matches( "[0-9]+\u002e[0-9]+" );
			    		}else{
				    		return getText().matches( "[a-zA-Z0-9\u0020-\u002f\u003a-\u0040]+" );
			    		}
		    		}
		    	}else{
			    	if(erg==GlobaleVariablen.zellen_inhalts_beschreibung_3){
			    		return getText().matches( "#[a-zA-Z0-9]+" );
			    	}else{
			    		return getText().matches( "[a-zA-Z0-9]+" );
			    	}
		    	}
	    	}
	    } 
	    
	    private void setPos(String eigenschaft, String objects_id){
	        for(int i=0 ;i<labelarray.length; i++){
	        	if(labelarray[i]==null){
	        		break;
	        	}
	        	String akt_obj_titel = labelarray[i].getTitle();
	        	String akt_obj[] = GlobaleFunction.split(akt_obj_titel, ":");
        		int pos = Integer.parseInt(getText());
	        	if(akt_obj[0].compareToIgnoreCase(""+model.data[2][1])==0){
	        		int pos_x=labelarray[i].getX();
	        		int pos_y=labelarray[i].getY();
	        		int size_x=labelarray[i].getWidth();
	        		int size_y=labelarray[i].getHeight();

	        		if(eigenschaft.compareToIgnoreCase(GlobaleVariablen.tabel_feld_4)==0){
	        			labelarray[i].setBounds(pos, pos_y, size_x, size_y);
	        			param_einzeln(objects_id, eigenschaft, ""+(pos+1));
	        		}
	        		if(eigenschaft.compareToIgnoreCase(GlobaleVariablen.tabel_feld_5)==0){
	        			labelarray[i].setBounds(pos_x, pos, size_x, size_y);
	        			param_einzeln(objects_id, eigenschaft, ""+pos);
	        		}
	        		if(eigenschaft.compareToIgnoreCase(GlobaleVariablen.tabel_feld_6)==0){
	        			labelarray[i].setBounds(pos_x, pos_y, pos, size_y);
	        			param_einzeln(objects_id, eigenschaft, ""+(pos-2));
	        		}
	        		if(eigenschaft.compareToIgnoreCase(GlobaleVariablen.tabel_feld_7)==0){
	        			labelarray[i].setBounds(pos_x, pos_y, size_x, pos);
	        			param_einzeln(objects_id, eigenschaft, ""+(pos-11));
	        		}
	        		
	        	}
	        }
	    	
	    }

	    private void setBorder_Color(String eigenschaft, String objects_id){
	        for(int i=0 ;i<labelarray.length; i++){
	        	if(labelarray[i]==null){
	        		break;
	        	}
	        	String akt_obj_titel = labelarray[i].getTitle();
	        	String akt_obj[] = GlobaleFunction.split(akt_obj_titel, ":");
	        	if(akt_obj[0].compareToIgnoreCase(""+model.data[2][1])==0){
	        		String border_color=getText();
	        		Color color = new Color (GlobaleFunction.HEXtoRGB(border_color));
	        		String titel = labelarray[i].getTitle();
	        		String titelgetrennt[]=GlobaleFunction.split(titel, ":");
	        		labelarray[i].setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(color, 2), titelgetrennt[1], TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51)));
	        		param_einzeln(objects_id, eigenschaft, ""+border_color);
	        	}
	        }
	    }
	    
	    private void setObjektLabel(String objektID){
	        for(int i=0 ;i<labelarray.length; i++){
	        	if(labelarray[i]==null){
	        		break;
	        	}
	        	String akt_obj_titel = labelarray[i].getTitle();
	        	String akt_obj[] = GlobaleFunction.split(akt_obj_titel, ":");
	        	if(akt_obj[0].compareToIgnoreCase(objektID)==0){
	        		labelarray[i].setTitle(akt_obj[0]+":"+getText()+":"+akt_obj[2]);
	        	}
	        }
	    }
	    
	    public void update(){ 
	        // Verändert die Umrandung des Editors, jenachdem, ob eine gültige 
	        // oder eine ungültige Eingabe gemacht wurde 
	        Color color; 
	        String objects_id = model.getValueAt(2, 1).toString();
	        String eigenschaft = model.getValueAt(akt_row, akt_col-1).toString();
	        if(eigenschaft.compareToIgnoreCase(GlobaleVariablen.tabel_feld_3)==0){
	        	if( isValid_Spalte() ){
	        		color = Color.GREEN;
	        		String objektID=""+model.data[2][1];
	        		setObjektLabel(objektID);
		        }else {
		            color = Color.RED; 
		        }
	        }else{
		        if(eigenschaft.compareToIgnoreCase(GlobaleVariablen.tabel_feld_8)==0){
		        	if( isValid_Spalte() ){
		        		color = Color.GREEN;
		        		setBorder_Color(eigenschaft, objects_id);
		        	}else {
			            color = Color.RED; 
			        }
		        }else{

			        if((eigenschaft.compareToIgnoreCase(GlobaleVariablen.tabel_feld_4)==0)||
			           (eigenschaft.compareToIgnoreCase(GlobaleVariablen.tabel_feld_5)==0)||
			           (eigenschaft.compareToIgnoreCase(GlobaleVariablen.tabel_feld_6)==0)||
			           (eigenschaft.compareToIgnoreCase(GlobaleVariablen.tabel_feld_7)==0)
			        ){
			        	if( isValid_Spalte() ){
			        		color = Color.GREEN;
			        		setPos(eigenschaft, objects_id);
				        }else {
				            color = Color.RED; 
				        }
			        }else{
				        if( isValid_Spalte() ){ 
				        	//Wenn Parameter sich ändern
				        	int rowData_len=rowData_read.length;
				        	int start_obj=0;
				        	int stop_obj=0;
				        	for(int i=0; i<rowData_len; i++){
				        		if(rowData_read[i][0]==null){
				        			break;
				        		}
				        		if((rowData_read[i][0].toString().compareToIgnoreCase("Objekt_ID")==0)&&(rowData_read[i][1].toString().compareToIgnoreCase(objects_id)==0)){
				        			start_obj=i+1;
				        		}
				        	}
				        	for(int i=start_obj; i<rowData_len; i++){
				        		if(rowData_read[i][0]==null){
				        			stop_obj=i-1;
				        			break;
				        		}
				        		if(rowData_read[i][0].toString().compareToIgnoreCase("Objekt_ID")==0){
				        			stop_obj=i-1;
				        			break;
				        		}
				        	}
				    	
					    	update_rowData_read(start_obj, stop_obj, akt_row, akt_col, ""+getCellEditorValue());
				        	
				        	color = Color.GREEN;
				        	param_einzeln(objects_id, eigenschaft, ""+getCellEditorValue());
				        }else {
				            color = Color.RED; 
				        }
			        }
		        }
	        }
		    setBorder( BorderFactory.createLineBorder( color )); 
	    } 
	}

wäre nett wenn mir wer schreiben kann wie ich das editieren des editors über befehle abbrechen kann

thx Kala
 

Marco13

Top Contributor
Sorry, "DIE" Antwort weiß ich auch nicht - habe den Code nicht nachvollzogen - aber das hängt auch mit meiner Rückfrage zusammen ... (nur aus Neugier ... ) : In welchem Zusammenhang schreibst du dieses Programm? Lehr-Projekt für die Mülltonne? Lehr-Projekt für den echten Einsatz? "Echtes" (Industrie-) Projekt?
 

Kaladial

Bekanntes Mitglied
ok die lösung meines problems :

Code:
		jTableEigenschaften.requestFocus();
					try{ 
						Robot robot = new Robot(); 
						robot.keyPress(KeyEvent.VK_ESCAPE); 
			        }catch (Exception ex){ 
			            ex.printStackTrace(); 
			        }
 

Marco13

Top Contributor
Und nur aus Neugier: In welcher ... Rolle programmierst du das? Hast du irgendeine Ausbildung oder so?

Es ist schade, dass man das so sagen muss, aber .... das kann doch alles nicht dein Ernst sein?! Zum Glück (für dich) kann dir das ja egal sein, aber: Wenn du mir als Praktikant im 1 Semester so einen Code liefern würdest, würde ich ihn dir um (aber sowas von) die Ohren hauen... sowas wie
Code:
if((eigenschaft.compareToIgnoreCase(GlobaleVariablen.tabel_feld_4)==0)||
(eigenschaft.compareToIgnoreCase(GlobaleVariablen.tabel_feld_5)==0)||
(eigenschaft.compareToIgnoreCase(GlobaleVariablen.tabel_feld_6)==0)||
(eigenschaft.compareToIgnoreCase(GlobaleVariablen.tabel_feld_7)==0)
oder
Code:
                if(erg==GlobaleVariablen.zellen_inhalts_beschreibung_3){
                   return getText().matches( "#[a-zA-Z0-9]+" );
                }else{
                   return getText().matches( "[a-zA-Z0-9]+" );
oder
Code:
private boolean isValid_Spalte(){
...
                   int max = DB.getMaxWert(parameter,objects_id);  // <-- ??? Ein Datenbankzugriff ???
KANN doch nicht ernst gemeint sein?!

Das mit dem Robot ist übrigens Murks. Aber das spielt offenbar keine Rolle.
 

Marco13

Top Contributor
Ohje. Eigentlich wollt' ich heut nicht so lang machen. Aber *tieflufthol* .... einige Punkte sind eher Kleinigkeiten, auf die du (und vielleicht andere) evtl. nicht so viel Wert legen, aber .... andere sind schon Schnitzer. Ich geh mal grob von oben nach unten durch, ohne Anspruch auf Vollständigkeit.

- Praktisch keine Kommentare vorhanden
- Mischung aus Deutsch und Englisch (schön für den Polnischen Kollegen....)
- Never use "My" - not even in examples
- Unterstriche in Variablennamen - es gibt naming conventions: http://java.sun.com/docs/codeconv/html/CodeConventions.doc8.html
- Nichtssagende Variablennamen: boolean zell_typ=false; - ist das jetzt "kein typ", der "false-Typ", oder häääh?
- Einfach mal grundlos einen Array beliebiger Größe anlegen: Object typ_vars[][] = new Object [500][10];
- Das hier
Code:
        public boolean isCellEditable(int row, int col) {
           if(zell_typ){
              if (row < 1){
                  return false;
              }else{
                 if(Integer.parseInt(""+typ_vars[row][col])==GlobaleVariablen.table_typ_wert_0){
                    return false;
                 }else{
                    if(Integer.parseInt(""+typ_vars[row][col])==GlobaleVariablen.table_typ_wert_1){
                       setObjectTypCBox(0, 1);//Mögliche CBox entfernen
                       return true;
                    }else{
                       if(Integer.parseInt(""+typ_vars[row][col])==GlobaleVariablen.table_typ_wert_2){
                          setObjectTypCBox(row, col);
                          return true;
                       }else{
                          if(Integer.parseInt(""+typ_vars[row][col])==GlobaleVariablen.table_typ_wert_3){
                             setObjectTypFarbAuswahl(row, col);
                             return false;
                          }else{
                             if(Integer.parseInt(""+typ_vars[row][col])==GlobaleVariablen.table_typ_wert_4){
ist EXTREMSTER Qäl-Kot:
1. Sinnlose, tiefe Verschachtelung
Code:
              if (row < 1){
                  return false;
              }else{
                  machWasAnderes();
              }
kann man direkt schreiben als
Code:
              if (row < 1){
                  return false;
              }
              machWasAnderes();
(wenn er returnt hat, ist die Sache gegessen - dann gibt's kein "else" mehr...)
Dazu kommt, dass man statt
Code:
if (A) {  ... } 
else {
    if (B) { ... }
    else {
        if (C) { ... }
        else ....
    }
}
vielleicht lieber "else if" verwenden sollte
Code:
if (A) {  ... } 
else if (B) { ... }
else if (C) { ... }
else ....
2. Redundanz - Die gleiche (SEHR aufwändige!) Arbeit wird zig mal gemacht: Wenn der letzte if-Zweig erreicht wird, wurde fünf mal
Code:
Integer.parseInt(""+typ_vars[row][col])
ausgeführt. Das sollte man sich EINmal ausrechnen, und speichern. Das ist nicht nur effizienter, sondern auch übersichtlicher.
3. Globale Variablen :autsch: :autsch: :autsch:
In Java (und den meisten modernen Sprachen) Programmiert man objektorientiert - d.h. es sollte NIE sowas wie globale Variablen geben - der Name "GlobaleVariablen.table_typ_wert_3" ist da ja noch fast das kleinste Übel...

Bisher zusammengefasst: Der (mit einer IDE automatisch eingerückte) Code
Code:
class MyTableModel extends AbstractTableModel
{
    public boolean isCellEditable(int row, int col)
    {
        if(zell_typ)
        {
            if(row < 1)
            {
                return false;
            }
            else
            {
                if(Integer.parseInt("" + typ_vars[row][col]) == GlobaleVariablen.table_typ_wert_0)
                {
                    return false;
                }
                else
                {
                    if(Integer.parseInt("" + typ_vars[row][col]) == GlobaleVariablen.table_typ_wert_1)
                    {
                        setObjectTypCBox(0, 1); //Mögliche CBox entfernen
                        return true;
                    }
                    else
                    {
                        if(Integer.parseInt("" + typ_vars[row][col]) == GlobaleVariablen.table_typ_wert_2)
                        {
                            setObjectTypCBox(row, col);
                            return true;
                        }
                        else
                        {
                            if(Integer.parseInt("" + typ_vars[row][col]) == GlobaleVariablen.table_typ_wert_3)
                            {
                                setObjectTypFarbAuswahl(row, col);
                                return false;
                            }
                            else
                            {
                                if(Integer.parseInt("" + typ_vars[row][col]) == GlobaleVariablen.table_typ_wert_4)
                                {

                                    for(int i = 0; i < labelarray.length; i++)
                                    {
                                        if(labelarray[i] == null)
                                        {
                                            break;
                                        }
                                        String akt_obj_titel = labelarray[i].getTitle();
                                        String akt_obj[] = GlobaleFunction.split(akt_obj_titel, ":");
                                        if(akt_obj[0].compareToIgnoreCase("" + model.data[row][0]) == 0)
                                        {
                                            Color color = new Color(GlobaleFunction.HEXtoRGB(GlobaleVariablen.
                                                                                             select_farbe));
                                            String titel = labelarray[i].getTitle();
                                            String titelgetrennt[] = GlobaleFunction.split(titel, ":");
                                            labelarray[i].setBorder(BorderFactory.createTitledBorder(BorderFactory.
                                                createLineBorder(color, 2), titelgetrennt[1],
                                                                    TitledBorder.DEFAULT_JUSTIFICATION,
                                                                           TitledBorder.DEFAULT_POSITION,
                                                                           new Font("Dialog", Font.BOLD, 12),
                                                                           new Color(51, 51, 51)));
                                        }
                                    }

                                    int obj_id = Integer.parseInt("" + data[row][0]);
                                    String config = "" + data[0][1];
                                    String erg[] = DB.getObject(config, obj_id);
                                    filltabel(obj_id, erg[2], Integer.parseInt(erg[3]), Integer.parseInt(erg[4]),
                                              Integer.parseInt(erg[5]), Integer.parseInt(erg[6]), erg[7]);
                                    return false;
                                }
                                else
                                {
                                    return false;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
könnte UNGEFÄHR so aussehen
Code:
class MyTableModel extends AbstractTableModel
{
    private Border thisAwesomeBorder = BorderFactory.createTitledBorder(BorderFactory.
                            createLineBorder(color, 2), titelgetrennt[1],
                                                TitledBorder.DEFAULT_JUSTIFICATION,
                                                       TitledBorder.DEFAULT_POSITION,
                                                       new Font("Dialog", Font.BOLD, 12),
                                                       new Color(51, 51, 51))
    
    public boolean isCellEditable(int row, int col)
    {
        if(zell_typ)
        {
            if(row < 1)
            {
                return false;
            }
        }
        else
        {
            if(row < 2)
            {
                return false;
            }
            if(col < 1)
            {
                return false;
            }
            return true;
        }
        
        int value = Integer.parseInt("" + typ_vars[row][col]);
        
        if(value == GlobaleVariablen.table_typ_wert_0)
        {
            return false;
        }
        else
        {
            if(value == GlobaleVariablen.table_typ_wert_1)
            {
                setObjectTypCBox(0, 1); //Mögliche CBox entfernen
                return true;
            }
            if(value == GlobaleVariablen.table_typ_wert_2)
            {
                setObjectTypCBox(row, col);
                return true;
            }
            if(value == GlobaleVariablen.table_typ_wert_3)
            {
                setObjectTypFarbAuswahl(row, col);
                return false;
            }
            if(value == GlobaleVariablen.table_typ_wert_4)
            {

                for(int i = 0; i < labelarray.length; i++)
                {
                    if(labelarray[i] == null)
                    {
                        break;
                    }
                    String akt_obj_titel = labelarray[i].getTitle();
                    String akt_obj[] = GlobaleFunction.split(akt_obj_titel, ":");
                    if(akt_obj[0].compareToIgnoreCase("" + model.data[row][0]) == 0)
                    {
                        Color color = new Color(GlobaleFunction.HEXtoRGB(GlobaleVariablen.
                                                                         select_farbe));
                        String titel = labelarray[i].getTitle();
                        String titelgetrennt[] = GlobaleFunction.split(titel, ":");
                        labelarray[i].setBorder(thisAwesomeBorder);
                    }
                }

                int obj_id = Integer.parseInt("" + data[row][0]);
                String config = "" + data[0][1];
                String erg[] = DB.getObject(config, obj_id);
                filltabel(obj_id, erg[2], Integer.parseInt(erg[3]), Integer.parseInt(erg[4]),
                          Integer.parseInt(erg[5]), Integer.parseInt(erg[6]), erg[7]);
                return false;
            }
            return false;
        }
    }
}
wobei dort NUR die letzten drei (fettgedruckten) Punkte behoben sind, und der letzte Teil sicher noch optimiert und übersichtlicher gemacht werden könnte

Weiter geht's:
- Schreibfehler - "filltabel" ...
- "data" und "oldData" wird könnte ggf. mit System.arraycopy kopiert werden
- (Was die "add"-Methode macht genau macht, sieht ... interessant aus (boah, sorry, aber das tu' ich mir jetzt nicht an))
- Die isValid_Spalte-Methode.... *nochmal lufthol*
1. DB-Zugriffe in der GUI (das macht man doch nicht....)
2. Megamethode (ggf. sollte das, was bei den Fällen für "GlobaleVariablen.zellen_inhalts_beschreibung_1" bis "GlobaleVariablen.zellen_inhalts_beschreibung_3" gemacht wird, in einzelne Methoden, die dann ggf. auch Namen haben könnten wie "isValidPosition", "isValidNumber" oder so ähnlich
3. :)nocom:)
Code:
                   if((Integer.parseInt(getText())>=min)&&(Integer.parseInt(getText())<=max)){
                      return true;
                   }else{
                      return false;
                   }
->
Code:
int value = Integer.parseInt(getText());
return value >=min && value <= max;
4. Das mit den RegEx :? Hmja, kann man so machen, aber sowas wie
Code:
private static final String numberPatternString =  "[a-zA-Z0-9]+";
...
                   return getText().matches(numberPatternString );
könnte nicht schaden. Besser wäre aber IMHO(!) eine eigene Methode, die den String prüft. Dabei gehen die Meinungen ein bißchen auseinander, aber wenn "[0-9]+\u002e[0-9]+" für einen beliebigen Float-Wert stehen soll: Das tut es NICHT, und es wäre sehr schwierig (unangemessen schwierig) eine derartige RegEx anzugeben...

Und weiter...
- Methoden doppelt implementiert - oder macht "GlobaleFunction.split" was grundlegend anderes als "String.split"?
- Grausamer, unübersichtlicher Code doppelt vorhanden - zumindest sieht "setBorder_Color" schon SEHR ähnlich aus zu dem, was oben bei "isValid-Spalte" vorkam...


In der update-Methode kommen nochmal so ziemlich alle bisher genannten Kritikpunkte zusammen (und die ruft zig mal "isValid_Spalte" auf :shock: )

Das waren die gröbsten Punkte, die mir beim ersten Überfliegen aufgefallen sind. Vielleicht mag sie ja noch jemand anderes ergänzen.
 

Kaladial

Bekanntes Mitglied
hmmm ein paar sachen werd ich mir annehmen dafür dank ich dir ein paar sachen werd ich mir fürs nächste projekt mal merken und ein paar andere sachen hab ich schon geändert ...

naja im grunde geb ich dir recht das da nen paar schönheitsfehler drin sind aber so wirklich gravierendes haste jetzt meiner meinung nach net geschrieben ...

und nein setBorder_Color und isValid_Spalte sind 2 komplett verschiedene funktionen bzw beziehen sich auf komplett andere objekte... das eine färbt das eingabefeld rot oder grün und das andere färbt meine objekte ...

gut sie färben beide sachen ein aber das is dann auch schon die einzigste gemeinsamkeit ...

naja wie auch immer :)

thx für hilfe Kala
 
S

SlaterB

Gast
könnte UNGEFÄHR so aussehen

Code:
    public boolean isCellEditable(int row, int col)
    {
        if(zell_typ)
        {
            if(row < 1)
            {
                return false;
            }
        }
        else
        {
            if(row < 2)
            {
                return false;
            }
            if(col < 1)
            {
                return false;
            }
            return true;
        }

hey, nicht in der Mitte der Optimierung aufhören ;)

->
Code:
    public boolean isCellEditable(int row, int col)
    {
        if(!zell_typ)
        {
             return (row >= 2) && (col >= 1)
        }
        if(row < 1)
        {
            return false;
        }
 

Marco13

Top Contributor
@SlaterB: Jaja .... sag' das nicht MIR :wink:

Und noch @Topic: Ich weiß ja nicht genau, WAS da angezeigt wird, aber wenn ich das richtig verstanden habe, ist da eben EHR viel gemischt. Das "add" macht irgendwie sehr viel nicht nachvollziehbares Zeug - aber es sieht aus, als würde da dasselbe TableModel für unterschiedlichste Daten verwendet. Du könntest mal in Erwägung ziehen, für die einzelnen "Typen" von Dingen, die da gesetzt werden, eigene TableModels zu schreiben. Dann gibt es auch nicht mehr diese Abfragen in der Form
Code:
isValid()
{ 
    if (typ)
    {
        if (data[x][y].matches(regExA) return true;
        if (data[x][y].matches(regExB) return true;
    }
    else
    {
        if (data[x][y].matches(regExC) return true;
    }
}
sondern jedes TableModel (bzw. jeder zur jeweiligen Table gehörende Editor usw) überprüft SELBST und DEDIZIERT ob die Eingaben für IHN passend sind. Wenn dann ein neuer Datentyp dazukommt, erstellt man nur EINE passende Modell- und Editorimplementierung, und der bestehende Code bleibt weitgehend unverändert.
Aber das geht schon in Richtung "Refactoring" - dafür müsste man sich erstmal die Zeit nehmen (können).
 

Marco13

Top Contributor
Wie war das?
- Es ist zu warm
- In der Küche kocht das Wasser
- Die Farbe löst sich von den Wänden.
Welches der Probleme behebt man zuerst?
Gar keines, weil das Haus brennt! :wink:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I JavaFX Zellen in Tableview editieren AWT, Swing, JavaFX & SWT 0
F DefaultTreeCellEditor - Fragen zur Groesse und zum Icon beim Editieren AWT, Swing, JavaFX & SWT 4
earlgrey_tea JTable Zelleninhalt beim Editieren löschen AWT, Swing, JavaFX & SWT 5
T [JavaFX 2.0] ListView editieren AWT, Swing, JavaFX & SWT 2
E Swing CellEditor mit Combobox durch Tastatureingabe editieren?! AWT, Swing, JavaFX & SWT 3
J Swing JList editieren - Laufzeitfehler? AWT, Swing, JavaFX & SWT 9
C Swing JTable Zelle mit Einfachklick editieren AWT, Swing, JavaFX & SWT 3
T JTable: editieren bei Doppelklick deaktivieren, aber... AWT, Swing, JavaFX & SWT 2
Go ein "JLabel" mit Doppelklick editieren. AWT, Swing, JavaFX & SWT 5
P Textfelder in einem Frame lassen sich nicht editieren AWT, Swing, JavaFX & SWT 3
A bei TableCells editieren unterdrücken AWT, Swing, JavaFX & SWT 5
O JTree Node sofort editieren AWT, Swing, JavaFX & SWT 2
M JTable: Editieren einer Zelle "von außen" abbreche AWT, Swing, JavaFX & SWT 2
T Wenn in JTable Editieren von Rows,Cols AWT, Swing, JavaFX & SWT 2
W Zellen Inhalt beim editieren markieren AWT, Swing, JavaFX & SWT 2
M JTable Zelle editieren AWT, Swing, JavaFX & SWT 2
C Zellen editieren AWT, Swing, JavaFX & SWT 4
P JTable (->Datenbank) editieren/updaten AWT, Swing, JavaFX & SWT 3
D JTable zum Einfügen/Löschen/Editieren von Daten AWT, Swing, JavaFX & SWT 5
thE_29 JList Item editieren AWT, Swing, JavaFX & SWT 7
D JTable: Focus auf Zelle markiert ihren Text zum editieren AWT, Swing, JavaFX & SWT 2
N Rahmen zum editieren der Größe eines JComponents? AWT, Swing, JavaFX & SWT 2
L JTable editieren AWT, Swing, JavaFX & SWT 4
L JTable - Button Speichern während des Editieren AWT, Swing, JavaFX & SWT 3
S JSpinner: Editieren einschränken AWT, Swing, JavaFX & SWT 4
D JComboBox editieren AWT, Swing, JavaFX & SWT 2
J Zellen editieren ausschalten AWT, Swing, JavaFX & SWT 2
M JTree: Wie einen Knoten editieren? AWT, Swing, JavaFX & SWT 5
R TableCellEditor -> editieren stoppen AWT, Swing, JavaFX & SWT 4
J JOptionPane return bei "Abbrechen" AWT, Swing, JavaFX & SWT 13
emma_louisa JavaFX MenuBar Zweitfenster; bei Button "Abbrechen" nur das Zweitfenster schließen AWT, Swing, JavaFX & SWT 2
Neumi5694 Swing Listenauswahl abbrechen AWT, Swing, JavaFX & SWT 0
D Robot Programm mit Escape abbrechen (aus Eclipse heraus) AWT, Swing, JavaFX & SWT 2
J Abbrechen muss immer einmal mehr gedrückt werden AWT, Swing, JavaFX & SWT 3
C Swing SwingWorker abbrechen AWT, Swing, JavaFX & SWT 12
VfL_Freak Swing kann ich einen laufenden Timer mitten in der Ausführung abbrechen? AWT, Swing, JavaFX & SWT 6
S Berechnung abbrechen mit Button AWT, Swing, JavaFX & SWT 6
M JOptionPane.showInputDialog abbrechen abfangen? AWT, Swing, JavaFX & SWT 2
M Swing WindowListener -> Event abbrechen? AWT, Swing, JavaFX & SWT 2
O nimbus Abbrechen ok vertauscht AWT, Swing, JavaFX & SWT 2
T JColorChooser abbrechen... AWT, Swing, JavaFX & SWT 2
T Abbrechen-Icon entfernen AWT, Swing, JavaFX & SWT 4
S Methode während ihrer Laufzeit abbrechen AWT, Swing, JavaFX & SWT 6
H Auswahl in JComboBox abbrechen AWT, Swing, JavaFX & SWT 5
M Schleife mit Button abbrechen AWT, Swing, JavaFX & SWT 4
oliver1974 JTable Editierprozess abbrechen AWT, Swing, JavaFX & SWT 2
C JFileChooser - dispose() - Fenster schließ. Abbrechen Button AWT, Swing, JavaFX & SWT 6
H WindowClosing Event abbrechen AWT, Swing, JavaFX & SWT 2
N Beenden-Dialog mit "Beenden" und "Abbrechen&q AWT, Swing, JavaFX & SWT 2
L JOP.showInputDialog: Abbrechen Button-Funktion beenden AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben