JTable mit Renderer sortiert die gerenderte Spalte nicht richtig

Thomas Lorenz

Bekanntes Mitglied
Servus Gemeinde,

die folgende Table soll in Row 10 eine farbliche Darstellung der Row 9 wiedergeben. Dabei gibt es in Row 9 zwei Begriffe (übergeben und gespeichert). Spalte 10 soll nun die Farben rot, oder grün darstellen.
Die Table funktioniert soweit prima.


Nach dem Laden der Werte ist alles wunderbar.
Row 9 Row 10
gespreichert String : gespeichert (Farbe grün)
übergeben String : übergeben (Farbe rot)
übergeben String : übergeben (Farbe rot)


Wenn ich in dieser Spalte den Stringwert der Spalte 9 wiedergebe, dann sortiert er dies genauso, wie es vorgesehen habe.

Wenn ich nun nach Spalte 9 sortiere (z.B. absteigend):

Row 9 Row 10
übergeben String : übergeben (Farbe grün)
gespreichert String : gespeichert (Farbe rot)
gespreichert String : gespeichert (Farbe rot)

Die Farbe bleibt trotz Sortieren an der gleichen Stelle, sprich gleichen Reihe.

Java:
package _Pol649;

import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Vector;
 
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.Timer;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

import sun.tools.jconsole.inspector.TableSorter;
 
public class ReportDataTable extends JFrame implements Comparable <ReportData>{
    
  

    private String[] indexString = new String []{"", "Datum", "Streifenart", "Status"};
    private int selectedRow = 0;
    Message msg = new Message();
    private Timer 	messageTimer;
    private boolean 	timerFlag = true;
    public static ArrayList<ReportData> reportList = new ArrayList<ReportData>();
    
    
    public static String[] reportStatus 	= {"übergeben", "korrigieren", "gespeichert"};
    ReportLogData reportLog;
    SystemData _Sys;
    ErrorHelper _Error;
    PropertyData _Data;
    CheckFiles _Files;
    JFrame _Main;
    ReportData report;
    
    JFrame frame 				= new JFrame ( "Übersicht der eigenen Vorgänge" );
    // Unser TableModel (siehe unten)
    final ReportModel model 			= new ReportModel();

    // Das JTable initialisieren
    public JTable table 				= new JTable( model );
    JScrollPane scr_table 			= new JScrollPane(table);
    
	
    // Buttons, damit das alles schöner aussieht.
    final JButton 	bt_close		= new JButton("zur Hauptansicht");
    final JButton 	bt_open 		= new JButton("Vorgang öffnen");
    final JButton	bt_delete		= new JButton("Vorgang löschen");
    final JButton	bt_send			= new JButton("Vorgang übergeben");
    
   
    
    BorderLayout	box 			= new BorderLayout();
    // Die Layout's für den unteren Bereich
    GridLayout		gridSouth		= new GridLayout(2,1);
    GridLayout		gridSouthOne		= new GridLayout(1,3);
    GridLayout		gridSouthTwo		= new GridLayout(1,1);
    GridLayout		grid			= new GridLayout(1,2);
    
    JPanel 		panel 			= new JPanel();
    JPanel 		south 			= new JPanel();
    JPanel		south1			= new JPanel();
    JPanel		south2			= new JPanel();
    JPanel 		north 			= new JPanel();
    JPanel 		center 			= new JPanel();
    JPanel 		content 		= new JPanel();
    JLabel 		entries 		= new JLabel();
    JLabel 		lb_InfoWindow		= new JLabel();
    
    public JLabel	lb_numberOfReports	= new JLabel();
	
    
    public ReportDataTable() {
	this._Sys = SystemData.getInstance();
	this._Error = ErrorHelper.getInstance();
	this._Data = PropertyData.getInstance();
	this._Files = CheckFiles.getInstance();
	table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
	//table.setDefaultRenderer( Point.class, new PointRender());
	
	
	
	// Die Spaltenbreiten für die Table
	TableColumnModel columnModel = table.getColumnModel();
	columnModel.getColumn(0).setPreferredWidth(80);
	columnModel.getColumn(1).setPreferredWidth(80);
	columnModel.getColumn(2).setPreferredWidth(100);
	columnModel.getColumn(3).setPreferredWidth(120);
	columnModel.getColumn(4).setPreferredWidth(90);
	columnModel.getColumn(5).setPreferredWidth(160);
	columnModel.getColumn(6).setPreferredWidth(80);
	columnModel.getColumn(7).setPreferredWidth(110);
	columnModel.getColumn(8).setPreferredWidth(250);
	columnModel.getColumn(9).setPreferredWidth(80);
	columnModel.getColumn(10).setPreferredWidth(15);

	// Den Buttons ein paar Reaktionen geben
	bt_close.addActionListener(new ActionListener(){
	   public void actionPerformed(ActionEvent e){
	       closeWindow();
	   }
	});
    }
    
    private void deleteLogData(ReportModel model){
	model.deleteData();
    }
    
    public Container addComponentsToPane(){
	/* Dieser Timer hat eine Laufzeit, die von _Sys.getTimerInfo() bestimmt wird.
         * Nach dieser Zeit füllt er das InfoFenster (unten) mit einer 
         * Standardmeldung mit einem zusätzl. Zeitstempel
         * Durch 'setRepeats(false) wird der Timer nach jedem Aufruf nur
         * einmal aufgerufen.
         */
        messageTimer = new Timer(_Sys.getTimerInfo(), new ActionListener() {
	            public void actionPerformed(final ActionEvent e) {
	        	clearInfoWindow();
	            }
	        });
	     messageTimer.setRepeats(false);
	Container pane = getContentPane();
	// Zunächst wird das Hauptpanel erzeugt
	panel.setLayout(box);
	panel.setBorder(new EmptyBorder(20,20,20,20));
	panel.setBackground(_Sys.getBackground());
	
	
		
	panel.add( scr_table, BorderLayout.CENTER );
	// Der TableRowSorter wird die Daten des Models sortieren
	final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>();
	        
	// Der Sorter muss dem JTable bekannt sein
	table.setRowSorter( sorter );
	        
	// ... und der Sorter muss wissen, welche Daten er sortieren muss
	sorter.setModel( model );
	        
	// hier kommt die Sortierung der Datumsspalte
	sorter.setComparator(5, new Comparator<String>(){
	@Override
	public int compare(String o1, String o2) {
	    int e = (Integer.parseInt(o1.substring(6,8))*10000) + (Integer.parseInt(o1.substring(3, 5))*100)+ (Integer.parseInt(o1.substring(0,2)));
	    int f = (Integer.parseInt(o2.substring(6,8))*10000) + (Integer.parseInt(o2.substring(3, 5))*100)+ (Integer.parseInt(o2.substring(0,2)));
	    if(e < f ){return 1;}
	    if(e == f ){return 0;}
	    if(e> f ){return -1;}
	    return 0;}});
	
	
	sorter.allRowsChanged();
	sorter.sort();
	

	
	
	 table.getColumnModel().getColumn(10).setCellRenderer(
	                new DefaultTableCellRenderer() {
	                    @Override
	                    public Component getTableCellRendererComponent(
	                            JTable table, Object value, boolean isSelected,
	                            boolean hasFocus, int row, int column) {
	 
	                        Component component = super
	                                .getTableCellRendererComponent(table, value,
	                                        isSelected, hasFocus, row, column);
	 
	                        if (model.getValueAt(row, 9).toString().equals(_Sys.getReportStatusText(1))) {
	                            component.setBackground(_Sys.getTableYellow());
	                            
	                        }
	                        if (model.getValueAt(row, 9).toString().equals(_Sys.getReportStatusText(0))) {
	                            component.setBackground(_Sys.getTableRed());
	                            
	                        }
	                        if (model.getValueAt(row, 9).toString().equals(_Sys.getReportStatusText(2))) {
	                            component.setBackground(_Sys.getTableGreen());
	                            
	                        }
	                        return component;
	                    }
	                });
	 
	
	            
	table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
	// SelectionListener für die Table
	table.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
	    public void valueChanged(ListSelectionEvent e) {
		
		setSelectedRow(table.getSelectedRow());
		setButtonsVisible(model.getValueAt(table.getSelectedRow(), 9).toString());
		
		}
	});
	table.addMouseListener(new MouseListener(){
	    public void mouseClicked(MouseEvent e) {
		int i = e.getClickCount();
		if(i == 2){
		    if(!isTableSelect()){return;}
		    checkReport();
		    CollectionController controller = new CollectionController();
		    controller.getDateOfReport((String) model.getValueAt(table.getSelectedRow(), 11));
		    if(checkStatusForOpen( model.getValueAt(table.getSelectedRow(),9).toString())){  
			// ab hier muss das Öffnen in der Anwendung, oder als pdf-Datei ermöglicht werden
			}

		
		}
	    }

	    public void mouseEntered(MouseEvent e) {}

	    public void mouseExited(MouseEvent e) {}

	    public void mousePressed(MouseEvent e) {}

	    public void mouseReleased(MouseEvent e) {}
	    
	});
	table.setToolTipText(_Data.getToolTipTextsForButtons().elementAt(26));
	
	north.setBorder(new EmptyBorder(50,50,50,50));
	
	
	 
	
	// Das untere Panel besteht aus zwei weiteren Panels (south1 und south2)
	south.setBorder(new EmptyBorder(10,20,10,20));
	south.setLayout(gridSouth);
	
	south1.setLayout(gridSouthOne);
	south1.setBorder(new EmptyBorder(30,80,30,80));
	bt_close.setMnemonic('Z');
	bt_close.setToolTipText(_Data.getToolTipTextsForButtons().elementAt(30));
	south1.add(bt_close, BorderLayout.SOUTH );
	
	bt_open.setToolTipText(_Data.getToolTipTextsForButtons().elementAt(35));
	// Listener für das Öffnen von Vorgängen 
	bt_open.addActionListener(new ActionListener(){
	    public void actionPerformed(ActionEvent e) {
		// keine Auswahl
		if(!isTableSelect()){return;}
		
		checkReport();
		if(checkStatusForOpen( model.getValueAt(table.getSelectedRow(),9).toString())){
        		// Wurde bereits ein Vorgang geöffnet
        		if(!ReportData.isOpen()){ 
        		
        		    // Handelt es sich dabei um die gleiche Vorgangsnummer
        		    if(ReportData.sameReport(model.getValueAt(table.getSelectedRow(),11).toString())){
        						
        			if(ReportData.isChanged()){	// Wurde an dem bestehenden Vorgang eine Änderung vorgenommen?
        			    // Beide Vorgänge haben einen unterschiedlichen Inhalt
        			    if(ReportData.overwriteReport()){	// Der geänderte Vorgang soll überschrieben werden.
        				loadSelectedReport();
        				}
        			    else{	// Vorgang wird nicht überschrieben				
        				_Error.getErrorMessage(508, 
        					new Exception().getStackTrace()[0].getClassName() + "/" + new Exception().getStackTrace()[0].getMethodName(),"");
        					setInfoText(_Error.getErrorClassification(), _Error.getErrorText1(), _Error.getErrorText2(), 
        						_Error.getErrorText3(), _Error.getErrorText4(), _Error.getExtraText());
        				return;
        				}
        			}
        			else{		// Der geöffnete Vorgang wurde nicht verändert
        			    loadSelectedReport();
        			    }
        		    }
        		    // Ein Vorgang mit einer anderen Vorgangsnummer ist bereits geöffnet
        		    // Soll dieser Vorgang gespeichert werden?
        		    else{
            			if(!ReportData.overwriteDifferentReport()){	// Vorgang wird nicht überschrieben
            			    _Error.getErrorMessage(508, 
            				new Exception().getStackTrace()[0].getClassName() + "/" + new Exception().getStackTrace()[0].getMethodName(),"");
            			    setInfoText(_Error.getErrorClassification(), _Error.getErrorText1(), _Error.getErrorText2(), 
            				    _Error.getErrorText3(), _Error.getErrorText4(), _Error.getExtraText());
            			    return;
            			    }
                    		else{	// Überschreiben
                    		    loadSelectedReport();
                		}
        		    }
        		}
		}
		loadSelectedReport();
		}
	});
	south1.add(bt_open, BorderLayout.SOUTH);
	bt_delete.setForeground(Color.red);
	bt_delete.setToolTipText(_Data.getToolTipTextsForButtons().elementAt(34));
	bt_delete.addActionListener(new ActionListener(){...
	    
	});
	
	south1.add(bt_delete);
	bt_send.setToolTipText(_Data.getToolTipTextsForButtons().elementAt(36));
	bt_send.addActionListener(new ActionListener(){...
	});
	south1.add(bt_send);
	
	south.add(south1);
	
	south2.setLayout(gridSouthTwo);
	// Das Aussehen der InfoBox
	Border loweredbevel;
	loweredbevel = BorderFactory.createLoweredBevelBorder();
	lb_InfoWindow.setSize(new Dimension(300,300));
	lb_InfoWindow.setBorder(loweredbevel );
	lb_InfoWindow.setOpaque(true);
	lb_InfoWindow.setBackground(_Sys.getBackground());
	lb_InfoWindow.setForeground(Color.black);
	msg.setText("<html>" + "" + "<br>" + "" + "<br>" +
		"" + "<br> " + ""  + "<br>" + "" + "<br>" +  "</B/html>");
	lb_InfoWindow.setText(msg.getText());
	
	south2.add(lb_InfoWindow);
	south.add(south2);
	
	panel.add(north, BorderLayout.NORTH);
	panel.add(south, BorderLayout.SOUTH);
	pane.add(panel);
	return pane;
    }
	
    public void createAndShowGUI1(JFrame main){
	this._Main = main;
	
	frame.setContentPane(addComponentsToPane());
 	frame.setSize(1260, 800);
 	frame.setDefaultCloseOperation( JFrame.DO_NOTHING_ON_CLOSE);
 	frame.setBackground(_Sys.getBackground());
 	frame.setResizable(false);
 	frame.setLocationRelativeTo(null);
	frame.setVisible( true );
	
	
	
	model.deleteData();
	reportList.clear();
	ReportData.reportList.clear();
	loadReportFromMainFile(model, "User", _Sys, _Files); // liest die Vorgänge des Anwenders aus der ....FileDataUser.txt ..
	loadReportFromMainFile(model, "Main", _Sys, _Files); // .. und hier aus der FileDataMain.txt
	}
    
    public void sendReportToMain(String reportNumber){
	...
	
    }

  

    public int compareTo(ReportData o) {
	int obj = Integer.parseInt(o.getDateAsSimpleDateFormat().substring(0, 2) + o.getDateAsSimpleDateFormat().substring(3,5));
	int th = Integer.parseInt(o.getDateAsSimpleDateFormat().substring(0, 2) + o.getDateAsSimpleDateFormat().substring(3,5));
		    if(th < obj ){
		    return -1;
		}
		if(th == obj ){
		    return 0;
		}
		if(th > obj ){
		    return 1;
		}
	return 0;
	
	
	}
    
    
    public void loadSelectedReport(){
	...
    }
    
    public boolean checkStatusForOpen(String status){
	if(status.equals(reportStatus[0])){return false;}
	else return true;
    }
    
     
    
    public boolean checkReportStatusForOpen(int i){
	if(reportStatus[i].equals(reportStatus[0])){
	    return false;
	}
	return true;
    }
    
    private void setButtonsVisible(String row){
	if(row.equals("übergeben")){
	    this.bt_delete.setVisible(false);
	    this.bt_send.setVisible(false);
	    this.bt_open.setText("lesend öffnen");
	}
	if(row.equals("korrigieren")){
	    this.bt_delete.setVisible(false);
	    this.bt_send.setVisible(true);
	    this.bt_open.setText("öffnen");
	    this.bt_open.setVisible(true);
	    
	}
	if(row.equals("gespeichert")){
	    this.bt_delete.setVisible(true);
	    this.bt_send.setVisible(true);
	    this.bt_open.setVisible(true);
	    this.bt_open.setText("öffnen");
	}
    }
    
    private boolean checkReportStatusToDelete(){
	if(!model.getValueAt(selectedRow, 9).equals(getReportStatus(2))){
	    _Error.getErrorMessage(503, 
			new Exception().getStackTrace()[0].getClassName() + "/" + new Exception().getStackTrace()[0].getMethodName(),"");
	    setInfoText(_Error.getErrorClassification(), _Error.getErrorText1(), _Error.getErrorText2(), _Error.getErrorText3(), _Error.getErrorText4(), _Error.getExtraText());
	    return false;
	    
	}
	else return true;
    }
    
    private boolean isTableSelect(){
	// Ist ein Vorgang ausgewählt?
	if(table.getSelectedRow()== -1){
	    _Error.getErrorMessage(502, 
			new Exception().getStackTrace()[0].getClassName() + "/" + new Exception().getStackTrace()[0].getMethodName(),"");
	    setInfoText(_Error.getErrorClassification(), _Error.getErrorText1(), _Error.getErrorText2(), _Error.getErrorText3(), _Error.getErrorText4(), _Error.getExtraText());
	    return false;
	}
	return true;
    }
    
    private void checkReport(){
	// Sollte der Vorgang den Status "übergeben" haben, so kann er nicht geöffnet werden
	if(model.getValueAt(getSelectedRow(), 8).equals(getReportStatus(0))){
	    _Error.getErrorMessage(501, 
			new Exception().getStackTrace()[0].getClassName() + "/" + new Exception().getStackTrace()[0].getMethodName(),"");
	    setInfoText(_Error.getErrorClassification(), _Error.getErrorText1(), _Error.getErrorText2(), _Error.getErrorText3(), _Error.getErrorText4(), _Error.getExtraText());
	}
    }
    
    private static String getReportStatus(int i){
	return reportStatus[i];
    }
	
    private void setSelectedRow(int a){
	selectedRow = a;
    }
    
    private int getSelectedRow(){
	return selectedRow;
    }
	
    private void closeWindow(){
        frame.setVisible(false);
        _Main.setEnabled(true);
        }
    
  ...
    }
	


/** Diese Methode liest alle Vorgänge aus der Datei "FileDataMain.txt" aus, deren
 * Personalnummer die des Anwenders entsprechen.
 */
public static ReportLogData loadReportFromMainFile( ReportModel model, String files , SystemData sys, CheckFiles _File){
    
   ...

	
}

//Das Vehikel ist eine total unabhängige Klasse, die mit einer
//Tabelle eigentlich gar nichts zu tun hat.
class ReportLogData{
    	private String reportNumber;
	private String artOfPatrol;
	private String operationOffice;
	private String patrolArea;
	private String patrolIdentification;
	private String licenceNumber;
	private String date;
	private boolean nightService;
	private String patrolTime;
	private String patrolAttender;
	private String reportStatus;


	public ReportLogData(String reportNumber, String employee, String personalNr, String date, String time,
		String status, String ip, boolean version, String patrolTime, String patrolAttender, String reportStatus) {
	   this.reportNumber = reportNumber;
	    this.artOfPatrol = employee;
	   this.operationOffice = personalNr;
	   this.patrolArea = date;
	   this.patrolIdentification = time;
	   this.licenceNumber = status;
	   this.date = ip;
	   this.nightService = version;
	   this.patrolTime = patrolTime;
	   this.reportStatus = reportStatus;
	   this.patrolAttender = patrolAttender;
	   
	   }

	public String getArtOfPatrol(){ return artOfPatrol; }
	public String getOperationOffice(){ return operationOffice; }
	public String getPatrolArea(){ return patrolArea; }
	public String getPatrolIdentification(){ return patrolIdentification; }
	public String getLicenceNumber(){ return licenceNumber; }
	public String getDate(){ return date; }
	public boolean getNightService(){ return nightService;} 
	public String getPatrolTime(){return patrolTime;}
	public String getReportStatus(){return reportStatus;}
	public String getPatrolAttender(){return patrolAttender;}
	public String getReportNumber(){return reportNumber;}
	
	
	
	
}


//Unsere Implementation des TableModels
class ReportModel implements TableModel{
	private static Vector reports = new Vector();
	private Vector listeners = new Vector();
 
	public void addVehicle( ReportData log ){		// Das wird der Index des Vehikels werden
		int index = reports.size();
		// letzter Eintrag erscheint zuerst
		reports.add(0, log);
		// Jetzt werden alle Listeners benachrichtigt
 
		// Zuerst ein Event, "neue Row an der Stelle index" herstellen
		TableModelEvent e = new TableModelEvent( this, index, index, 
				TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT );
 
		// Nun das Event verschicken
		for( int i = 0, n = listeners.size(); i<n; i++ ){
			((TableModelListener)listeners.get( i )).tableChanged( e );
		}
	}
	
	
 
	// Die Anzahl Columns
	public int getColumnCount() {
		return 11;
	}
	
	public static Vector getModelVector(){
	    return reports;
	}
 
	// Die Anzahl Vehikel
	public int getRowCount() {
		return reports.size();
	}
 
	// Die Titel der einzelnen Columns
	public String getColumnName(int column) {
		switch( column ){
			case 0: return "Streifenart";
			case 1: return "Einsatzdst.";
			case 2: return "Streifenbereich";
			case 3: return "Streifenbezeichnung";
			case 4: return "amtl. Kz.";
			case 5: return "Datum";
			case 6: return "Nachtdienst";
			case 7: return "Streifenzeit";
			case 8: return "Besatzung";
			case 9: return "Status";
			case 10:return " ";
			case 11:return " ";
			default: return "";
		}
	}
 
	// Der Wert der Zelle (rowIndex, columnIndex)
	public Object getValueAt(int rowIndex, int columnIndex) {
		ReportData vehicle = (ReportData)reports.get( rowIndex );
 
		switch( columnIndex ){
			case 0: return vehicle.getArtOfPatrol();
			case 1: return vehicle.getOperationOffice();
			case 2: return vehicle.getPatrolArea();
			case 3: return vehicle.getPatrolIdentification();
			case 4: return vehicle.getLicenceNumber();
			case 5: return vehicle.getDateAsSimpleDateFormat();
			case 6: return vehicle.getNightService();
			case 7: return vehicle.getPatrolTime();
			case 8: return vehicle.getPatrolAttender();
			case 9: return vehicle.getReportStatus();
			case 10: return vehicle.getReportStatus();
			case 11: return vehicle.getReportNumber();
			default: return null;
		}
	}
 
	// Eine Angabe, welchen Typ von Objekten in den Columns angezeigt werden soll
	public Class getColumnClass(int columnIndex) {
		switch( columnIndex ){
			case 0: return String.class;
			case 1: return String.class;
			case 2: return String.class;
			case 3: return String.class; 
			case 4: return String.class;
			case 5: return String.class;
			case 6: return Boolean.class;
			case 7: return String.class;
			case 8: return String.class;
			case 9: return String.class;
			case 10: return Color.class;
			case 11: return String.class;
					default: return null;
		}	
	}
 
	public void addTableModelListener(TableModelListener l) {
		listeners.add( l );
	}
	public void removeTableModelListener(TableModelListener l) {
		listeners.remove( l );
	}
 
 
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		return false;
	}
	public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
		// nicht beachten
	}
	public void deleteData(){
	    reports.removeAllElements();
	    
	}
}
 

KrokoDiehl

Top Contributor
Ohne deinen ganzen Code gelesen und verstanden zu haben, tippe ich auf folgende Stellen im Renderer:
Java:
                            if (model.getValueAt(row, 9).toString().equals(_Sys.getReportStatusText(1))) {
                                component.setBackground(_Sys.getTableYellow());
                                
                            }
                            if (model.getValueAt(row, 9).toString().equals(_Sys.getReportStatusText(0))) {
                                component.setBackground(_Sys.getTableRed());
                                
                            }
                            if (model.getValueAt(row, 9).toString().equals(_Sys.getReportStatusText(2))) {
                                component.setBackground(_Sys.getTableGreen());
                                
                            }
Hier greifst du auf das Tabellenmodell
Code:
(row, 9)
zu. Im Renderer tauchen aber die View-Koordinaten auf.
Eine Tabelle hat nämlich zwei Koordinatensysteme: View und Modell. Die Modellkoords. sind fix, die View-Koords. ändern sich, wenn man zB sortiert oder Spalten vertauscht.
Um diese jeweils umzurechnen gibt es die Methoden
Code:
table.convertRowIndexToModel()
usw.
Ich würde sagen, im obig genannten Code musst du die
Code:
row
-Angabe derart umrechnen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
D Swing JTable Renderer Grafikfehler AWT, Swing, JavaFX & SWT 0
M JTable Cell Renderer- Terminplaner AWT, Swing, JavaFX & SWT 2
B JTable Renderer / Listener AWT, Swing, JavaFX & SWT 7
Z Swing JTable: Boolean Renderer AWT, Swing, JavaFX & SWT 3
B LookAndFeel Cell Renderer für JTable bei Nimbus Look and Feel AWT, Swing, JavaFX & SWT 2
H variable Höhe einer JTextArea (als Renderer/Editor) als Zelle einer JTable AWT, Swing, JavaFX & SWT 9
N JTable, Renderer mit Button AWT, Swing, JavaFX & SWT 3
D JTable - JCheckbox und Renderer AWT, Swing, JavaFX & SWT 2
E Drag&Drop JTable; Renderer füllt alle Zellen AWT, Swing, JavaFX & SWT 10
N Verständnissfrage: Jtable und DefaultTableCell Renderer AWT, Swing, JavaFX & SWT 2
K jtable jpanel renderer AWT, Swing, JavaFX & SWT 2
C Fragen zur Darstellung einer JTable mittels Renderer AWT, Swing, JavaFX & SWT 2
K JTable Renderer AWT, Swing, JavaFX & SWT 11
K JTable Renderer - Probs mit Icon AWT, Swing, JavaFX & SWT 3
T Problem mit JTable - Renderer AWT, Swing, JavaFX & SWT 3
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
R Swing JTable und Spaltenausrichtung AWT, Swing, JavaFX & SWT 8
G JTable füllen AWT, Swing, JavaFX & SWT 1
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
M JTable.setDefaultRenderer(...) greift nicht AWT, Swing, JavaFX & SWT 0
J JTable: Eingabe in Tabellenzelle korrigieren AWT, Swing, JavaFX & SWT 4
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
S Jtable defaultRenderer wohin damit ? AWT, Swing, JavaFX & SWT 23
T Swing JTable / FocusListener AWT, Swing, JavaFX & SWT 0
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
J addRow bei JTable AWT, Swing, JavaFX & SWT 6
M Jtable gibt -1 wert bei selectedRow und Column AWT, Swing, JavaFX & SWT 3
Meeresgott Swing JTable AWT, Swing, JavaFX & SWT 4
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
Thallius JTable dynamisch Spaltenanzahl verändern AWT, Swing, JavaFX & SWT 2
Thallius JTable dynamisch laden? AWT, Swing, JavaFX & SWT 2
B Swing JTable sortieren AWT, Swing, JavaFX & SWT 2
T Swing JTable auslesen und befüllen AWT, Swing, JavaFX & SWT 8
B JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 1
J JTable und Suchlogik AWT, Swing, JavaFX & SWT 4
Viktim Swing JTable mit Tab verlassen AWT, Swing, JavaFX & SWT 1
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
Viktim Swing JTable Mit Tab druch Zeilen Wechseln AWT, Swing, JavaFX & SWT 5
Thallius Warum refrehsed mein JTable nicht? AWT, Swing, JavaFX & SWT 5
Ghostman1711 Hinzufügen ausgewählter Dateinen des Filechoosers zu einem JTable AWT, Swing, JavaFX & SWT 9
S Swing JTable - Einzelne Rows einfärben AWT, Swing, JavaFX & SWT 11
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
K JTable getValueAt() klappt nicht immer AWT, Swing, JavaFX & SWT 1
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
P JTable - bei Eingabe Selektion AWT, Swing, JavaFX & SWT 0
P Fokus auf Zelle in JTable AWT, Swing, JavaFX & SWT 1
S Swing Deselektion in JTable verhindern AWT, Swing, JavaFX & SWT 0
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
N Swing Print JTable mit AbstractTableModel AWT, Swing, JavaFX & SWT 1
Ananaskirsche Swing jTable Reihen zuviel eingefügt AWT, Swing, JavaFX & SWT 12
P im JTable die Schriftfarbe ändern AWT, Swing, JavaFX & SWT 19
T Swing JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Dreiecke in bestimmte Zellen einer JTable AWT, Swing, JavaFX & SWT 9
LexeB4F Zelle in JTable gezielt einfärben AWT, Swing, JavaFX & SWT 4
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben