PlainDocument rechtsbündig

Status
Nicht offen für weitere Antworten.

MScalli

Bekanntes Mitglied
Hi Leutz.

Ich habe folgendes Problem.
Ich habe eine JTable. Um bei der Eingabe schon alles prüfen zu können(was wurde eingegeben usw.)
habe ich das PlainDocument zu hilfe genommen. Läuft eigentlich alles einwandfrei..
aber wie bekomme ich es hin den Inhalt rechtsbündig zu schreiben ??? Finde da irgendwie nichts wie
setHorizontalAlignment() oder so..

Schön wär auch bei der Eingabe von kommazahlen den Trenner untereinander stellen zu können.

Hat wer nen tipp für mich?? Oder ein Beispiel??

gruss
MScalli
 

MScalli

Bekanntes Mitglied
leider nur zu beginn.. sobald ich 1 mal rein klicke nicht mehr..
hier mal die Methode initColumn meiner JTable

Code:
	  private void initColumn(final JTable table, int[] _width_array, Object[][] _arr_decimal_places) {
	        TableColumn column = null;
	        
	        for (int i = 0; i < _width_array.length; i++) {
	        	
	            final JFormattedTextField tf = new JFormattedTextField();
	            tf.setHorizontalAlignment(JFormattedTextField.RIGHT);
	            
	            //ACHTUNG: Weitere Document-Typen in Klasse "MyTableCellEditor" anpassen. 
	            if(_arr_decimal_places[i][0].toString().equals("C")){
	            	System.out.println("Char");
	            	tf.setDocument(new CharDocument((Integer) _arr_decimal_places[i][1]));
	            }
	            if(_arr_decimal_places[i][0].toString().equals("I")){
	            	
	            	System.out.println("Integer");
	            	System.out.println("vorkomma : nachkomma" + _arr_decimal_places[i][1] + ":" + _arr_decimal_places[i][2]);
	            	System.out.println("gesamt : " + (Integer) _arr_decimal_places[i][1] + 1);
	            	
	            	TabDecimalDocument ldd = new TabDecimalDocument((Integer) _arr_decimal_places[i][1] + 1); // evtl vorzeiche
	            	ldd.setPlacesBeforDecimalPoint((Integer) _arr_decimal_places[i][1] - (Integer) _arr_decimal_places[i][2]);
	            	ldd.setPlacesAfterDecimalPoint((Integer) _arr_decimal_places[i][2]);
	            	tf.setDocument(ldd);
	            }   
	            if(_arr_decimal_places[i][0].toString().equals("D")){
	            	System.out.println("Date");
	            	tf.setDocument(new DateDocument());
	            }  
	    		
	            column = table.getColumnModel().getColumn(i);

	            //Umgeschriebener CellEditor, der Hintergrundfarben festlegt
	            System.out.println(_arr_decimal_places[i][0].toString());
	            column.setCellEditor(new MyTableCellEditor(tf,_arr_decimal_places[i][0].toString()));
	            column.setPreferredWidth(_width_array[i]);
	        }
		}

und hier die Klasse TabDecimalDocument

Code:
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

/**
 * Diese Klasse ist ein Dokument für Textfelder, welches... 
 * 
 * 1. Eingabe auf x Zeichen begrenzt.
 * 2. Nur die Zeichen zulässt die in der Variable valid stehen
 * 3. Nur 1 Komma bzw. Minus zulässt
 * 4. Auf Vor- und Nachkommastellen achtet(anzahl)
 *
 * Die Zuweisung geschieht über
 * JTextfield.setDocumenT(new TabDecimalDocument(int anzahl));
 */
public class TabDecimalDocument extends PlainDocument{

	private static final long serialVersionUID = 5032290234368360350L;
	
	private int maxLen = -1;
	private int places_befor_decimal_point = 0;
	private int places_after_decimal_point = 0;


    /**
     * Konstruktor für das Validationdokument
     * @param int limit: maximale Anzahl der einzugebenen Zeichen
     */
	  public TabDecimalDocument(int maxLen) { 
		  this.maxLen = maxLen; 
	  }

    /**
     * Funktion überschreibt die Methode insertString von PlaintDocument
     * @param int offset: Position
     * @param String str: der String
     * @param AttributeSet attr: Attributset
     */
    public void insertString (int offset, String str, AttributeSet attr) throws BadLocationException {
    	   
        //Zeichenkette mit den gültigen Zeichen
        String valid = "-.0123456789 ";

	    if (str != null && maxLen > 0 && this.getLength() + str.length() > maxLen) {
		    	
	        java.awt.Toolkit.getDefaultToolkit().beep();
	        return;
	    }
	    
	    // wenn das '-' nicht am anfang steht wird es nicht zugelassen
	    if(offset != 0 && str.equals("-")){
	    	return;
	    }
	    
	    for (int i=0; i<str.length();i++) {
	    	// nur gültige Zeichen zulassen
	        if (valid.indexOf(str.charAt(i)) == -1) {
	            return;
	        }
            // nur einen Punkt('.') zulassen
            String str_eingabe = getText(0, offset) + str;
            int count = 0;
            for (int y = 0; y < str_eingabe.length(); y++){
            	if(str_eingabe.charAt(y) == '.'){
            		count++;
            	}
            	if(count > 1){
            		return;
            	}
            }
            // nur ein Minus('-') zulassen
            count = 0;
            for (int y = 0; y < str_eingabe.length(); y++){
            	if(str_eingabe.charAt(y) == '-'){
            		count++;
            	}
            	if(count > 1){
            		return;
            	}
            }
            
            // Vor- und Nachkommastellen prüfen 
            if(str_eingabe.indexOf("." ) != -1){
                // prüfung Nachkommastellen
                if(str_eingabe.substring(str_eingabe.indexOf(".")+1).length() > places_after_decimal_point)
                	return;
                // prüfung Vorkommastellen (wenn '.' vorhanden)
                if(str_eingabe.substring(0, str_eingabe.indexOf(".")).length() > places_befor_decimal_point)
                	return;
            }else{     	
                // prüfung Vorkommastellen (wenn kein '.' vorhanden)
                if(this.getLength() + str.length() > places_befor_decimal_point)
                	return;
            }
            
	    }
	    
	      // Den resultierenden String zusammensetzen
	      String s = new StringBuffer(getText(0, getLength())).insert(offset, str).toString();
	      // und gucken, ob Format stimmt
	      if(s.matches("[0-9]+(,[0-9]{0,2})?")){

        
		        //Wichtig Aufruf der übergeordneten Methode
		        super.insertString(offset, str, attr);
	      }
    }
    public void setPlacesBeforDecimalPoint(int places){
    	places_befor_decimal_point = places;
    }
    public void setPlacesAfterDecimalPoint(int places){
    	places_after_decimal_point = places;
    }
}
 

Zed

Bekanntes Mitglied
setHorizontalAlignment() macht der CellRenderer.

Mach dir eine Klasse leite die von DefaultTableCellRenderer ab.

und überschreibe die Methode.
Code:
public Component getTableCellRendererComponent(JTable aTable, Object aValue, boolean isSelected, boolean cellHasFocus, int aRow, int aColumn){
Component theComp = super.getTableCellRendererComponent(aTable, aValue, aIsSelected, aCellHasFocus, aRow, aColumn);

setHorizontalAlignment(TableModel.EColumns.values()[aColumn].getHorizontalAlignment())

return theComp;
}

// Ab hier ist es nicht mehr der CellRenderer
	/**
	 * Fügt einen CellRenderer an die Tabele
	 */
	private void applyCellRenderer() {
		for(EColumns eachCol: EColumns.values()) {
			TableColumn tmp = getMainTable().getColumnModel().getColumn(eachCol.ordinal());
			tmp.setCellRenderer(new CellRenderer());
		}
	}


Musst etwas anpassen da mein Cellrenderer auf einem TableModel das Enum als Grundlage benutzt aufsetzt.
 
G

Gast2

Gast
Code:
public class RightlRenderer
    implements TableCellRenderer
{

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        JTextfiled c = (JTextfiled)value;
        c.setAlignt.....
    }
}
 

MScalli

Bekanntes Mitglied
sry.. hat bisschen gedauert.. war ein bisschen verwirrend mit dem renderer..
habe ich noch nie benutzt.

bevor ich meine Lösung Poste... hat noch wer ne Idee wegen den Kommastellen die untereinander stehen sollten??

Hier die Lösung

Code:
import java.awt.Component;

import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

/**
 * CellRenderer bis jetzt nur zum setzten des Alignments

 * 
 * @author MScalli
 *
 */
public class CellRendererAlign extends DefaultTableCellRenderer{

	private static final long serialVersionUID = -9016883121660258044L;
	int alignment;
	
	public Component getTableCellRendererComponent(JTable aTable, Object aValue, boolean isSelected, boolean cellHasFocus, int aRow, int aColumn){
		System.out.println("getTableCellRenderer()");
		Component theComp = super.getTableCellRendererComponent(aTable, aValue, isSelected, cellHasFocus, aRow, aColumn);
	
		setHorizontalAlignment(alignment);

		return theComp;
	}
	
	/**
	 * setzt das Alignment/Ausrichtung

	 * Beispiel:

	 * 

	 * column = table.getColumnModel().getColumn(i);

	 * 
           
	 * // aufruf CellRenderer und Alignment aller Zellen auf RIGHT setzten

	 * CellRendererAlign cr = new CellRendererAlign();

	 * column.setCellRenderer(cr);

	 * cr.setAlignment(SwingConstants.RIGHT);

	 * 
    
	 * @param _alignment
	 */
	public void setAlignment(int _alignment){
		alignment = _alignment;
	}
}
 

MScalli

Bekanntes Mitglied
habe es mit den '.' untereinander so gelöst das ich per hand beim verlassen der Zelle die Fehlenden '0'en einfach anhänge.

Danke an alle!!

Gruss MScalli
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben