2012-06-12 32 views
6

Tôi đang tạo một ứng dụng chụp màn hình dựa trên Java và tôi muốn tạo nó khi bạn nhấn tổ hợp phím trên bàn phím của mình như một sự kiện this video xảy ra ở nơi bạn chọn và khu vực trên màn hình và chụp ảnh màn hình của khu vực đã chọn.Chọn vùng cần chụp bằng cách sử dụng chuột

Cách chọn khu vực để chụp bằng chuột?

+0

Tôi vừa hoàn thành thêm con trỏ tùy chỉnh. Tôi không có ý tưởng về cách bắt đầu làm cho nó có thể chọn màn hình. –

+0

Bạn đã làm gì trong nỗ lực của mình để giải quyết vấn đề này, ngoài việc đăng câu hỏi này? – Jeffrey

+1

Tôi đã tìm kiếm ít nhất 3 ngày nay trên một số loại gợi ý về cách thức làm việc này. Đã không tìm thấy một, vì vậy tôi quyết định đăng câu hỏi này. –

Trả lời

16

Bắt đầu với một cái gì đó như thế này.

Screen Capture Rectangle

import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.*; 
import javax.swing.*; 

/** Getting a Rectangle of interest on the screen. 
Requires the MotivatedEndUser API - sold separately. */ 
public class ScreenCaptureRectangle { 

    Rectangle captureRect; 

    ScreenCaptureRectangle(final BufferedImage screen) { 
     final BufferedImage screenCopy = new BufferedImage(
       screen.getWidth(), 
       screen.getHeight(), 
       screen.getType()); 
     final JLabel screenLabel = new JLabel(new ImageIcon(screenCopy)); 
     JScrollPane screenScroll = new JScrollPane(screenLabel); 

     screenScroll.setPreferredSize(new Dimension(
       (int)(screen.getWidth()/3), 
       (int)(screen.getHeight()/3))); 

     JPanel panel = new JPanel(new BorderLayout()); 
     panel.add(screenScroll, BorderLayout.CENTER); 

     final JLabel selectionLabel = new JLabel(
       "Drag a rectangle in the screen shot!"); 
     panel.add(selectionLabel, BorderLayout.SOUTH); 

     repaint(screen, screenCopy); 
     screenLabel.repaint(); 

     screenLabel.addMouseMotionListener(new MouseMotionAdapter() { 

      Point start = new Point(); 

      @Override 
      public void mouseMoved(MouseEvent me) { 
       start = me.getPoint(); 
       repaint(screen, screenCopy); 
       selectionLabel.setText("Start Point: " + start); 
       screenLabel.repaint(); 
      } 

      @Override 
      public void mouseDragged(MouseEvent me) { 
       Point end = me.getPoint(); 
       captureRect = new Rectangle(start, 
         new Dimension(end.x-start.x, end.y-start.y)); 
       repaint(screen, screenCopy); 
       screenLabel.repaint(); 
       selectionLabel.setText("Rectangle: " + captureRect); 
      } 
     }); 

     JOptionPane.showMessageDialog(null, panel); 

     System.out.println("Rectangle of interest: " + captureRect); 
    } 

    public void repaint(BufferedImage orig, BufferedImage copy) { 
     Graphics2D g = copy.createGraphics(); 
     g.drawImage(orig,0,0, null); 
     if (captureRect!=null) { 
      g.setColor(Color.RED); 
      g.draw(captureRect); 
      g.setColor(new Color(255,255,255,150)); 
      g.fill(captureRect); 
     } 
     g.dispose(); 
    } 

    public static void main(String[] args) throws Exception { 
     Robot robot = new Robot(); 
     final Dimension screenSize = Toolkit.getDefaultToolkit(). 
       getScreenSize(); 
     final BufferedImage screen = robot.createScreenCapture(
       new Rectangle(screenSize)); 

     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new ScreenCaptureRectangle(screen); 
      } 
     }); 
    } 
} 
+0

Wow cảm ơn rất nhiều người đàn ông! Thật hữu ích. Chỉ cần tự hỏi bạn đã làm điều đó? –

+0

Được rồi, tôi đã chấp nhận nó. Cảm ơn một lần nữa. –

+0

Điều này sẽ chỉ hoạt động nếu bạn đang chụp ảnh màn hình của ứng dụng Java bạn đang chạy. Bạn sẽ không thể sàng lọc lấy các ứng dụng khác đang chạy trên màn hình của người dùng. Tôi nghĩ bạn muốn có một ứng dụng chụp màn hình mục đích chung có nghĩa là bạn không thể sử dụng Swing. – chubbsondubs

Các vấn đề liên quan