JTable repaint mit AbstractTableModel

  • Themenstarter Themenstarter NicolasA
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
N

NicolasA

Gast
Tach Post,

also ich habe gerade meine Tabelle die in einem Thread geupdatet werden soll ein bisschen umgebastelt
und zwar so, dass ich auch ganze Zeilen anmarkern kann wenn ein bestimmter Wert drin steht.
Vorher hat das mit dem repaint(); wunderbar funktioniert nur leider geht es jetzt nicht mehr.

Hier ist der Quellcode von der Modelklasse:
Code:
package gui;
import java.util.Vector;

import javax.swing.event.TableModelEvent;
import javax.swing.table.AbstractTableModel;

import module.module.Modul;


public class Model extends AbstractTableModel {

	  // ModulListe liste = new ModulListe();
	   Vector meAnzeigeModule;
	   
		 public Model(Vector module) {
			   this.meAnzeigeModule = module;
		 }
	
		   // Die Anzahl Columns 
		   public int getColumnCount() { 
		      return 3; 
		   } 
		    
		   // Die Anzahl Vehikel 
		   public int getRowCount() { 
		      return meAnzeigeModule.size(); 
		   } 
		    
		   // Die Titel der einzelnen Columns 
		   public String getColumnName(int column) { 
		      switch( column ){ 
		         case 0: return "modul"; 
		         case 1: return "revision"; 
		         case 2: return "compilestatus"; 
		         //case 3: return "Besitzt Motor"; 
		         default: return null; 
		      } 
		   } 
		    
		   // Der Wert der Zelle (rowIndex, columnIndex) 
		   public Object getValueAt(int rowIndex, int columnIndex) { 
		     
			   Modul modul = (Modul)meAnzeigeModule.get(rowIndex); 
		       
		      switch( columnIndex ){ 
		         case 0: return modul.getMeMname(); 
		         case 1: return modul.getMeMrevision(); 
		         case 2: return modul.getMeCompilestaus(); 
		         //case 3: return vehicle.hasMotor() ? Boolean.TRUE : Boolean.FALSE; 
		         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 Boolean.class; 
		         default: return null; 
		      }    
		   } 
	}

Hier ist die Oberflaeche:
Code:
package gui;


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Hashtable;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.swing.JTable;
import javax.swing.JToolBar;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;

import aktion.AktionsLauscher;

import schnittstellen.DatenbankZugriff;

import module.module.Modul;
import module.module.ModulListe;

import produkte.Produkt;
import produkte.ProduktListe;

public class Oberflaeche extends JFrame implements Runnable{

	private ModulListe meModulListe						= null;
	private ProduktListe meProduktListe					= null;
	private DatenbankZugriff  meDatenbankZugriff		= null;
	
	private Vector meModule								= null;
	private Vector meProdukte							= null;
	private Vector anzeigeModule						= null;
	
	private Font meFont 								= null;
	private JTable meModulTabelle 						= null; 
	private JPopupMenu mePop 							= null;
	private JLabel fortschrittLabel						= null;
	private JLabel produkt								= null;
	private JComboBox produktBox 						= null;
	private JProgressBar progress						= null;
	private Produkt aktProdukt							= null;
	
	private Thread tabellenUpdate						= null;
	private Model tabellenModel							= null;
	
	int sleep 											= 10000;
	
	public static void main(String[] args) {
		JFrame.setDefaultLookAndFeelDecorated(true);	
		new Oberflaeche();
	}
	
	private Oberflaeche() {
		
		meDatenbankZugriff = new DatenbankZugriff();
		meDatenbankZugriff.getProperties();
		meDatenbankZugriff.verbindungHerstellen();
		
		meModulListe = new ModulListe();
		meProduktListe = new ProduktListe();
		
		meProdukte = meProduktListe.getProduktListe(meDatenbankZugriff);
		
		meFont = new Font("Arial",0,14);
		setTitle("Integration Builder 1.0");
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setMinimumSize(new Dimension(800,600));
		progress =  new JProgressBar();
		fortschrittLabel = new JLabel();
		
		anzeigeModuleHolen();
		komponentenHinzufuegen();
		
		tabellenUpdate = new Thread(this);
		tabellenUpdate.start();
		
		setSize(1024,768);
		setLocationRelativeTo(null);
		setVisible(true);
	}
	

	private void komponentenHinzufuegen() {
	  
		getContentPane().setLayout(new BorderLayout());
	
		meModulTabelle = new JTable(tabellenModel) {
		
			public Component prepareRenderer(
	    			  TableCellRenderer renderer, int row, int column) {
	    		  
	    		  	Component compTabelle = super.prepareRenderer(renderer, row, column);
	    		  
	    		  	if (!isRowSelected(row)) {
	    		  		String type = (String) getModel().getValueAt(row,2);
	    		  		compTabelle.setBackground(Color.WHITE);
	    		  		
	    		  		if (type.compareToIgnoreCase("waiting") == 0) {
	    		  			compTabelle.setBackground(Color.YELLOW);
	    		  		}
	    		  		
	    		  		else if(type.compareToIgnoreCase("compiling") == 0) {
	    		  			compTabelle.setBackground(Color.ORANGE);
	    		  		}
	    		  		
	    		  		else if (type.compareToIgnoreCase("compiled") == 0) {
	    		  			compTabelle.setBackground(Color.GREEN);
	    		  		}
	    		  	}
	    		  
					return compTabelle;
	    	  }
	      }; 
			
		meModulTabelle.setEnabled(false);
	    meModulTabelle.getTableHeader().setFont(new Font("Arial",0,14));
		meModulTabelle.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
		meModulTabelle.setFont(meFont);
		meModulTabelle.setShowHorizontalLines(true);
		meModulTabelle.setShowVerticalLines(false);
		
		TableColumnModel columnModel = meModulTabelle.getColumnModel(); 
     
	      columnModel.getColumn(0).setPreferredWidth(550);
	   
	    mePop = new JPopupMenu();
		JMenuItem item1 = new JMenuItem("show submodulinformation");
		mePop.add(item1);
		item1.setFont(meFont);
		meModulTabelle.add(mePop);
		meModulTabelle.setBackground(Color.decode("#ECECEC"));
		JScrollPane pane = new JScrollPane(meModulTabelle);
		pane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);;
		pane.setBorder(BorderFactory.createLoweredBevelBorder());
		
			JPanel pnlNorden = new JPanel(new BorderLayout());
				pnlNorden.setBorder(BorderFactory.createEmptyBorder(5,0,0,0));
			
				JToolBar toolMenu = new JToolBar();
				
				JLabel lblProdukt = new JLabel("product:");
				lblProdukt.setFont(meFont);
				
				produktBox = new JComboBox(meProdukte);
				produktBox.setToolTipText("choose a product");
				produktBox.setFont(meFont);
				produktBox.setMaximumSize(new Dimension(200,20));
				produktBox.addActionListener(new AktionsLauscher(this));
				
				JButton btnAus = new JButton(new ImageIcon("close_24.gif"));
				btnAus.setToolTipText("exit");
				btnAus.setActionCommand("ausschalten");
				btnAus.addActionListener(new AktionsLauscher(this));
				
				JButton btnDrucken = new JButton(new ImageIcon());
				btnDrucken.setToolTipText("print this table");
				
				toolMenu.add(lblProdukt);
				toolMenu.addSeparator();
				toolMenu.add(produktBox);
				toolMenu.addSeparator();
				toolMenu.add(btnAus);
				toolMenu.setPreferredSize(new Dimension(350,35));
				toolMenu.setFloatable(false);
				toolMenu.setRollover(true);
				toolMenu.setBorderPainted(false);
				toolMenu.setOpaque(false);
				
				pnlNorden.add(toolMenu, BorderLayout.EAST);
			
			JPanel northLeft = new JPanel();
				northLeft.setBorder(BorderFactory.createEmptyBorder(0,10,0,0));
				
				produkt = new JLabel(produktBox.getSelectedItem().toString());
				produkt.setFont(new Font("Arial",0,28));
				northLeft.add(produkt);
		
			JPanel pnlWesten = new JPanel(new BorderLayout());
		 
		    	JPanel pnlWestemUnten = new JPanel(new BorderLayout());
		    		pnlWestemUnten.setBorder(new EmptyBorder(10,20,10,20));
		     		progress.setStringPainted(true);
		     		pnlWestemUnten.add(progress);
		     	
		     	JPanel leftMiddle = new JPanel();
			     	fortschrittLabel.setFont(meFont);
			     	leftMiddle.add(fortschrittLabel);
			    
			     	
			     JPanel pnlUntenLinks = new JPanel();
			     	pnlUntenLinks.setBorder(BorderFactory.createEmptyBorder(30,0,0,0));
						
				JLabel imgDspace = new JLabel(new ImageIcon("dSPACE.gif"));
				pnlUntenLinks.add(imgDspace);
			      
				pnlWestemUnten.add(leftMiddle, BorderLayout.NORTH);
		     	
		     	pnlWesten.add(pnlWestemUnten, BorderLayout.SOUTH);
		     	pnlNorden.add(northLeft, BorderLayout.WEST);
		     	pnlWestemUnten.add(pnlUntenLinks, BorderLayout.SOUTH);
		     	
		add(pane, java.awt.BorderLayout.CENTER);
		add(pnlNorden, BorderLayout.NORTH);
		add(pnlWesten, BorderLayout.WEST);
	}

	public void produktBoxAktionen () {
		
		aktProdukt = (Produkt) produktBox.getSelectedItem();
		produkt.setText(aktProdukt.getMePname());
	}

	public void btnAusAktionen() {

		System.exit(0);
	}
	
	public void anzeigeModuleHolen() {
		
		anzeigeModule = new Vector();
		meModule = meModulListe.getModulListe(meDatenbankZugriff);
		
		for (int i=0; i < meModule.size();i++) {
			
			Modul aktModul = (Modul) meModule.get(i);
			
			if ((aktModul.getMeCmnstatus() != 3 && aktModul.getMeIntegrationview().compareTo("") != 0)){
			
				anzeigeModule.add(aktModul);
			}
		}
		tabellenModel = new Model(anzeigeModule);
	}

	public void run() {
		
		while (true) {
			
			System.out.println(sleep);
			aktProdukt = (Produkt) produktBox.getSelectedItem();
		
			anzeigeModuleHolen();
			tabellenModel.fireTableDataChanged();
			
			String sqlBefehl = "SELECT COUNT(mname) AS 'anzahl' FROM Modul_Compile WHERE compilestatus = 'compiled' AND bnr = " 
				+ aktProdukt.getMePnr();
			int anzahlCompilierteModule = 0;
			
			try {
					ResultSet sqlResult = meDatenbankZugriff.datenHolen(sqlBefehl);
					sqlResult.next();
					anzahlCompilierteModule = sqlResult.getInt("anzahl"); 
				
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
		
			System.out.println("Tabbelle neuzeichnen");
			double fortschritt = (double) anzahlCompilierteModule / (double) anzeigeModule.size() * 100;
			progress.setValue((int) fortschritt);
			fortschrittLabel.setText(anzahlCompilierteModule  + " of " + anzeigeModule.size() 
					+ " modules");
		
			progress.repaint();
			
			try {
					Thread.sleep(1000);	
			} catch (InterruptedException e) {
					
			}
		}
	}
}

Vielleicht hat ja einer von Euch eine Idee.
Vielen Dank im Vorraus

NicolasA
 
ohne deine Code gelesen zu haben:

AbstractTableModel und repaint passen m.E. nicht zusammen.

Guck mal in der API nach den 'fireTableXXX'-Methoden
 
Das habe ich mir schon angeguckt aber leider klappt das
mit fireTableDataChanged auch nicht....
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben