TableCellRenderer wie umsetzen?

Status
Nicht offen für weitere Antworten.

FenchelT

Bekanntes Mitglied
Hallo zusammen,

ich habe gerade mit den Moeglichekiten von JAva 6 rumgespielt.

Ich kann nun auf sehr einfache Weise endlich einen Filter auf eine Tabelle anwenden.
DAs funktioniert sowohl mit Vector Daten, als auch mit ResultSets und zwar wesentlich einfacher
als mit FilteredRowSets.

Hier ein Beispiel:
Code:
import javax.swing.*;


public class Start 
{

	/**
	 * @param args
	 */
	public static void main(String[] args) 
	{		
		SwingUtilities.invokeLater(new Runnable()
		{
			public void run()
			{
				new JTableWithCheckbox();
			}
		});
	
	}

}


Code:
import java.awt.FlowLayout;

import javax.swing.*;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

import java.awt.event.*;
import java.util.regex.*;

public class JTableWithCheckbox extends JFrame
implements KeyListener
{
	private JTable table = new JTable();
	private CheckBoxModel model;
	private JLabel label = new JLabel("Filter:  ");
	private JTextField txtFilter = new JTextField(15);
	private TableRowSorter<TableModel> sorter;
	
	
	public JTableWithCheckbox()
	{
		init();
	}
	
	
	private void init()
	{
		this.txtFilter.addKeyListener(this);
		
		final String[] columnNames = {
				"Serienbrief",
				"Vorname",
				"Name",
				"Strasse",
				"Plz",
				"Ort"};
		
		
		String[][] data = new String[3][6];			//1. Wért = row; 2. Wert = column
		String[] items = { "Ute", "Schnute", "Kasimir" };
		JComboBox editor = new JComboBox( items );
		
		
		data[0][1] = "Ute";
		data[0][2] = "Meier";
		data[0][3] = "Teststrasse";
		data[0][4] = "98787";
		data[0][5] = "Entenhausen";
		
		
		data[1][1] = "Peter";
		data[1][2] = "Pan";
		data[1][3] = "Irgendwo 124";
		data[1][4] = "40000";
		data[1][5] = "Düsseldorf";
		
		data[2][1] = "Nils";
		data[2][2] = "Holgerson";
		data[2][3] = "Irgendwo 125";
		data[2][4] = "80135";
		data[2][5] = "München";
		
		model = new CheckBoxModel(data, columnNames);
		
		 
		JTable table = new JTable(model);
		DefaultCellEditor dce = new DefaultCellEditor( editor );
		table.getColumnModel().getColumn(1).setCellEditor(dce);
		sorter = new TableRowSorter<TableModel>(model);
		table.setRowSorter(sorter);
		
		
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setSize(500,150);
		this.setLocationRelativeTo(null);
		
		
		this.getContentPane().setLayout(new FlowLayout());
		this.getContentPane().add(label);
		this.getContentPane().add(txtFilter);
		this.getContentPane().add(new JScrollPane(table));
		this.setVisible(true);
	}
	
	public void keyPressed(KeyEvent k) {
		// irgendwann mal
		
	}

	public void keyReleased(KeyEvent k) 
	{	
		String text = txtFilter.getText();
		
		if (text.length() == 0) {
            sorter.setRowFilter(null);
          } else {
            try {
              sorter.setRowFilter(
                  RowFilter.regexFilter(text));
            } catch (PatternSyntaxException pse) {
              System.err.println("Bad regex pattern");
            }
          }
		
	}

	public void keyTyped(KeyEvent k ) {
		// irgendwann mal
		
	}
}

Code:
import javax.swing.table.DefaultTableModel;

public class CheckBoxModel extends DefaultTableModel 
{
	
	public CheckBoxModel(String[][] r, String[] c)
	{
		super(r,c);
	}
	
	public Class getColumnClass(int columnIndex)
    {
		
		
          Class returnValue;
          if(columnIndex == 0) {
             return Boolean.class;    //checkbox
        	   
         }
          if ((columnIndex >= 0) && (columnIndex < getColumnCount())) {
            returnValue = getValueAt(0, columnIndex).getClass();
          } else {
            returnValue = Object.class;
          }
          return returnValue;
          
     }
}


Meine Frage nun: Hat irgendwer eine Idee, wie ich die Ergebniszellen, also die Zellen, die dem Filterkriterium entsprechen farbig dargestellt bekomme?

Irgendwie bekomme ich das nicht so hin, da sich mehrere Zellen in Abhaengigkeit der Eingabe gleichzeitig haeufig aendern muessen.

Fuer einen Tip waere ich dankbar.

Gruesse
 
versuch einen TableCellRenderer...

Code:
//eigener Renderer bauen...
class MyTableCellRenderer extends DefaultTableCellRenderer
    {
    public java.awt.Component getTableCellRendererComponent(
	JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column )
	{
	super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column );
                if (column == 0)
                    { 
                        setBackground(java.awt.Color.green );
                    }
                else 
                    {
                         setBackground(table.getBackground());
                     }
                  //kannst du auch mit selected machen...
                  // oder mit value.equals/=="blabla"... if halt...^^
                  //du musst aber IMMER mit else arbeiten, da er z.B. die Farbeinstellungen sich solange merkt 
                  //und umbaut, bis andere Einstellugnen gesetzt werden.

                    }
    }
//den Renderer zum TableCellRenderer machen...
TableCellRenderer ren = new MyTableCellRenderer();

//den TableCellRenderer setzen... 
table.setDefaultRenderer(Object.class, ren );

müsste so gehen...

mein Problem dabei ist nurnoch, dass der Renderer anscheinent nicht geupdated wird, wenn ich mit einem Rowsorter meine table sortier...
also der erkennt im moment noch nicht wirklich, wenn ich umsortiere/Filtere...
aber das liegt glaub ich daran, dass ich irgendwo die falschen Daten dazu hernehme...
nämlich das Array der Table... und nicht auf wie es sein sollte auf die gefilterte/sortierte Tabelle...^^

PS: dadurch, dass ich dir gerade geholfen habe, habe ich meinen eigenen Fehler gefunden...😀 danke...😉*g*
 
Ich habe im Moment das gleich Problem, ich habe einen Datensatz sortiert und möchte im Nachhinein Zellen mit einem bestimmten Wert markieren, das klappt leider nicht, weil er anscheinend mit dem Werte-Vergleich bzw. mit der Aktualisierung Probleme hat. Kann das sein, dass der Render nach dem automatischen Verändern der Zellen nicht die Änderungen berücksichtigt bzw. die Zellen markiert sondern erst nach manuellem Verändern des Inhalts?
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben