Java Swing:Render Component incl. LaF进入BufferedImage
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java Swing:Render Component incl. LaF进入BufferedImage,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6864字,纯文字阅读大概需要10分钟。
内容图文
我正在尝试使用以下代码将表头单元格呈现为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中,但之前没有应用Look-and-Feel. LaF已在应用程序启动时设置为系统的默认值.
为了渲染组件的应用LaF,我还需要做什么?
编辑:
@Guillaume Polet:
我运行你的代码,我得到相同的结果,但一旦我渲染整个表,我看到以下内容:
在Linux上:
在Windows上:
在Linux上,代码似乎可以工作,而在Windows中它省略了LaF.
在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;
}
}
解决方法:
这似乎对我来说很好(虽然系统L& F和默认系统之间的区别并不明显)
示例(上面是原生L& F,下面是金属):
并创建那些代码(只需注释主要的第一行,看看默认的L& F)
import java.awt.Component;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Arrays;
import java.util.Vector;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
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(new Vector<Vector<Object>>(), new Vector<String>(Arrays.asList("Hello", "World")));
int column = 1;
Component component = table.getTableHeader().getDefaultRenderer()
.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.setColor(component.getForeground());
g.setFont(component.getFont());
component.paint(g);
JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(img)), "Test", JOptionPane.INFORMATION_MESSAGE, null);
System.exit(0);
}
}
编辑:确实Windows“皮肤”没有正确绘制.我不确定为什么它不直接绘画(可能是因为渲染器不是“实时”组件).但是,一个简单的技巧是打印它,是打印整个表头,但使用一个Graphics,它被转换为我们想要的列标题并剪切到列标题的大小:
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.util.Arrays;
import java.util.Vector;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
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() {
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JTable table = new JTable(new Vector<Vector<Object>>(), new Vector<String>(Arrays.asList("Hello", "World")));
frame.add(new JScrollPane(table));
frame.pack();
frame.setVisible(true);
int column = 1;
Rectangle headerRect = table.getTableHeader().getHeaderRect(column);
BufferedImage img = new BufferedImage(headerRect.width, headerRect.height, BufferedImage.TYPE_INT_ARGB);
Graphics g = img.getGraphics();
g.translate(-headerRect.width, 0);
table.getTableHeader().print(g);
frame.add(new JLabel(new ImageIcon(img)), BorderLayout.SOUTH);
frame.pack();
}
}
内容总结
以上是互联网集市为您收集整理的Java Swing:Render Component incl. LaF进入BufferedImage全部内容,希望文章能够帮你解决Java Swing:Render Component incl. LaF进入BufferedImage所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。