Komplexe JTable mit JPanels im Header

barsiq

Mitglied
Hallöchen,

für eine Anwendung bastele ich eine recht komplexe Tabelle - unter Anderem mit einem 2-zelligen Header, oben die Spaltenbezeichnung, unten ein Panel, wo z.B. eine Suchmaske oder DropDownBox oder so eingebaut sind.
Die Sortierung erfolgt (momentan, nicht zwingend) mit Hilfe von TableRowSorter.

Die Panels werden in einem HeaderRenderer eingesetzt, z.B. so:
Code:
   public Component getTableCellRendererComponent(JTable table, Object
    		value, boolean isSelected, boolean hasFocus, int row, int column) {
    	
    	if (value.toString().equals("TYP")){
    		JPanel panel = new JPanel();
    		JButton b = new JButton("local");
    		b.addMouseListener(new MouseAdapter(){
    			@Override public void mouseClicked(MouseEvent e){
    				System.out.println("YEH");
    			}
    		});    
    		JTextField f = new JTextField("suche");
    		panel.setLayout(new GridBagLayout());
    		panel.add(f, new GBC(0,0));
    		panel.add(b, new GBC(1,0));		
    		return panel;

Nur reagiert der Button nicht auf den Klick.

Wie erreiche ich:
1. daß die Panels sich anklicken lassen und
2. die Sortierung nur bei dem Klick auf die oberste Headerzelle ausgelöst wird.

Hier der Code meiner ausführender Klasse:
Code:
package dhp.java.ues.test;

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

import javax.swing.*;
import javax.swing.table.*;
import dhp.java.ues.table.*;

public class Main {

	/**
	 * @param args
	 */
	private static JTable table = new JTable();
	
		public static void main(String[] args) {
			
			final JFrame f = new JFrame();
			f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			f.setTitle("Testapplikation dhp.java.*");
			
			tableModel tm = new tableModel();			
			// Setup table
			table.setColumnModel(new groupableTableColumnModel());
			table.setTableHeader(new groupableTableHeader((groupableTableColumnModel)table.getColumnModel()));
			table.setModel(tm);
			table.getTableHeader().setDefaultRenderer(new headerRenderer());
			table.setPreferredSize(tm.getTableSize());
						           
			// Setup Column Groups
	        groupableTableColumnModel cm = (groupableTableColumnModel)table.getColumnModel();
	        for (int i = 0; i < description.al.size(); i++){
	        	columnGroup cG = new columnGroup(description.al.get(i).getName());
	        	cG.add(cm.getColumn(i));
	        	cm.addColumnGroup(cG);
	        	table.getColumnModel().getColumn(i).setPreferredWidth(description.al.get(i).getBreite());
	        	table.getColumnModel().getColumn(i).setMinWidth(20);
	        }
			
			// Sort
			TableRowSorter<tableModel> rowSorter = new TableRowSorter<tableModel>(tm);
			for (int i = 0; i < description.al.size(); i++){
				rowSorter.setComparator(i, new Comparator<Integer>(){
					public int compare(Integer x, Integer y){
						return x - y;
					}
				});
				rowSorter.setSortable(i, true);				
			}
//			rowSorter.setRowFilter(RowFilter.regexFilter("(0|2|4|6|8)$", 0));
//			rowSorter.setRowFilter(RowFilter.regexFilter("1024|2", 1));
			table.setRowSorter(rowSorter);
			
			//Renderer
			table.getTableHeader().setDefaultRenderer(new headerRenderer());
			
			//Adjustable columns
			table.getTableHeader().setReorderingAllowed(true);
			table.getTableHeader().addMouseListener(
					new MouseAdapter(){
						public void mouseClicked(MouseEvent event){
							int headerColumn = table.columnAtPoint(event.getPoint());
							int headerRow = table.rowAtPoint(event.getPoint());
						
							System.out.println( headerRow + "\t<- Row / Column ->\t" + headerColumn);
							if (headerRow != 0){
								if (headerColumn == 0){
									System.out.println("LALALA");
								}
							}
						}
					});
			
			JScrollPane s = new JScrollPane(table);
			s.setPreferredSize(table.getPreferredSize());
			f.add(s);
			
			f.pack();
			f.setVisible(true);
		}
}

Sollten Fragen da sein zum Klassenaufbau bzw. Code - beantworte ich sie sehr gerne - denn ich bin langsam am Verzweifeln. :confused:

Das heutige Aussehen meiner Tabelle wird angefügt. Die Inhalte sind vorerst zufällig und ohne Bedeutung.
 

Anhänge

  • Clipboard01.jpg
    Clipboard01.jpg
    51,4 KB · Aufrufe: 820
Zuletzt bearbeitet:
Ich bin's wieder.

Mein Problem läßt sich an diesem einfachen Beipiel verdeutlichen:

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

public class main {

	public static void main(String[] args) {

		String[] head ={"A","B","C"};
		
		String[][]body = {{"00","01","02"},
				          {"03","04","05"},
				          {"06","07","08"},
				          {"09","10","11"},
				          {"12","13","14"}};
		
		JFrame f = new JFrame();
		
		JTable table = new JTable(body, head);
		
		table.getTableHeader().setDefaultRenderer(new headerCellRenderer());
		
		f.add(new JScrollPane(table));
		f.pack();
		f.setVisible(true);
	}
}
class headerCellRenderer extends JButton implements TableCellRenderer{

	@Override
	public Component getTableCellRendererComponent(JTable arg0, Object value,
			boolean arg2, boolean arg3, int arg4, int arg5) {
		setText(value.toString());
		this.addActionListener(new headerListener());
		return this;
	}
}
class headerListener implements ActionListener{

	@Override
	public void actionPerformed(ActionEvent event) {
		System.out.println("EventID\t"+event.getID());		
	}
}

Die Button's lassen sich nicht anklicken - nicht nur daß es kein Actionevent kommt, die Buttons sind wie gemalt.
Wobei es bei den Button's noch gegangen wäre, den Mouseklick anzufangen und ggf. das Aussehen zu switschen. Aber was tu ich bei den Komboboxen bzw. Textfeldern?
 
Moin!
Die Button's lassen sich nicht anklicken - nicht nur daß es kein Actionevent kommt, die Buttons sind wie gemalt.

Damit hast du den Nagel auf den Kopf getroffen. Ein Renderer tut nichts anderes als die entsprechenden Komponenten zu malen.. Mehr nicht, keine Funktionalität..
Bei den meisten Swing Komponenten einen gibt es einen Editor, der die Aufgabe hat, eine Komponente bereitzustellen, die auf Benutzereingabe reagiert.
Unglücklicherweise kann man meines Wissens einem TableHeader nicht so einfach einen Editor zuweisen..
Aber vielleicht kann dir dieser Artikel weiterhelfen:
http://www.java2s.com/Code/Java/Swing-Components/EditableHeaderTableExample.htm

*grüssle*
MeinerEiner
 
Zurück