如何获得java.awt.ImageJFrame
的?
我想获取的屏幕截图JFrame
(以供以后在我的应用程序中使用)。目前,这是通过使用机器人进行截屏来指定相关对象的坐标和尺寸来完成的JFrame
。
但是,我相信有一种更好的方法:默认情况下,Swing
组件在将其自身绘制到屏幕上之前,将它们自己作为图像呈现到双缓冲区中。
有没有办法从组件中获取这些图像?
ComponentImageCapture.java
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Image;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.InputEvent;
import javax.swing.*;
import javax.swing.border.TitledBorder;
import javax.imageio.ImageIO;
import java.io.File;
/**
Create a screenshot of a component.
@author Andrew Thompson
*/
class ComponentImageCapture {
static final String HELP =
"Type Ctrl-0 to get a screenshot of the current GUI.\n" +
"The screenshot will be saved to the current " +
"directory as 'screenshot.png'.";
public static BufferedImage getScreenShot(
Component component) {
BufferedImage image = new BufferedImage(
component.getWidth(),
component.getHeight(),
BufferedImage.TYPE_INT_RGB
);
// call the Component's paint method, using
// the Graphics object of the image.
component.paint( image.getGraphics() ); // alternately use .printAll(..)
return image;
}
public static void main(String[] args) {
Runnable r = new Runnable() {
public void run() {
final JFrame f = new JFrame("Test Screenshot");
JMenuItem screenshot =
new JMenuItem("Screenshot");
screenshot.setAccelerator(
KeyStroke.getKeyStroke(
KeyEvent.VK_0,
InputEvent.CTRL_DOWN_MASK
));
screenshot.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent ae) {
BufferedImage img = getScreenShot(
f.getContentPane() );
JOptionPane.showMessageDialog(
null,
new JLabel(
new ImageIcon(
img.getScaledInstance(
img.getWidth(null)/2,
img.getHeight(null)/2,
Image.SCALE_SMOOTH )
)));
try {
// write the image as a PNG
ImageIO.write(
img,
"png",
new File("screenshot.png"));
} catch(Exception e) {
e.printStackTrace();
}
}
} );
JMenu menu = new JMenu("Other");
menu.add(screenshot);
JMenuBar mb = new JMenuBar();
mb.add(menu);
f.setJMenuBar(mb);
JPanel p = new JPanel( new BorderLayout(5,5) );
p.setBorder( new TitledBorder("Main GUI") );
p.add( new JScrollPane(new JTree()),
BorderLayout.WEST );
p.add( new JScrollPane( new JTextArea(HELP,10,30) ),
BorderLayout.CENTER );
f.setContentPane( p );
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
};
SwingUtilities.invokeLater(r);
}
}
另见
上面显示的代码假定组件在渲染之前已在屏幕上实现。
Rob Camick展示了如何在Screen Image类中绘制未实现的组件。
另一个可能与此相关的主题是Render JLabel,没有第一个显示,特别是Darryl Burke的“一个行修复”。
LabelRenderTest.java
这是第二个链接上显示的代码的更新后的变体。
import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
public class LabelRenderTest {
public static void main(String[] args) {
SwingUtilities.invokeLater( new Runnable() {
public void run() {
String title = "<html><body style="width: 200px; padding: 5px;'>"
+ "<h1>Do U C Me?</h1>"
+ "Here is a long string that will wrap. "
+ "The effect we want is a multi-line label.";
JFrame f = new JFrame("Label Render Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
BufferedImage image = new BufferedImage(
400,
300,
BufferedImage.TYPE_INT_RGB);
Graphics2D imageGraphics = image.createGraphics();
GradientPaint gp = new GradientPaint(
20f,
20f,
Color.red,
380f,
280f,
Color.orange);
imageGraphics.setPaint(gp);
imageGraphics.fillRect(0, 0, 400, 300);
JLabel textLabel = new JLabel(title);
textLabel.setSize(textLabel.getPreferredSize());
Dimension d = textLabel.getPreferredSize();
BufferedImage bi = new BufferedImage(
d.width,
d.height,
BufferedImage.TYPE_INT_ARGB);
Graphics g = bi.createGraphics();
g.setColor(new Color(255, 255, 255, 128));
g.fillRoundRect(
0,
0,
bi.getWidth(f),
bi.getHeight(f),
15,
10);
g.setColor(Color.black);
textLabel.paint(g);
Graphics g2 = image.getGraphics();
g2.drawImage(bi, 20, 20, f);
ImageIcon ii = new ImageIcon(image);
JLabel imageLabel = new JLabel(ii);
f.getContentPane().add(imageLabel);
f.pack();
f.setLocationByPlatform(true);
f.setVisible(true);
}
});
}
}
使用Java图形,我试图画一个简单的矩形。 作为它运行良好,但当我使用它在上显示时,矩形来了,但有一些不寻常的背景 这是编码: 然后我尝试使用使用这两个类,但在这种情况下,矩形根本不显示。 和DisplayItems。java: 任何人都可以帮助我在任何摆动容器上显示图形组件,例如JPanelJTextArea'等。
问题内容: 我正在尝试为组件的选定像素获取Swing JFrame的颜色。 例如,我想知道的给定的颜色在他们的点。 原因是我的组件是一个部分透明的覆盖层,在下面。对于不透明的像素,鼠标事件应由叠加层处理。对于透明像素,应将鼠标事件转发到下方。 这是这样做的方法吗? 问题答案: 我想说(希望这样做会带来更好的性能),也许,如果您愿意采用这种方法,则最好创建一个尺寸为1x1像素的图像,然后转换其创建的
问题内容: 我如何获得JPanel所在的JFrame? 我当前的解决方案是询问面板的父面板(依此类推),直到找到Window: 标准库中有没有一种更优雅的方法? 问题答案: 您可以使用 将返回可转换为顶级类型的Window的方法。
问题内容: 我只是编写了一个简单的代码,希望在主框架上显示一个文本字段和一个按钮,但是运行全部后,我看到的是文本字段。 如果我在文本字段后编写按钮的代码,则仅显示按钮。 知道为什么吗? 问题答案: 将组件添加到JPanel,然后将该面板添加到JFrame的ContentPane。
问题内容: 我学习Java已有几周了,在将背景图像应用于JFrame时,我真的很困惑。我遇到的每个教程都不像我那样创建Frames(我扩展了JFrame),或者如果这样做,说明还不够清楚,我无法理解。 下面的代码来自我自己的项目,因此可以帮助我练习到目前为止所学的内容。请您能否以下面的代码为基础,并向我说明要添加的内容和位置,所以我可能以图像作为框架的背景? 我真正要感谢的一件事是,如果您能解释事
我把一些JPanel放到另一个JPanel中,它的布局是长方体布局和Y轴。在我放置了所有面板之后,我需要从JPanel容器面板获取每个添加的JPanel的Y位置。当我每次都得到零的时候。请告诉我如何从Jpanel容器Jpanel获取每个Jpanel的Y位置。 这就是我所做的,