TableHeader mit Zeilenumbruch

RLott

Grünschnabel
Hallo,

ich stehe vor folgender Problematik - ich nutze einen Zeilenumbruch im TableHeader und die Java 6 Sortierung (RowSorter). Durch das setzen eines neuen HeaderRenderers wird das SortierIcon im TableHeader nicht mehr angezeigt (siehe nachfolgendes CodeSnippet):

Code:
import java.awt.Component;
import java.awt.Dimension;
import java.util.Enumeration;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextPane;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;

public class MultiHeader {

	public static void main(String[] args)
	{
		new CustomFrame();
	}
}

class CustomFrame extends JFrame {

	private static final long serialVersionUID = 1L;

	public CustomFrame()
	{
		CustomPanel customPanel = new CustomPanel();
		this.setContentPane(customPanel);

		this.pack();
		this.setTitle("JFrame");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}
}

class CustomPanel extends JPanel {

	private static final long serialVersionUID = 1L;

	public CustomPanel()
	{
		JTable table = new JTable();

		CustomTableModel model = new CustomTableModel();
		table.setModel(model);
		table.setRowSorter(new TableRowSorter<TableModel>(model));

		CustomHeaderRenderer customHeaderRenderer = new CustomHeaderRenderer();

		Enumeration<TableColumn> e = table.getColumnModel().getColumns();
		while (e.hasMoreElements())
		{
			((TableColumn) e.nextElement()).setHeaderRenderer(customHeaderRenderer);
		}

		table.setPreferredScrollableViewportSize(new Dimension(200, 70));
		table.setFillsViewportHeight(true);

		JScrollPane scrollPane = new JScrollPane(table);

		this.add(scrollPane);
	}
}

class CustomHeaderRenderer extends JTextPane implements TableCellRenderer {

	private static final long serialVersionUID = 1L;

	public CustomHeaderRenderer()
	{
		setOpaque(true);
		setForeground(UIManager.getColor("TableHeader.foreground"));
		setBackground(UIManager.getColor("TableHeader.background"));
		setBorder(UIManager.getBorder("TableHeader.cellBorder"));
		StyledDocument doc = this.getStyledDocument();
		MutableAttributeSet standard = new SimpleAttributeSet();
		StyleConstants.setAlignment(standard, StyleConstants.ALIGN_CENTER);
		StyleConstants.setFontFamily(standard, "Arial");
		doc.setParagraphAttributes(0, 0, standard, true);
	}

	public Component getTableCellRendererComponent(JTable jTable, Object obj, boolean isSelected, boolean hasFocus, int row, int column)
	{
		setText((String) obj);
		return this;
	}
}

class CustomTableModel extends DefaultTableModel {

	private static final long serialVersionUID = 1L;

	public CustomTableModel()
	{
		Object[] columnNames = {"Multi\nLine\nHeader", "\nTwo", "\nThree", "\nFour"};

		Object[][] data = {{"1", "1", "1", "1"}, {"2", "2", "2", "2"}, {"3", "3", "3", "3"}, {"4", "4", "4", "4"}};

		this.setDataVector(data, columnNames);
	}

	@Override
	public Class<?> getColumnClass(int columnIndex)
	{
		return String.class;
	}
}


Nehm ich den "CustomHeaderRenderer" wieder raus, ist die Anzeige des SortierIcons wieder da... Weiß jemand wie man den Zeilenumbruch und das Anzeigen des Icons harmonisiert bekommt ?

Gruß
Reiner
 
Das Problem ist, dass das Zeichnen des Sortierpfeiles beim DefaultRenderer auch von der Funktion getTableCellRendererComponent übernommen wird. Da du diese Funktion aber leider überschrieben hast, wird der Pfeil nicht mehr angezeigt.

Hier aber mal der Quellcode des DefaultRenderers:
http://www.java2s.com/Open-Source/J...ererComponentJTableObjectbooleanbooleanintint
Vielleicht hilft es dir ja und du kannst die nötigen Teile in deine Implementierung reinkopieren ;)
 
Zurück