JTable

Saban

Erfahrenes Mitglied
Guten Morgen Zusammen!

Ich hab mich gestern den ganzen Tag mit der JTable beschäftigt. Ich weiß jetzt wie man die Zellen Farben, Spaltenbreite, Tabellenmodelle usw ändern kann.

Meine Frage ist jetzt wie ich des alles auf einmal machen kann. Also ich mein Spaltenmodell übergeb ich ja
Java:
JTable table = new JTable(Tablemodel, DefaultTableColumnModel)

beim suchen gezielter Felder (also nur Felder in den Eingaben gemacht wurden) brauch ich anscheinend (laut Internetsuche)
Java:
JTable table = new JTable(Tablemodel, null)

Wenn ich zb den Renderer anwende klappt das und wenn ich sage ich ne DefaultTableModell klappt das auch.
Also ums kurz zu sagen ich hab keine Ahnung welchen Konstruktor ich verwenden muss wenn meine JTable:
- Ausgewählte Spalten gegen Eingaben Sperren können soll (sollen aber noch selektiert werden können)
- Zellen mit Farben versehen
- ne Scrollpane enthalten
- Eingaben überprüfen können soll
- Nur Felder abfragen in denen Eingaben gemacht wurden
- und wenn möglich das verschieben der Spalten unterbinden

auf einmal können soll...
Ich weiss zwar nicht ob das wichtig ist aber die Daten soll nachträglich aus ner Datenbank ausgelesen und in die JTable eingetragen werden...
Hat mir da jemand voll nen Tip?

MfG
Saban
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

wenn ich dich richtig verstanden habe, kannst du das alles schon einzeln ausführen, aber nicht alles auf einmal auf eine Tabelle anwenden.

Du musst dafür keinen speziellen Konstruktor haben. Die Tabelle hat Setter für die unterschiedlichen Models, Renderer und Editoren.

So kannst du alles setzen was du über den Kontruktor nicht gesetzt hast.
Du könntest sogar nur sowas machen
Code:
JTable table = new JTable();
//jetzt kommen die ganzen setter

MFG

Sascha
 
Morgen!

Achso! ich hab mir des nämlich mit dem Buch "Handbuch der Java Programmierung" angeschaut und die haben das alles in einzelne Klassen gepackt gehabt und dem Konstruktor übergeben ich hab gedacht man muss das mehr oder weniger so machen... Ich probier dann mal gleich weiter werd scho irgendwie drauf kommen :)

Wenn ich gleich noch was fragen dürfte. Ich hab jetzt ne JTable und versuche grad den Renderer einzustellen das klappt auch die ausgewählten Spalten werden gefärbt nur möchte ich die Farbe ändern wenn eine Zelle den Fokus hat das man sieht welche Zelle man angeklickt hat. Das die gefärbte Spalte sich nicht ändern lässt.

Java:
public class BK_ColoredTableCellRenderer implements TableCellRenderer{

	private Color lightgrey = new Color(220, 220, 220);
	private Font font		= new Font("Arial", Font.BOLD, 12);
	
	public Component getTableCellRendererComponent(JTable tabelle, Object value, boolean isSelected, boolean hasFocus, int row, int column){
		JLabel label = new JLabel((String)value);
		label.setOpaque(true);
		Border b = BorderFactory.createEmptyBorder(1, 1, 1, 1);
		label.setBorder(b);
		label.setFont(tabelle.getFont());
		label.setForeground(tabelle.getForeground());
		label.setBackground(tabelle.getBackground());
		
		if(isSelected){
			label.setFont(font);
		}
		
		//Angezeigte Spalte in Modellspalte umwandeln
		column = tabelle.convertColumnIndexToModel(column);
		
		if(column == 9 || column == 10){
			label.setBackground(lightgrey);
		}
		
		return label;
	}
	
}

Also Spalte 9 und 10 sollen einen anderen Hintergrund bekommen wenn diese den Fokus hat.

MfG
Saban
 
Zuletzt bearbeitet von einem Moderator:
Sicher darfst du noch was fragen. ;-)

Du bekommst in der Methode doch einiges übergeben, u.a. zwei boolean-Werte. Einmal isSelected und einmal hasFocus. Damit kannst du doch abfragen, ob die jeweilige Spalte den Focus hat.

Du solltest bei deinem Renderer darauf achten, dass du, in der getTableCellRendererComponent, keine Objecte anlegst, wenn es nicht unbedingt sein muss.

Zum Beispiel das JLabel würde ich nicht jedesmal anlegen, genauso die Border. Da Objecte anlegen Zeit kostet und der Renderer oft aufgerufen wird, kann sich das Neu-Zeichnen der Tabelle verlangsamen.

So würde ich es machen.
Code:
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;

import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.border.Border;
import javax.swing.table.TableCellRenderer;

public class BK_ColoredTableCellRenderer
    extends JLabel
    implements TableCellRenderer
{
  private static final Color  LIGHT_GRAY  = new Color(220, 220, 220);
  private static final Font   CELL_FONT   = new Font("Arial", Font.BOLD, 12);
  private static final Border CELL_BORDER = BorderFactory.createEmptyBorder(1, 1, 1, 1);

  public BK_ColoredTableCellRenderer()
  {
    setOpaque(true);

    setBorder(CELL_BORDER);
    
  }

  public Component getTableCellRendererComponent(JTable tabelle, Object value, boolean isSelected, boolean hasFocus, int row, int column)
  {
    setText(value.toString());

    setFont(tabelle.getFont());
    setForeground(tabelle.getForeground());
    setBackground(tabelle.getBackground());
    if (isSelected)
    {
      setFont(CELL_FONT);
    }
    // Angezeigte
    // Spalte
    // in
    // Modellspalte
    // umwandeln
    column = tabelle.convertColumnIndexToModel(column);
    if (column == 9 || column == 10)
    {
      setBackground(LIGHT_GRAY);
    }
    else{
      setBackground(Color.WHITE);
    }
    return this;
  }
}


Gruß

Sascha
 
Hi,

das mit dem neu anlegen schau ich mir gleich nochmal an! Danke für den Tip :)
Ähm das mit dem hasFocus und isSelected hab ich schon ausprobiert aber das mit dem
Java:
column = tabelle.convertColumnIndexToModel(column)
überschreibt das irgendwie :confused:

mach ich vllt was falsch?

MfG
Saban
 
Zuletzt bearbeitet von einem Moderator:
Wie meinst du das mit überschreiben?

Warum nutzt du die Methode überhaupt? Ist deine Tabelle sortierbar?

MFG

Sascha
 
Hi,

also sie soll sich später mal sortieren lassen und in dem "Java Buch" war es so beschrieben. Ich mein wenn ich sag "column = ..." dann setzt er mir den Hintergrund und bei der Zeile if(hasFocus) wird auch überall der hintergrund verändert nur nich in dem Spalten 9 und 10 die bleiben in dem grau in dem ich sie von anfang an deklarier.

MfG
Saban
 
Zeig mir mal bitte den Renderer, der die Spalte die den Fokus hat anders einfärbt.

MFG

Sascha
 
Hi!

ich hab doch oben schon den ganzen Code eingefügt paar posts drüber!

Java:
        //Angezeigte Spalte in Modellspalte umwandeln        
column = tabelle.convertColumnIndexToModel(column);                
if(column == 9 || column == 10){            
     label.setBackground(lightgrey);        
}

MfG
Saban
 
Zuletzt bearbeitet von einem Moderator:
Den kenne ich ja, aber wo wird die Zelle gefärbt die den Focus hat?

Da färbst du lediglich die Zelle 9 und 10 Grau.

MFG

Sascha
 

Neue Beiträge

Zurück