BufferedImage
次のコードを使用して、テーブルのヘッダー セルを にレンダリングしようとしています。
Component component = table.getTableHeader().getDefaultRenderer().
getTableCellRendererComponent( table, value, selected, focused, 0, 0 );
component.setBounds( 0, 0,
table.getColumnModel().getColumn( 0 ).getWidth(),
table.getRowHeight() );
BufferedImage img = new BufferedImage( component.getWidth(),
component.getHeight(),
BufferedImage.TYPE_INT_ARGB );
Graphics g = img.getGraphics();
g.setColor( component.getForeground() );
g.setFont( component.getFont() );
component.paint( g );
このコードはTableCellRenderer#getTableCellRendererComponent
メソッド内で実行されます。
コンポーネントは BufferedImage にレンダリングされますが、ルック アンド フィールは以前に適用されていません。LaF は、アプリケーションの開始時にシステムのデフォルトに設定されています。
コンポーネントの適用された LaF もレンダリングするにはどうすればよいですか?
編集:
@Guillaume
Polet:
コード
を実行すると同じ結果が得られますが、テーブル全体をレンダリングすると、次のように表示
されます。
Windowsでは、次のようなものを期待します:
私のコード:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Vector;
import javax.swing.CellRendererPane;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
class TestPrint {
public static void main( String[] args ) throws ClassNotFoundException, InstantiationException,
IllegalAccessException, UnsupportedLookAndFeelException {
UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run() {
new TestPrint().run();
}
} );
}
protected void run() {
JTable table = new JTable( createData() );
int column = 1;
TableCellRenderer renderer = table.getTableHeader().getDefaultRenderer();
Component component = renderer.getTableCellRendererComponent( table, table.getColumnName( column ), false,
false, -1, column );
component.setBounds( 0, 0, table.getColumnModel().getColumn( 0 ).getWidth(), table.getRowHeight() );
BufferedImage img = new BufferedImage( component.getWidth(), component.getHeight(), BufferedImage.TYPE_INT_ARGB );
Graphics g = img.getGraphics();
g.setClip( 0, 0, component.getWidth(), component.getHeight() );
g.setColor( component.getForeground() );
g.setFont( component.getFont() );
CellRendererPane cellRendererPane = new CellRendererPane();
cellRendererPane.paintComponent( g, component, table, 0, 0, component.getWidth(), component.getHeight() );
// SwingUtilities.paintComponent( g, component, table,
// new Rectangle( 0, 0, component.getWidth(), component.getHeight() ) );
// component.paint( g );
showTable( table );
showImage( img );
}
private void showImage( BufferedImage img ) {
JOptionPane.showMessageDialog( null, new JLabel( new ImageIcon( img ) ), "Test",
JOptionPane.INFORMATION_MESSAGE, null );
}
private void showTable( JTable table ) {
JScrollPane scrollPane = new JScrollPane();
scrollPane.setViewportView( table );
JFrame frame = new JFrame();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setLayout( new BorderLayout() );
frame.add( scrollPane, BorderLayout.CENTER );
frame.setSize( 400, 300 );
frame.setVisible( true );
}
private DefaultTableModel createData() {
DefaultTableModel data = new DefaultTableModel( 0, 6 );
for ( int i = 0; i < 30; i++ ) {
Vector v = new Vector();
for ( int k = 0; k < 6; k++ ) {
v.add( new Float( k / (float) i ) );
}
data.addRow( v );
}
return data;
}
}