JTable neu zeichnen.Aber wie?

Status
Nicht offen für weitere Antworten.

joschika77

Bekanntes Mitglied
Hallo!

Ich habe ein großes Problem!
Ich zeichne in meiner Tabelle alles farbig.
Etwa so:
Code:
jtable = new JTable()
{
		private static final long serialVersionUID = 1L;
		ImageIcon rot = new ImageIcon( "Bilder/Rot.JPG" );
		ImageIcon gruen = new ImageIcon( "Bilder/Gruen.JPG" );
		ImageIcon orange = new ImageIcon( "Bilder/Orange.JPG" );
		ImageIcon grau = new ImageIcon( "Bilder/Grau.JPG" );
		int x,y,w,h,z,i,j;
			
	public void paint( Graphics g )
	{
		Datum dd = new Datum();
		dd.aktuellJahr = Integer.parseInt(UOVmain.uvm.uepanel.jspinjahr.getValue().toString());
		Dimension d = getSize();
		h = jtable.getRowHeight();
		w = d.width / getColumnCount();
				
		for(x = 0,i=0; x < d.width; x += w,i++ )
		{
			dd.aktuellMonat = i+1;
			for(y = 0,j=-1; y < d.height; y += h,j++ )
			{
				if(j>=0 && j < dd.wieviele_tage_hat_der_monat())
				{
					z=buchungstablle[i][j];
					if(z == 0)
					    g.drawImage( gruen.getImage(), x, y, null, null );
					else if(z == 1 || z==2 || z==3)
					    g.drawImage( rot.getImage(), x, y, null, null );
					else
					    g.drawImage( orange.getImage(), x, y, null, null );
				}
				else
					g.drawImage( grau.getImage(), x, y, null, null );
			}
		}
		super.paint(g);
	}
};
jtable.setOpaque(false);

Das funktioniert auch alles.Nun ändere ich etwas und nun soll sich auch die Farbe neu ändern.
Leider klappt das nicht.Es klappt erst wenn ich in die Tabelle klicke und ein bisschen scrolle.
Ich habe es schon mit repaint(),validate() usw. probiert.
Nichts geht.Wie kann ich ihn zum neu zeichnen animieren.
Ich hoffe ihr könnt helfen.

MfG Ronn
 
B

bygones

Gast
ähm - schau dir mal die FAQs zum Thema JTable an...

mach eine "normale" Tabelle mit einem eigenen CellRenderer und lass den die Farbe setzen !!!
 

joschika77

Bekanntes Mitglied
So wie in den FAQ's hatte ich es schon. Aber dort hatte ich das Problem das er nur immer
die gezeichnet hat die den Fokus hat.Ich wollte es so das zum Beispiel die erste Spalte (Januar) die Reihen z.B.
von 5 - 10 Rot macht weil gebucht worden ist.
Gibt es nichts zum neu zeichnen?

MfG Ronn
 
B

Beni

Gast
Du musst ein TableModelEvent an alle TableModelListener verschicken, dass sich was im Model verändert hat. Wenn du von AbstractTableModel erbst, dort hat es Methode "fireXXX" die du dafür verwenden kannst, ansonsten guck dir einfach mal den Quellcode dort an (und kopier ein bisschen).
 

joschika77

Bekanntes Mitglied
Es ändert sich ja nichts im Model.
Nur die Farben ändern sich wenn noch etwas dazu buche.
Das funzt ja, nur leider erst dann wenn ich in die Tabelle klicke und scrolle.
Wie zeichnet er denn neu wenn ich srcolle?Was macht er da?
Das bräuchte ich.

MfG Ronn
 
B

Beni

Gast
Also, zuerstmal, überschreib nicht "paint" sondern benutz einen TableCellRenderer, JTable ist dafür gebaut! Und dann: die Eigenschaft einer Zelle, dazu zählt auch die Farbe, gehört in den Bereich "Daten", und somit auch in das TableModel. Und dann sind wir wieder beim unterrichten der Tabelle, "Datenmodel hat sich verändert" :wink:

Du fragst dich jetzt, wieso deathbyaclown und ich auf den Renderer bestehen: weil dies der Aufbau der JTable ist, weil sie dafür optimiert wurde, und weil es schlussendlich einfacher ist.

Wenn du das alles in den Wind schlagen willst, unterrichte trotzdem die Tabelle, dass sich das Model verändert hat, dann werden alle Buffer geleert (auch wenn die Tabelle z.B. noch im einem JScrollPane und etc sitzt), und es sollte von Grund auf neu gezeichnet werden (ich geh mal von 80% Erfolgswahrscheinlichkeit aus).
 

joschika77

Bekanntes Mitglied
Danke euch für die Antworten!
Ich habe es schon so probiert:
Code:
uepanel.cm.fireTableDataChanged();
//oder
//uepanel.cm.fireTableStructureChanged();
Das klappt leider nicht.
Wie kann ich es der Tabelle mitteilen?

MfG Ronn
 
B

Beni

Gast
Das hätte schon so gehen müssen, kannst du mal genug Code posten, damit ich das selbst ausprobieren kann? Oder hast du bereits zuviel geschrieben?
 

joschika77

Bekanntes Mitglied
Ist schon sehr viel Code.
Also ich habe Urlauberbuchungen die in einem anderen Panel auf dem TabbedPane in einer Tabelle farblich dargestellt werden.Nun mache ich eine neue Buchung und wechsel auf dem TabbedPane wieder zur Tabelle.
Und beim Wechsel rufe ich das vorher gepostete auf.Alse in einer anderen Klasse.
Das komische ist ja wenn ich in die Tabelle klicke und ein wenig scrolle macht er es.
Setzen tut er auch vorher, das habe ich mir mir Tooltiptext ausgeben lassen.Nur zeichnet er nicht neu.
Was bräuchtest du vom Code?
 
B

Beni

Gast
Genug um die Tabelle herzustellen und anzuzeigen, damit ich den Fehler selbst sehen kann (und hoffentlich ein Gegenmittel finde).
 

joschika77

Bekanntes Mitglied
Das ist die Tabelle mit scrollPane:
Code:
		jtable = new JTable()
		{
			private static final long serialVersionUID = 1L;
			ImageIcon rot = new ImageIcon( "Bilder/Rot.JPG" );
			ImageIcon gruen = new ImageIcon( "Bilder/Gruen.JPG" );
			ImageIcon orange = new ImageIcon( "Bilder/Orange.JPG" );
			ImageIcon grau = new ImageIcon( "Bilder/Grau.JPG" );
			int x,y,w,h,z,i,j;
			
			public void paint( Graphics g )
			{
				Datum dd = new Datum();
				dd.aktuellJahr = Integer.parseInt(UOVmain.uvm.uepanel.jspinjahr.getValue().toString());
				Dimension d = getSize();
				h = jtable.getRowHeight();
				w = d.width / getColumnCount();
				
				for(x = 0,i=0; x < d.width; x += w,i++ )
				{
					dd.aktuellMonat = i+1;
					for(y = 0,j=-1; y < d.height; y += h,j++ )
					{
						if(j>=0 && j < dd.wieviele_tage_hat_der_monat())
						{
							z=buchungstablle[i][j];
							if(z == 0)
								g.drawImage( gruen.getImage(), x, y, null, null );
							else if(z == 1 || z==2 || z==3)
								g.drawImage( rot.getImage(), x, y, null, null );
							else
								g.drawImage( orange.getImage(), x, y, null, null );
						}
						else
							g.drawImage( grau.getImage(), x, y, null, null );
					}
				}
				super.paint(g);
			}
		};
		//transparent
		jtable.setOpaque(false);
		
//spalten nicht resizable machen, nicht zulassen dass die spaltenreihenfolge geändert werden kann 
		JTableHeader jthb = jtable.getTableHeader();
	    jthb.setResizingAllowed(false); 
	    jthb.setReorderingAllowed(false);
//-----------------------------------------------------------------------------------------------	
		cm = new UebersichtJTableModel();
		jtable.setModel(cm);
		
		//jtable.setSelectionForeground(Color.blue);
		//jtable.setSelectionBackground(Color.yellow);
		//damit scrollt Tabelle auch horizontal
		jtable.setAutoResizeMode(0);
		jtable.setFont(new Font("Century Gothic",Font.BOLD,10));
		jtable.addMouseMotionListener(this);
		//jtable.setEnabled(false);
		jtable.setDefaultRenderer(Object.class, new ColoredTableCellRenderer() );
		cm.setDataVector(daten,cm.spaltennamen);
			
		jscroll = new JScrollPane(jtable);
		jscroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		jscroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		add(jscroll, "0,3,9,5");

Das Model:
Code:
import javax.swing.table.DefaultTableModel;

class UebersichtJTableModel extends DefaultTableModel
{ 
	private static final long serialVersionUID = 1L;
	 
	String spaltennamen[] ={
			"Januar","Februar","März","April","Mai","Juni","Juli","August",
			"September","Oktober","November","Dezember"
		};
	
	public boolean isCellEditable(int row, int column) 
	{ 
		//return true; 
		return false;//Zellen nicht mehr editierbar
	}
}
Und das geht von der Hauptklasse aus - vom TabbedPane:
Code:
	public void stateChanged(ChangeEvent e) 
	{
		int tpindex = tp.getSelectedIndex();
		//erst beim klicken auf tp reagieren
		if(tpwechsel == true)
		{
			if(tpindex == 0)
			{
				uepanel.FewoinCombowennWechsel();
				uepanel.cm.fireTableDataChanged();
		                                //uepanel.cm.fireTableStructureChanged();	
			}
			if(tpindex == 1)
			{
				buchpanel.FewoinCombowennWechsel();
				if(buchpanel.aenderung == true)
				{
					buchpanel.Buchung_neu_auslesen();
					buchpanel.aenderung = false;
				}
			}
			if(tpindex == 2)
			{
				//System.out.println(tpindex);
			}
		}
		tpwechsel = true;
	}

Ich weiß nun nicht ob noch etwas fehlt.

MfG Ronn
 
B

Beni

Gast
Okeee, ich hab ein Zeitchen rumprobiert (zum einen, damit es startet, zum anderem an dem Fehler), aber eine brauchbare Lösung konnte ich nicht finden... ich hab dafür was anderes geschrieben, was auch funktioniert (in etwa sowas benötigst du doch?).

P.S. alles in einer Datei: kopieren, kompilieren, ausführen
Code:
/*
 * Created on 14.12.2004
 */
package forum;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

public class Test extends JFrame{
	public static void main( String...args ) throws Exception{
		Test test = new Test();
		test.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		test.setVisible( true );
	}

	public Test(){
		JTable table = new JTable();
		final Model model = new Model( 2005 );
		
		table.setDefaultRenderer( Object.class, new Renderer() );
		table.setModel( model );
		
		add( new JScrollPane( table ), BorderLayout.CENTER );
		
		JButton button = new JButton( "Irgendwas ändern" );
		add( button, BorderLayout.PAGE_END );
		
		button.addActionListener( new ActionListener(){
			public void actionPerformed(  ActionEvent e ){
				int month = (int)(Math.random() * 12);
				int day = (int)( Math.random() * model.daysCount( month ) );
				model.setReservations( month, day, 5 );
			}
		});
		
		pack();
		setLocationRelativeTo( null );
	}
	
	private class Renderer extends DefaultTableCellRenderer{
		public Renderer(){
			setOpaque( true );
		}
		
		public Component getTableCellRendererComponent( JTable table,
				Object value, boolean isSelected, boolean hasFocus, int row,
				int column ) {

			super.getTableCellRendererComponent( table, value,
					isSelected, hasFocus, row, column );
			
			int reservations = ((Integer)value).intValue();
			
			if( reservations == -1 ){
				setBackground( Color.GRAY );
				setText( "" );
			}
			else if( reservations == 0 )
				setBackground( Color.GREEN );
			else if( reservations >= 1 && reservations < 4)
				setBackground( Color.ORANGE );
			else
				setBackground( Color.RED );
			
			return this;
		}
	}
	
	private class Model extends DefaultTableModel{
		public Model( int year ){
			Vector months = new Vector();
			
			for( int i = 0; i < 31; i++ )
				months.add( new Vector() );
			
			for( int i = 0; i < 31; i++ ){
				Vector days = (Vector)months.get( i );
				
				for( int j = 0; j<12; j++ ){
					int n = daysCount( j );
					
					if( i < n )
						days.add( Integer.valueOf( (int)(Math.random() * 2) ) );
					else
						days.add( Integer.valueOf( -1 ));
				}
				
				
			}
			
			Vector names = new Vector();
			names.add( "Januar" );
			names.add( "Februar" );
			names.add( "März" );
			names.add( "April" );
			
			names.add( "Mai" );
			names.add( "Juni" );
			names.add( "Juli" );
			names.add( "August" );
			
			names.add( "September" );
			names.add( "Oktober" );
			names.add( "November" );
			names.add( "Dezember" );
			
			setDataVector( months, names );
		}
		
		public void setReservations( int month, int day, int reservation ){
			setValueAt( Integer.valueOf( reservation ), day, month );
		}
		
		public void setValueAt( Object aValue, int row, int column ) {
			try{
				int value = Integer.parseInt( aValue.toString() );
				if( value >= 0 )
					super.setValueAt( Integer.valueOf( value ), row, column );
			}
			catch( NumberFormatException ex ){
			}
		}
		
		private int daysCount( int month ){
			switch( month ){
				case 0: return 31;
				case 1: return 28;
				case 2: return 31;
				case 3: return 30;
				
				case 4: return 31;
				case 5: return 30;
				case 6: return 31;
				case 7: return 31;
				
				case 8: return 30;
				case 9: return 31;
				case 10: return 30;
				case 11: return 31;
				
				default: return -1;
			}
		}
	}
}
 

joschika77

Bekanntes Mitglied
Hallo!

Ich werde es jetzt mal versuchen.Beni ich danke dir auf jeden Fall für den Versuch. :toll:
Mal sehen.Wenn ich nichts hinbekomme melde ich mich bestimmt nochmal.

MfG Ronn
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
M JFreeChart neu zeichnen sich Wenn Jtable sich ändert AWT, Swing, JavaFX & SWT 5
S JTable - Aktualisieren / Neu zeichnen. AWT, Swing, JavaFX & SWT 5
T JTable erst nach Änderung der Spaltenbreite neu zeichnen AWT, Swing, JavaFX & SWT 10
I Swing JTable zeichnet kein vertical Grid AWT, Swing, JavaFX & SWT 6
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
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
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
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 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
D Swing JTable Renderer Grafikfehler AWT, Swing, JavaFX & SWT 0
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
M Swing JTable GroupableHeader Background Color AWT, Swing, JavaFX & SWT 4
K Swing JTable updaten AWT, Swing, JavaFX & SWT 9
thet1983 Swing MySQL >> JTable AWT, Swing, JavaFX & SWT 5
J JTable bounds ändern durch resizing des Fensters AWT, Swing, JavaFX & SWT 9
F JTable Zellen-Hintergrund ändern AWT, Swing, JavaFX & SWT 7
O JTable linksbündig drucken (nicht der Zelleninhalt) AWT, Swing, JavaFX & SWT 2
Crazynet xls Datei in JTable AWT, Swing, JavaFX & SWT 3
O JTable ohne Rahmen printen AWT, Swing, JavaFX & SWT 3
L Swing JTable refresht die Column Namen nicht AWT, Swing, JavaFX & SWT 0

Ähnliche Java Themen

Neue Themen


Oben