- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试使用以下代码将表格标题单元格渲染到 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,下面是 Metal):
以及创建它们的代码(只需注释掉 main 的第一行即可查看默认的 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,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15546248/
我需要在每个渲染帧完成后拍摄屏幕截图,但我发现某些屏幕截图是重复的,所以我想知道是否可以在渲染完成之前保存屏幕截图。因此... renderer.render() 会阻塞直到完成渲染吗? 如果没有,有
web.py 骨架代码中的“render._keywords['globals']['render'] = render”是什么意思? http://webpy.org/skeleton/0.3 最佳
所以在我的 Nuxt universal-mode 应用程序中,我有时会出现错误: vue.runtime.esm.js:620 [Vue warn]: The client-side rendere
我想创建一个 portal-like effect使用 Bevy . Unity 似乎有一个 render texture实现这一目标。 有没有办法在 Bevy 中做同样的事情?如果没有, futur
我有一个看起来像这样的组件(非常简化的版本): const component = (props: PropTypes) => { const [allResultsVisible, setA
编辑:我调整了代码,但问题仍然存在。见下文 我有这个 p:selectOneRadio : 而这个 p:radioButton : 和 AData包含其
为了渲染部分我可以使用 render 'partial_name' 或 render partial: 'partial_name' 我开始知道 render 是 render partial 的简写
我注意到文章中的一些地方使用了 React.render() 和一些地方 ReactDOM.render()。这两者有什么具体区别吗? 最佳答案 这是 0.14 中引入的最新更改。他们将 React
我的代码是这样的: function render() { renderer.render( scene, camera ); renderer.clear(); } 我想知道为什么它
我目前正在实现 useSWR 以便从我的 express 和 mongo-db 后端获取数据。我能够从数据库中成功获取数据没问题。以下是我用来实现此目的的代码: ```//SWR method for
我只有在按照 React native - "this.setState is not a function" trying to animate background color? 的建议合并了 u
所以我有一个大的纹理,被分成 64x64 block 。 我使用将其加载到 LibGDX texture = new Texture("texturemap.png"); regions = Text
我对放置 @Scripts.Render 和 @Styles.Render 的位置感到很困惑。理想情况下,我会将它们全部放在 head 部分中,但出乎意料的是,例如 @Scripts.Render("
我正在尝试使用 jamon 来收集使用 Tapestry 的网站的统计信息(呈现网页的时间)。 我怎样才能拥有 服务器收到请求时执行的方法,即渲染开始时? 响应全部发送完毕,即渲染结束时执行的方法 ?
在我的 React 应用程序中,我想要渲染一个 prop 值,但直到渲染完成后更新 props 后它才存在。 this.props.users 是一个对象,因此我使用 Object.keys() 转换
我正在使用 React 的钩子(Hook),我希望有一个从数据库中检索到的值作为初始值。但是,我收到以下错误: Invariant Violation: Invariant Violation: Re
我正在尝试按照以下代码将多个场景包含到单个 webgl 渲染器中: renderer.render(scene1, camera); renderer.render(scene2, camera);
我在我的 xhtml 页面中使用此代码,当我运行应用程序时,元描述仍在呈现。我想根据某些条件使用元描述标签。主布局: ..........
我正在使用react-native-render-html来渲染html。renderers方法允许我提供自定义函数来呈现特定标签。不过,我想使用源代码中的原始内部 HTML 将子组件替换为我的自定义
我有一个网格,可以渲染可变高度的卡片。 为了获取卡片的高度,我将卡片渲染在 ReactHeight 中。 ( https://github.com/nkbt/react-height ),这让我可以在
我是一名优秀的程序员,十分优秀!