XP-LookAndFeel + modifizierter JTableHeader unsichtbar

Status
Nicht offen für weitere Antworten.
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.

forum_053.png

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();
		}
	}
}
 

Wildcard

Top Contributor
Das hört sich jetzt vieleicht etwas dämlich an, aber du könntest das Bild auch per html in den Header setzen :D
 
B

Beni

Gast
Die Tabelle soll universell einsetzbar sein (sie wird Teil einer Library), wenn da schon jemand html-benutzt, und ich flicke auchnoch dran rum... wird irgendwann kompliziert, dass das noch funktioniert.

Aber falls da niemand ne brauchbare Lösung findet, werd ich das wohl nehmen.

Danke Wildcard
 
B

Beni

Gast
Ein paar Stunden Schlaf taten Wunder...

Es gab gleich zwei Probleme: zum einen benötigt dieser Renderer offenbar eine Parent-Component -> ein add( image ) reicht.
Zum anderen wird der XP-Style-Hintergrund zwar gezeichnet, aber von dem Renderer selbst übermalt, jedenfalls muss ich als Workaround "setOpaque( false )" für den Renderer aufrufen (das ganze wird offenbar irgendwo im LookAndFeel umgestellt, aber meine Zwischenebene "Renderer" unterbricht diese Kommunikation irgendwie).

Hier ist jedenfalls noch die korrigierte Version
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.JComponent;
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;
			setLayout( null );
		}
		
		public Component getTableCellRendererComponent( JTable table, Object value,
				boolean isSelected, boolean hasFocus, int row, int column ){
			
			image = original.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column );
			
			if( image instanceof JComponent )
				((JComponent)image).setOpaque( false );
			
			removeAll();
			add( image );
			
			return this;
			//return image;
		}
		
		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();
		}
	}
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T LookAndFeel LookAndFeel funktioniert nicht beim JFrame wechsel AWT, Swing, JavaFX & SWT 3
F Setzen des LookAndFeel AWT, Swing, JavaFX & SWT 4
T LayoutManager LookAndFeel-Problem AWT, Swing, JavaFX & SWT 4
U LookAndFeel für eine Komponente AWT, Swing, JavaFX & SWT 2
N LookAndFeel Wie kann ich mein eigenes LookAndFeel machen? AWT, Swing, JavaFX & SWT 6
I LookAndFeel setzen AWT, Swing, JavaFX & SWT 17
I LookAndFeel AWT, Swing, JavaFX & SWT 15
GUI-Programmer Translucent JFrame mit System-LookAndFeel AWT, Swing, JavaFX & SWT 4
D LookAndFeel setzen AWT, Swing, JavaFX & SWT 2
hdi Swing ListCellRenderer und LookAndFeel AWT, Swing, JavaFX & SWT 11
K LookAndFeel LookAndFeel nur für einen Frame? AWT, Swing, JavaFX & SWT 6
B LookAndFeel für einen Komponenten AWT, Swing, JavaFX & SWT 2
J Swing LookAndFeel Klassenname herausfinden AWT, Swing, JavaFX & SWT 2
FuriKuri LookAndFeel in Linux setzen AWT, Swing, JavaFX & SWT 16
T Swing Substance LookAndFeel verhält sich merkwürdig AWT, Swing, JavaFX & SWT 4
G LookAndFeel AWT, Swing, JavaFX & SWT 5
G setLookAndFeel to default LookAndFeel? AWT, Swing, JavaFX & SWT 4
D LookAndFeel mit WindowBlinds AWT, Swing, JavaFX & SWT 2
DeeDee0815 LookAndFeel während der Laufzeit verstellen AWT, Swing, JavaFX & SWT 4
I LookAndFeel AWT, Swing, JavaFX & SWT 3
B Frage zu Synth LookAndFeel AWT, Swing, JavaFX & SWT 4
G Windows LookAndFeel - Classpath AWT, Swing, JavaFX & SWT 6
G Ändern der Standartschrift vom LookAndFeel AWT, Swing, JavaFX & SWT 4
G JButton LookAndFeel AWT, Swing, JavaFX & SWT 2
O LookAndFeel und Performance AWT, Swing, JavaFX & SWT 7
M Problem mit LookAndFeel auf unterschiedlichen Rechnern AWT, Swing, JavaFX & SWT 3
M LookAndFeel? Erst beim 2.Mal Öffnen eines Menüs? AWT, Swing, JavaFX & SWT 3
T LookAndFeel Erstellung :: Problem mit JTabbedPanes AWT, Swing, JavaFX & SWT 2
D Font eines JLabels verändern, JLabel mit LookAndFeel-Format AWT, Swing, JavaFX & SWT 2
N LookAndFeel - Nicht gleich alles überschreiben AWT, Swing, JavaFX & SWT 8
G JFileChooser: leeres Fenster nach LookAndFeel-Wechel AWT, Swing, JavaFX & SWT 7
M LookAndFeel und Mnemonische Kürzel AWT, Swing, JavaFX & SWT 7
G LookAndFeel in extra Fenster einstellbar AWT, Swing, JavaFX & SWT 2
B wie behält man die aktuellen LookAndFeel einstellungen? AWT, Swing, JavaFX & SWT 7
G Modifizierter Ladebalken? AWT, Swing, JavaFX & SWT 15
R JTableHeader verschachteln AWT, Swing, JavaFX & SWT 7
O JTableHeader Opaque AWT, Swing, JavaFX & SWT 2
N Filterzeile im JTableHeader AWT, Swing, JavaFX & SWT 5
T JTableHeader bearbeiten. AWT, Swing, JavaFX & SWT 4
J JTableHeader - setReorderingAllowed() Problem AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben