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):
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
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