2012-09-10 22 views
1

昨天我發現了機器人課,並認爲它非常酷。今天我想嘗試一下,看看有什麼可能的;所以我決定我想製作一個程序,它會截取整個屏幕的截圖,並在JPanel上逐像素地呈現圖像。我已經完成了程序(兩個類),但它不起作用,我無法找到原因(我已經仔細查看了幾次代碼)。下面的代碼:Java截圖(使用Robot和BufferedImage.getRGB)

(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(); 
      } 
     } 
    } 
} 

我已經解決此問題一派無濟於事。

誰能告訴我我做錯了什麼?

+1

'Two'應該可能是顯示'screenCap'的'JLabel'的一個實例。 –

回答

0

每次重新繪製時,在整個面板上繪製白色,然後只做一個像素。所以在每個之後,你只會得到一個像素。也不必多次撥打repaint。實際上,當你撥打repaint時,它並不會立即打電話給paintComponent。它只是提交一個重繪請求,最終這個擺動會做。這可能不是一對一的。例如,很多撥打repaint的電話可能只會致電paintComponent。您應該嘗試編寫代碼,以便對paintComponent的單個調用將完全顯示該組件。

爲此,您可以使用g.drawImage來顯示BufferedImage。有關在JPanel中顯示圖像的更多信息,請參閱this

3

爲了使其工作,只是用下面的更換你的paintComponent()方法在Two類:

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    setBackground(Color.WHITE); 
    g.drawImage(screenCap, 0, 0, getWidth(), getHeight(), null); 
} 

您也可以擺脫doRender()方法。

+0

哦,謝謝!我不知道drawImage()(仍然瞭解API) –

1

Two也許應該是顯示screenCap一個JLabel的一個實例。例如。

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); 
    } 
} 

如果你希望真的很整潔,可以將它放在滾動窗格中。不包括電池。

如果不明顯:A JOptionPane使用JLabel來呈現ImageIcon