我昨天发现了机器人课程,并认为这很酷。今天我想尝试一下,看看有什么可能;所以我决定制作一个截取整个屏幕截图的程序,并在JPanel上逐个像素地渲染出一个图像。我已完成程序(两个类),但它不起作用,我找不到原因(我已经查看了几次代码)。这是代码:
(FIRST CLASS)
import java.awt.AWTException;
import java.awt.FlowLayout;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
public class One {
public static void main(String[] args) {
BufferedImage screenCap = null;
Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
try {
screenCap = new Robot().createScreenCapture(screenRect);
Two imageRenderer = new Two(screenCap, screenRect);
imageRenderer.doRender();
JFrame frame = new JFrame();
frame.setVisible(true);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
frame.add(imageRenderer);
frame.pack();
} catch (AWTException e) {
e.printStackTrace();
}
}
}
(第二类)
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
public class Two extends JPanel {
private BufferedImage screenCap;
private Rectangle screenRect;
private Color pixelRGB;
//c1 and c2 are the x and y co-ordinates of the selected pixel.
private int c1, c2;
public Two(BufferedImage sC, Rectangle rect) {
screenCap = sC;
screenRect = rect;
setPreferredSize(new Dimension(rect.width, rect.height));
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
setBackground(Color.WHITE);
g.setColor(pixelRGB);
g.drawRect(c1, c2, 1, 1);
}
public void doRender() {
for(int i=0; i<screenRect.width; i++) {
for(int j=0; j<screenRect.height; j++) {
pixelRGB = new Color(screenCap.getRGB(i, j));
c1 = i;
c2 = j;
repaint();
}
}
}
}
我用Google搜索这个问题无济于事。
谁能告诉我我做错了什么?
答案 0 :(得分:3)
为了使其有效,只需使用以下内容替换班级paintComponent()
中的Two
方法:
public void paintComponent(Graphics g) {
super.paintComponent(g);
setBackground(Color.WHITE);
g.drawImage(screenCap, 0, 0, getWidth(), getHeight(), null);
}
您也可以摆脱doRender()
方法。
答案 1 :(得分:1)
Two
应该是显示JLabel
的{{1}}的实例。 E.G。
screenCap
如果您希望对它真的很整洁,请将其放在滚动窗格中。电池不包括在内。
如果不明显:import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
public class Screenshot {
public static void main(String[] args) throws Exception {
Rectangle screenRect = new Rectangle(
Toolkit.getDefaultToolkit().getScreenSize());
final BufferedImage screenCap =
new Robot().createScreenCapture(screenRect);
Runnable r = new Runnable() {
@Override
public void run() {
JOptionPane.showMessageDialog(null, new ImageIcon(screenCap));
}
};
SwingUtilities.invokeLater(r);
}
}
使用JOptionPane
呈现JLabel
。
答案 2 :(得分:0)
每次重绘时,在整个面板上涂上白色,然后只做一个像素。所以在每一个之后,你只会得到一个像素。也没有必要多次致电repaint
。实际上,当您拨打repaint
时,它并不会立即实际呼叫paintComponent
。它只是提交一个重绘的请求,最终会做什么。它可能不是一对一的。例如,对repaint
的多次调用可能只会调用paintComponent
。您应该尝试编写代码,以便对paintComponent
的单个调用将完全显示该组件。
为此,您可以使用g.drawImage
显示BufferedImage。有关在JPanel中显示图像的详细信息,请参阅this帖子。