B
Beni
Gast
Ich möchte auf den Spaltenüberschriften einer JTable ein Icon darstellen.
Da sich der Header nicht von einem "normalen" Header in Bezug auf das LookAndFeel unterscheiden soll, wollte ich einen "Wrapper" schreiben. Dieser Wrapper nimmt den Standard-CellRenderer (welcher die Spaltenüberschrift darstellt), umkappselt ihn, leitet alle Aufrufe (getPreferredSize, etc...) zu ihm weiter, aber wenn paint aufgerufen wird, wird halt zusätzlich noch ein Icon gezeichnet.
Das Problem ist: das Windows-XP LookAndFeel spielt nicht mit.
Und ich hab 0 Ahnung, was ich noch versuchen könnte.
P.S. Die alternative, die paint-Methode des JTableHeader's zu überschreiben hat Roar schon vorgeschlagen. Allerdings ist mir nicht klar, wie ich von dort aus an die Position der einzelnen CellRender kommen soll, zumal dies auch irgendwo im LookAndFeel versteckt ist.
Das Bild:
Oben ist WinXP, und der Header wird nicht richtig dargestellt.
Mitte ist WinXP, aber in altem Look, was funktioniert
Unten ist das Metal-Ocean, was ebenfalls funktioniert
Hier der Code, der das verursacht (soweit gekürzt wie möglich. Bitte keine Bemerkungen zum Stil, das ist nur ein Testprogi :wink: )
Da sich der Header nicht von einem "normalen" Header in Bezug auf das LookAndFeel unterscheiden soll, wollte ich einen "Wrapper" schreiben. Dieser Wrapper nimmt den Standard-CellRenderer (welcher die Spaltenüberschrift darstellt), umkappselt ihn, leitet alle Aufrufe (getPreferredSize, etc...) zu ihm weiter, aber wenn paint aufgerufen wird, wird halt zusätzlich noch ein Icon gezeichnet.
Das Problem ist: das Windows-XP LookAndFeel spielt nicht mit.
Und ich hab 0 Ahnung, was ich noch versuchen könnte.
P.S. Die alternative, die paint-Methode des JTableHeader's zu überschreiben hat Roar schon vorgeschlagen. Allerdings ist mir nicht klar, wie ich von dort aus an die Position der einzelnen CellRender kommen soll, zumal dies auch irgendwo im LookAndFeel versteckt ist.
Das Bild:
Oben ist WinXP, und der Header wird nicht richtig dargestellt.
Mitte ist WinXP, aber in altem Look, was funktioniert
Unten ist das Metal-Ocean, was ebenfalls funktioniert
Hier der Code, der das verursacht (soweit gekürzt wie möglich. Bitte keine Bemerkungen zum Stil, das ist nur ein Testprogi :wink: )
Code:
/*
* Created on 22.03.2005
*/
package forum;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.plaf.UIResource;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
public class HeaderTest{
public static void main( String...args ){
boolean system = true;
try{
if( system )
UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );
else
UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName() );
}
catch( Exception e ){
}
String[] names = new String[]{ "A", "B", "C" };
String[][] data = new String[][]{ {"a", "b", "c"}, {"d", "e", "f"} };
TableModel model = new DefaultTableModel( data, names );
Header header = new Header();
JTable table = new JTable();
header.setColumnModel( table.getColumnModel() );
table.setTableHeader( header );
table.setModel( model );
JFrame frame = new JFrame( "Test" );
frame.add( new JScrollPane( table ));
frame.pack();
frame.setLocationRelativeTo( null );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setVisible( true );
}
private static class Header extends JTableHeader{
public void setDefaultRenderer( TableCellRenderer defaultRenderer ) {
super.setDefaultRenderer( new Renderer( defaultRenderer ));
}
}
private static class Renderer extends JPanel implements TableCellRenderer, UIResource{
private TableCellRenderer original;
private Component image;
public Renderer( TableCellRenderer original ){
this.original = original;
}
public Component getTableCellRendererComponent( JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column ){
image = original.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column );
return this;
}
public void paint( Graphics g ) {
image.paint( g );
// Ein roter Punkt, als "Beweis", wer hier zeichnet
g.setColor( Color.RED );
int w = getWidth();
int h = getHeight();
g.fillOval( w-h, 0, h, h );
}
public void update( Graphics g ) {
image.update( g );
}
public void setBounds(int x,int y,int width,int height){
super.setBounds( x, y, width, height );
image.setBounds( 0, 0, width, height );
}
public Dimension getPreferredSize() {
return image.getPreferredSize();
}
}
}