Swing Bestimmte Berechnung von Spalten durchführen und dann die Zeilen nach bestimmten Kriterien einfärben

Dino264

Mitglied
Hallo liebe Community,

ich hoffe ihr könnt mir weiter helfen. Ich weiß es gab zu diesem Thema schon mehrere Posts doch, leider hat mir keiner davon bei der Lösung meines Problems geholfen.

Und zwar habe ich mir durch ein Skript von einem Orcale Server eine Tabelle auslesen lassen. Diese Tabelle habe ich nun in einer JTable ausgeben lassen.

Nun fängt mein Problem an.
Ich möchte zwei Spalten subtrahieren. Und zwar möchte ich eine Start-Zeit von einer End-Zeit abziehen um die gesamt Zeit zu ermitteln.

Die Spalte in der die Start-Zeit steht heißt Start-Zeit. Die End-Zeit Spalte heißt End-Zeit Spalte.

Das Problem ist das in den Spalten zuerst das Datum und dann die Uhrzeit steht. So sieht das dann aus: tt.mm.jjjj St.mm.se.

Die ganzen Zeilen sollen dann eingefärbt werden je nachdem ob das Ergebnis <, > oder = einer anderen Zahl ist

Leider weiß ich gar nicht wo ich da anfangen soll geschweige den wie ich das machen muss.

Ich poste euch nochmal meine 2 Klassen dazu.

Das ist die Klasse die die Tabelle ausliest und in einer JTable ausgibt:

Java:
package Test;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

import oracle.jdbc.*;
import oracle.jdbc.pool.OracleDataSource;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;


public class Sqlselection  implements ActionListener {
   	
	private static final String EXIT_ON_CLOSE = null;

	@Override
	public void actionPerformed(ActionEvent e) {
		
//	  public final static Vector COLUMN_IDENTIFIERS = new Vector() 
//	     {
//       add("id");
//       add("name");
//       add("dateOfBirth");
//       add("balance");
//   };
//};

         try
         {
            OracleDataSource ods = new OracleDataSource();
            ods.setUser("*******");
            ods.setPassword("*******");
            ods.setURL("jdbc:oracle:thin:@*********************************");
            OracleConnection con = (OracleConnection)(ods.getConnection ());

            Statement s1 = con.createStatement();

            ResultSet rs = s1.executeQuery("select * from *****************");
//           JTable table = new JTable(buildTableModel(rs));
            table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
//          TableColumn tm = table.getColumnModel().getColumn(0);
//          tm.setCellRenderer(new MyColumnRenderer());
          
//          Table.setDefaultRenderer( Object.class, new DefaultTableCellRenderer() {
//          TableColumn tm = table.getRowModel().getRow(0);

            JOptionPane.showMessageDialog(null, new JScrollPane(table));
            
            DefaultTableCellRenderer ren = new myclass();
               table.setDefaultRenderer(Object.class, ren);
             
            
           if(rs!=null)
           {
        	   while (rs.next())
               {
//                	System.out.println("concole, jjd, 34785, Hallo, ");
                	System.out.printf(
                		"%s, %s, %s, %s, %s, %s, %s, %s, %s, %s%n",
                		rs.getString(1), 
		               	rs.getString(2),
		                rs.getString(3),
		                rs.getString(4),
		                rs.getString(5),
		                rs.getString(6),
		                rs.getString(7),
		                rs.getString(8),
		                rs.getString(9),
		                rs.getString(10),
		                rs.getString(11)
                	 );
                }
            }
         }
         catch (Exception e2)
         {
            e2.printStackTrace();
         }        	 
	}


//	@SuppressWarnings("null")
	private static DefaultTableModel buildTableModel(ResultSet rs)
	        throws SQLException {
		
	    JTable table;
	    DefaultTableModel defaultTableModel = null;
	    
	    ResultSetMetaData metaData = rs.getMetaData();

		    
	    setDefaultCloseOperation(EXIT_ON_CLOSE);
//	    defaultTableModel.setColumnIdentifiers(COLUMN_IDENTIFIERS);
	    table = new JTable(defaultTableModel);
        table.setEnabled(false);
	    
	    
	    // names of columns
	    Vector<String> columnNames = new Vector<String>();
	    int columnCount = metaData.getColumnCount();
	    for (int column = 1; column <= columnCount; column++) {
	        columnNames.add(metaData.getColumnName(column));
	    }

	    // data of the table
	    
//	    defaultTableModel.setColumnIdentifiers(COLUMN_IDENTIFIERS);
	    
	    
	    Vector<Vector<Object>> data = new Vector<Vector<Object>>();
	    
	    while (rs.next()) {
	        Vector<Object> vector = new Vector<Object>();
	        for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
	            vector.add(rs.getObject(columnIndex));
	        }
	        data.add(vector);
	    }

	    return new DefaultTableModel(data, columnNames);

	}
	
		
	private static void setDefaultCloseOperation(String exitOnClose) {
		// TODO Auto-generated method stub
		
	}
	
}


Das ist die Klasse in der ich angefangen habe einen TableCellRenderer zu bauen aber ich komme einfach nicht weiter.

Java:
package Test;

import java.awt.Color;
import java.awt.Component;

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

public class myclass extends DefaultTableCellRenderer {

	private static final int VALIDATION_COLUMN = 4;  
	  public Component getTableCellRendererComponent(  JTable table, Object value, boolean isSelected, boolean hasFocus,int row,int col)
	  {
	      Component comp = super.getTableCellRendererComponent(table,  value, isSelected, hasFocus, row, col); 
	      String s =  table.getModel().getValueAt(row, VALIDATION_COLUMN ).toString();
	 
	        if(s.equalsIgnoreCase("1")) 
	       {
	            System.out.println("Open");
	            comp.setBackground(Color.RED);
	       }
	       return( comp );
	   } 
	}
	 
	
	
	
	
//	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
//	{
//		
//		super.getTableCellRendererComponent (table, value, isSelected, hasFocus, row, column);
//		double TRANSFER_TO_UGIS_DONE = Double.parseDouble(String.valueOf(value));
//		setForeground(Color.BLACK);            
//		if (TRANSFER_TO_UGIS_DONE < 5)
//	{                
//		setForeground(Color.RED);            
//		}
//	    return this;      
//	}
//
//	public static void setDefaultRenderer(Class<Object> class1,
//			DefaultTableCellRenderer defaultTableCellRenderer) {
//		 TODO Auto-generated method stub
//		
//	}


	
	//	Component component = super.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column);
//		int TRANSFER_TO_UGIS_DONE = ((Integer) table.getModel().getValueAt(row, 1 )).intValue();

//		if( TRANSFER_TO_UGIS_DONE == 1 )
//		{
//			component.setBackground(Color.yellow);
//		}
//		else
//		{
//			component.setBackground(Color.cyan);
//		}
//		return component;
//	}
//
//	public static void setDefaultRenderer(Class<Object> class1,
//			DefaultTableCellRenderer defaultTableCellRenderer) {
//		 TODO Auto-generated method stub
//		
//	}


Würde mich um schnelle Hilfe freuen denn eigentlich muss ich morgen damit fertig sein.
Würde mich freuen wenn ihr mir die Lösung direkt in meinen Code schreiben könntet.

Vielen Dank euch schon mal. Hoffe ich könnt mir helfen.

MfG

Dino264
 
Dino264 hat gesagt.:
Das Problem ist das in den Spalten zuerst das Datum und dann die Uhrzeit steht. So sieht das dann aus: tt.mm.jjjj St.mm.se.
Wie meinst du das ??? Sprechen wir hier von Strings ???
Wenn ja, versuche es doch mit der Methode "split" !!!
Sie gibt einen String-Array zurück, welcher die Teil-Strings des Originals enthält,
"gespalten" an den Teilen, die dem übergebenen Parameter entsprechen, in deinem Fall 8
Java:
String s = "12.34.5678 12.34.56";
String[] sdt = s.split( " " );


String[] sd = sdt[ 0 ].split( "." );

int[] id = new int[ sd.length ];

for ( int i = 0; i < id.length; i++ )
id[ i ] = Integer.parseInt( sd[ i ] );


String[] st = sdt[ 1 ].split( "." );

int[] it = new int[ st.length ];

for ( int i = 0; i < it.length; i++ )
it[ i ] = Integer.parseInt( st[ i ] );


System.out.println( "Datum: " );
for ( int i = 0; i < id.length; i++ )
System.out.print( id[ i ] + " * " );

System.out.println();

for ( int i = 0; i < it.length; i++ )
System.out.print( it[ i ] + " * " );
Ausgabe 8
"Datum: 12 * 34 * 5678 "
"Uhrzeit: 12 * 34 * 56 "

Hilft dir das weiter ???
 
Hallo Androbin,

danke erstmal für deine Hilfe. Da ich Urlaub etc. hatte habe ich deine Antwort jetzt erst gesehen. Ich habe es heute dann auch direkt ausprobiert leider ohne Erfolg. Er führt den Code zwar aus und in der Console steht dann auch Datum: doch nichts dahinter.

Des weiteren wüsste ich nicht wie ich den Codeschnipsel auf die Zeilen ebene pro Spalte in der JListe bekomme.

Ich glaube 🙂 das es Vector Objekte.

Bitte hilf mir nochmal weiter.

Das Problem ist, ich kenn mich mit Java geht so aus konnte es mal besser habe es aber halt lange nicht so wirklich angewendet.

Es wäre sehr hilfreich wenn du mir die Lösung das nächste Mal direkt in meinen Code posten könntest.

Danke schon mal im Vorraus.

MfG

Dino264
 
Ich helfe dir natürlich gerne weiter, das Problem ist nur, dass ich dein Problem nicht ganz durchschaue.
Und wenn du allgemein zum Theama Java mal Fragen haben solltest: Schreib' mir ne PN über mein Profil
 
Am Besten wäre du schreibst dir eine eigene Klasse, welche von AbstractTableModel ableitet.
Für die Daten die du aus der Datenbank ausliest am Besten eine Modelklasse um die Daten zu kapseln (Vectoren sind außerdem veraltet).

Nähere Infos findest du hier: How to use tables

Um die Differenz von 2 Daten zu berechnen lege ein Datumsformat fest (Stichwort: SimpleDateFormat) und wandle dies 2 Strings in ein Date Objekt um, diese können einfach subtrahiert werden (oder addiert, oder ...). Mit den Datumsformat kannst du das Ergebnis wieder ins gewünschte Format für die GUI bringen.
 
Zuletzt bearbeitet:
Hallo Joose,

leider komme ich erst jetzt dazu zu Antworten. Deine Antwort war sehr Hilfreich danke dir dafür. Leider ist dieses Projekt nun aber eingestellt worden. Da ich mich auf mein Abschlussprojekt vorbereiten soll, soll ich mich nochmal mehr mit Java auseinander setzen um wieder besser mit Java arbeiten zu können.

Aber wie gesagt Danke dir nochmals war sehr Hilfreich deine Antwort.

Mit freundlichen Grüßen

Dino264

Dino Zimmer
 

Zurück
Oben