JXTable Zellen färben?

Maik20

Erfahrenes Mitglied
Hallo,

ich bastele gerade an einem JXTable. Hier bin ich auf der Suche nach einer Möglichkeit die Hintergrundfarbe der Zellen (Zeile 1 und Spalte 5) sowie (Zeile 5 und Spalte 3) abzuändern.

Nach reichlichem googeln finde ich nur Infos über das einfärben ganzer Zeilen.

Hat hier jemand ein paar Infos oder ein Beispiel?
 
Hallo,

das funktioniert bei der JXTable genauso wie bei der JTable. Du kannst mit dem TableCellRenderer bestimmen, welche Farbe jede Zelle hat.

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.util.Random;

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

public class ColoredCellExample
    extends JFrame
{

  public ColoredCellExample()
  {
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    setSize(300, 300);

    JTable table = new JTable(10, 10);

    table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer()
    {

      private Random random = new Random();

      public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
      {

        Component rendererComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        int r = random.nextInt(255);
        int g = random.nextInt(255);
        int b = random.nextInt(255);

        if (row == 0 && column == 4 || row == 4 && column == 2 )
          rendererComponent.setBackground(new Color(r, g, b));
        else
          setBackground(Color.WHITE);
        return rendererComponent;
      }

    });

    add(table, BorderLayout.CENTER);
  }

  public static void main(String[] args)
  {
    new ColoredCellExample().setVisible(true);
  }

}

MFG

Sascha
 
Danke für den Tip, werde es gleich mal testen.

Was passiert eigentlich beim umsortieren der Tabelle?

In der Ausgangslage ist es bei mir z.B. Zeile 4 Spalte 2. Jetzt wird die Tabelle jedoch nach der Spalte 2 sortiert. Dann wird aus Zeile 4 = Zeile X?

Gibt es neben der Angabe der Zeilen und Spaltennummer eine Art Zeilenindex?

*EDIT*

So habe mal eben den Code getestet. Dieser verursacht einen komischen Effekt. Hier erstmal mein Code:

Code:
public Table(Database db, Log log, JFrame mainFrame){
		this.mainFrame = mainFrame;
		this.db = db;
		this.log = log;
		
		setLayout(new BorderLayout());
		
		tb = new ToolBar(db,mainFrame,this,log);
		add(tb,BorderLayout.NORTH);		
		
		table = new JXTable();
		
		table.setColumnControlVisible(true);
		
		
		table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer(){
			private Random random = new Random();
			public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){         
					Component rendererComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
					int r = random.nextInt(255); 
					int g = random.nextInt(255);
					int b = random.nextInt(255);  
					if (row == 0 && column == 4 || row == 4 && column == 2 )     
						rendererComponent.setBackground(new Color(r, g, b));
					else    
						setBackground(Color.WHITE); 
					return rendererComponent; 
					}     
			});
		

		
		
		
		table.setHorizontalScrollEnabled(true);
		//workaround to avoid border fallback to default scrollpane-border after a LAF switch - JTable bug.
		JScrollPane scrollPane = new JScrollPane(table){
			@Override
			public void updateUI()
			{
				super.updateUI();
				setBorder(UIManager.getBorder("Table.scrollPaneBorder"));
			}
		};
		scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		table.packAll();
		add(scrollPane,BorderLayout.CENTER);
	}

Klicke ich jetzt in eine Zeile, verschwindet der Text in den Zellen dieser Zeile. Mit Ausnahme der farbig hinterlegten Zellen (Spalte 4) diese bekommt eine Farbe und der Text bleibt zu sehen.

Klicke ich nirgendwo hin ist auch keine der Zellen farbig markiert.

Eine Idee was das sein kann?

*EDIT 2*

Jetzt wird es ganz merkwürdig: Tausche ich die beiden Farben:

Code:
if (row == 0 && column == 4 || row == 4 && column == 2 )     
						rendererComponent.setBackground(Color.WHITE);
					else    
						rendererComponent.setBackground(Color.RED);

Dann wird bereits beim laden der Tabelle mir die gesamte Tabelle in ROT angezeigt. Auch 0/4 und 4/2. Die Einstellungen für die Zeilen / Spalten greifen erst wenn ich eine Zeile selektiere.
 
Zuletzt bearbeitet:
Hey,
hatte noch keine Zeit danach zu schauen. Vielleicht hab ich morgen mal Zeit dazu.

Aber noch zur Information, Push-Postings sind verboten.

MFG

Sascha
 
Hallo Sascha (und andere Leser),

ich sitze leider immernoch vor dem Problem und komme nicht weiter. Dein Beispiel oben funktioniert wunderbar. Wenn ich jedoch aus den JTable in deinem Beispiel ein JXTable mache (siehe unten) und swingx in den Classpath aufnehmen dann kommt es zu meinem geschilderten Problem.

Vielleicht kann das mal jemand nachvollziehen und mir sagen ob das bei Ihme ebenso ist.

Code:
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.util.Random; 
import javax.swing.JFrame; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableCellRenderer; 

import org.jdesktop.swingx.JXTable;

public class ColoredCellExample    extends JFrame{ 
   /**
	 * 
	 */
	private static final long serialVersionUID = 1L;
public ColoredCellExample()  { 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setSize(300, 300); 
     JXTable table = new JXTable(10, 10); 
     table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer()    { 
       private Random random = new Random(); 
       public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)      { 
         Component rendererComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
         int r = random.nextInt(255); 
        int g = random.nextInt(255); 
        int b = random.nextInt(255); 
         if (row == 0 && column == 4)          rendererComponent.setBackground(new Color(r, g, b)); 
        else          setBackground(Color.WHITE); 
        return rendererComponent; 
      } 
     }); 
     add(table, BorderLayout.CENTER); 
  }    
public static void main(String[] args)  {    new ColoredCellExample().setVisible(true);  } }

Danke

Maik
 
Zurück