JScrollPane --> Programm hängt sich beim scrollen auf

Skyzen

Mitglied
Hallo Leute,
ich bin noch java-anfänger und habe jetzt sehr viel im inet zu meinem problem gesucht aber nichts richtiges gefunden, das mir weiter hilft oder dass ich verstehe.
ich habe folgendes problem. auf einer gui oberfläche kann man einstellungen über den zeitraum vornehmen und dann gibt das programm einem in einer jTable welche auf einem jScrollPane liegt die gewünschten daten aus. das funktioniert auch ohne probleme und ich kann auch scrollen, solange es nicht viele daten sind. aber wenn es mehrere daten sind und man länger scrollen muss, muss ich nur einmal das rädchen an der maus komplett drehen oder den scrollbalken runter ziehen und es scrollt vllt einen halben cm bis cm und das programm hängt sich total auf, so dass ich es nur noch über den task-manager schließen kann.
beim recherchieren nach meinem problem bin ich auf folgendes gestoßen. kann es evtl daran liegen, dass die daten irgendwie nachgeladen werden müssen und man dass evtl in einem extra thread macht? oder liegt es an was ganz anderem? wie auch immer, den ansatz mit den threads und den daten nachladen habe ich nicht richtig verstanden wie man den umsetzt.
falls ihr mir weiter helfen könnt wäre zu der erklärung ein bisschen code ganz hilfreich 😉
vielen dank schon mal im voraus, ich weiß sonst echt nicht mehr weiter 🙁
 
Ich versuche mal einen Teil des Programms etwas besser zu erläutern.
In meiner Datenbank werden die An-/Abmeldezeiten von Mitarbeitern festgehalten.
Ich kann dann in meinem Programm Einstellungen über den Zeitraum vornehmen und mir gibt es dann die Daten in einer Tabelle aus. Dabei habe ich aber noch eine Spalte dazugefügt welche mir die Dauer anzeigt für den Zeitraum der Anmeldung bis zur Abmeldung und ich habe noch eine Spalte eingefügt welche mir die gesamte Dauer für das jeweilige Datum ausgibt. Das alles funktioniert soweit auch ohne Probleme und sieht dann wie im folgenden Bild aus. Aus diesem Grund gehe ich auch nicht weiter auf die Einstellungen, welche zur Datenbankausgabe vornehmen kann, drauf ein, da diese funktioniert.
Ich habe nun folgendes Problem, und zwar wenn die Tabelle nicht so lang ist, sprich es sind nicht so viele Datensätze dann funktioniert das Scrollen ohne Probleme. Aber sobald die Tabelle länger wird und und somit auch der Scroll-Bereich größer wird hängt das ganze Programm sich beim Scrollen auf und man kann es nur noch über den Task-Manager schließen.
Hat irgendjemand eine Idee an was das liegen kann oder was ich dagegen machen muss?
Ich bin nämlich echt am verzweifeln und das Programm wär endlich fertig wenn es sich nur nicht aufhängen würde. 🙁



Ich habe meine Klasse Database in welcher ich in dem Konstruktor den Treiber lade und die Verbindung zur Datenbank herstelle.
Java:
package database;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

public class Database {

	private Connection con;

	public Database(){
		try {
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // Treiber für ODBC
			con = DriverManager.getConnection("jdbc:odbc:mysql2odbc"); // Verbindung zu der Datenbank
		} catch (ClassNotFoundException | SQLException e) {
			e.printStackTrace();
		}
	}

In meiner Window-Klasse erstelle ich die Tabelle, danach erstell ich das ScrollPane und übergib diesem meine Tabelle. In der Methode anzeigen() wird meiner Tabelle dass das TableModell übergeben, nachdem ich die Einstellungen über den Zeitraum vorgenommen habe.

Java:
private void initialize() {
...
	tableZeit = new JTable();
	ausgabeZeit = new JScrollPane(tableZeit);
...
}

private void anzeigen(){		
	myTableModelZeit = new MyTableModelZeit();
	tableZeit.setModel(myTableModelZeit);
	tableZeit.setVisible(true);
}


Falls mein Fehler was mit meiner Table-Klasse zu tun hat ist hier mal noch der komplette Code dafür.
Als kleiner Hinweiß, die anderen beiden Konstruktoren verwende ich um die Zeiteinstellungen zu übergeben und meine Ausgabe in der Methode getValueAt() ist etwas komplexer, da ich Spalte 1 und 5 nicht redundant ausgeben will (siehe Bild oben).
Java:
package tables;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
import database.Database;
import database.Zeit;

public class MyTableModelZeit extends AbstractTableModel {

	private ArrayList<Zeit> arbeitszeitenEinzeln = new ArrayList<Zeit>();
	private static ArrayList<Zeit> arbeitszeitenGesamt = new ArrayList<Zeit>();
	
	private Database db;
	private Connection con;
	private Statement stmt;
	private ResultSet rs;
	private Zeit zeit;
	
	private static boolean istMonat = true;
	private static String benutzername = "";
	private static String monat = "";
	private static String zeitraumStart = "";
	private static String zeitraumEnde = "";
	
	
	// Konstruktoren
	public MyTableModelZeit() {
		this.db = new Database();
		this.con = db.getCon();
		updateFromDatabase();
	}
		
	public MyTableModelZeit(String monat) {
		MyTableModelZeit.monat = monat;
		MyTableModelZeit.istMonat = true;
	}
	
	public MyTableModelZeit(String zeitraumStart, String zeitraumEnde) {
		MyTableModelZeit.zeitraumStart = zeitraumStart;
		MyTableModelZeit.zeitraumEnde = zeitraumEnde;
		MyTableModelZeit.istMonat = false;
	}
	
	
	@Override
	public int getColumnCount() {
		return 5;
	}

	@Override
	public int getRowCount() {
		return arbeitszeitenEinzeln.size();
	}
	
	@Override
	public Object getValueAt(int row, int col) {
		switch (col){
			case 0:
				if((row != 0) && (arbeitszeitenEinzeln.get(row).getDatum()).equals(getValueAt((row-1), col))){
					return null;
				} else if((row != 0) && getValueAt((row-1), col) == null){
					int index = 2;
					while(true){
						if(getValueAt((row-index), col) != null){
							if((arbeitszeitenEinzeln.get(row).getDatum()).equals(getValueAt((row-index), col))){
								return null;
							} else{
								return arbeitszeitenEinzeln.get(row).getDatum();
							}
						}
						index += 1;
					}					
				} else{
					return arbeitszeitenEinzeln.get(row).getDatum();
				}
			case 1:
				return arbeitszeitenEinzeln.get(row).getVon();
			case 2:
				return arbeitszeitenEinzeln.get(row).getBis();
			case 3:
				return String.valueOf(arbeitszeitenEinzeln.get(row).getArbeitszeitEinzeln());
			case 4:
				if(getValueAt(row, 0) == null){
					return null;
				} else{	
					for(Zeit d : arbeitszeitenGesamt){
						if(d.getDatum().equals(getValueAt(row, 0))){
							return String.valueOf(d.getArbeitszeitGesamt());
						}
					}	
				}
		}
		return null;
	}

	@Override
	public String getColumnName(int col) {
		switch (col){
			case 0:
				return "Datum";
			case 1:
				return "von";
			case 2:
				return "bis";
			case 3:
				return "Arbeitszeit";
			case 4:
				return "Arbeitszeit Gesamt (Tag)";
			}
		return null;
	}
	
	public void updateFromDatabase() {
		arbeitszeitenEinzeln.clear();
		arbeitszeitenGesamt.clear();

		try {			
			stmt = con.createStatement();
			
			// Befüllen des Arrays arbeitszeitenEinzeln
			if(istMonat == true){
				String abfrage1 = "SELECT Datum, von, bis, ROUND(TIME_TO_SEC(TIMEDIFF(bis, von))/3600, 2) FROM Zeit " 
						+ "WHERE Benutzername = '" + benutzername + "' AND Datum LIKE '" + monat + "' ORDER BY Datum;";
				rs = stmt.executeQuery(abfrage1);
			} else if(istMonat == false){
				String abfrage1 = "SELECT Datum, von, bis, ROUND(TIME_TO_SEC(TIMEDIFF(bis, von))/3600, 2) FROM Zeit " 
						+ "WHERE Benutzername = '" + benutzername + "' AND Datum BETWEEN '" + zeitraumStart + "' AND '" + zeitraumEnde + "' ORDER BY Datum;";
				rs = stmt.executeQuery(abfrage1);
			}
			
			while(rs.next()){
				if(rs.getString(3) != null){
					zeit = new Zeit(rs.getString(1), rs.getString(2), rs.getString(3), rs.getDouble(4));
					arbeitszeitenEinzeln.add(zeit);
				} else{
					zeit = new Zeit(rs.getString(1), rs.getString(2), "Zeit fehlt!", rs.getDouble(4));
					arbeitszeitenEinzeln.add(zeit);
				}

			}
					
			// Befüllen des Arrays arbeitszeitenGesamt
			if(istMonat == true){
				String abfrage2 = "SELECT Datum, ROUND(SUM(TIME_TO_SEC(TIMEDIFF(bis, von))/3600), 2) FROM Zeit "
						+ "WHERE bis IS NOT NULL AND Benutzername = '"+ benutzername +"' AND Datum LIKE '" + monat + "' GROUP BY Datum ORDER BY Datum;";
				rs = stmt.executeQuery(abfrage2);
			} else if(istMonat == false){
				String abfrage2 = "SELECT Datum, ROUND(SUM(TIME_TO_SEC(TIMEDIFF(bis, von))/3600), 2) FROM Zeit "
						+ "WHERE bis IS NOT NULL AND Benutzername = '"+ benutzername +"' AND Datum BETWEEN '" + zeitraumStart + "' AND '" + zeitraumEnde + "' GROUP BY Datum ORDER BY Datum;";
				rs = stmt.executeQuery(abfrage2);
			}		
			
			while(rs.next()){
				zeit = new Zeit(rs.getString(1), rs.getDouble(2));
				arbeitszeitenGesamt.add(zeit);
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public static void setBenutzername(String benutzername) {
		MyTableModelZeit.benutzername = benutzername;
	}

	public static ArrayList<Zeit> getArbeitszeitenGesamt() {
		return arbeitszeitenGesamt;
	}
	
}
 

Neue Themen


Zurück
Oben