0

で高速または高速のマウス ドラッグを使用するとPanel、マウスのドラッグ機能によっていくつかのポイントがスキップされます。たとえば、次のようになります。

マウスが押されたポイントが 847 で、マウスをすばやくドラッグすると、853,861,.... が返されます。

一点まで正確な値が必要です。これはどのように達成できますか?

これが私のコードです。

package Main;

import java.awt.AWTException;
import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Insets;
import java.awt.KeyboardFocusManager;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Area;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.filechooser.FileNameExtensionFilter;


public class ScreenCapture{
  static ImageArea ia = new ImageArea();
  static JFrame mainFrame = new JFrame();
  static Rectangle rectScreenSize = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());

  static Robot robot;
  private static File movieFolder=null;

  static String cl="null";
  JScrollPane jsp;
  static Date date = new Date();
  static SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_h_mm_ss_a");
  static String formattedDate = sdf.format(date);

  public ScreenCapture() throws AWTException {  }

 public static void save() {
   if (ia.getImage() == null) {
    System.out.println("No captured image.");
    return;
  }
   ImageWriter writer = null;
   ImageOutputStream ios = null;

   try {
     Iterator iter = ImageIO.getImageWritersByFormatName("jpeg");

     if (!iter.hasNext()) {
       System.out.println("Unable to save image to jpeg file type.");
       return;
     }
     //writer = (ImageWriter) iter.next();
     //ios = ImageIO.createImageOutputStream(new File("c:\\Users\\Aadi\\Desktop          \\a.jpg"));
  //writer.setOutput(ios);
  //ImageWriteParam iwp = writer.getDefaultWriteParam();
  //iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
  //iwp.setCompressionQuality(0.95f);
    BufferedImage im = (BufferedImage) ia.getImage();
     BufferedImage im1 = im.getSubimage(ia.selectedRectangle.x+1,    ia.selectedRectangle.y+1, ia.selectedRectangle.width-1, ia.selectedRectangle.height-1);
          //robot.createScreenCapture(new Rectangle(ia.selectedRectangle.x+1,     ia.selectedRectangle.y+1, ia.selectedRectangle.width-1, ia.selectedRectangle.height-1));
  //writer.write(null,
    // new IIOImage(im.getSubimage(ia.selectedRectangle.x, ia.selectedRectangle.y, ia.selectedRectangle.width, ia.selectedRectangle.height), null, null), iwp);
  //Graphics g2d = im1.createGraphics();
  //ia.paint(g2d);
    if( movieFolder == null){
                                    movieFolder = null;
                       //MainIconPage d1 = new MainIconPage();
                    if(Main.MainIconPage.jfc == null)
                       Main.MainIconPage.jfc = new JFileChooser();
    // set selection to folders only
    Main.MainIconPage.filter = new FileNameExtensionFilter("Portable Network Graphics", "png", "png");

    Main.MainIconPage.jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
    Main.MainIconPage.jfc.setSelectedFile(new File("C:/"+"screenShot"+formattedDate+".png"));
    Main.MainIconPage.jfc.setFileFilter(Main.MainIconPage.filter);
    // show chooser dialog
    int r = Main.MainIconPage.jfc.showSaveDialog(Main.MainIconPage.jfc);
    // on selection
    if (r == JFileChooser.APPROVE_OPTION) {
        // set the save folder
        movieFolder = Main.MainIconPage.jfc.getSelectedFile();
   //ImageIO.write(screenShot, "PNG", new File(movieFolder,""));
   ImageIO.write(im1, "PNG",  new File(movieFolder,""));
   cl = movieFolder.toURL().toString().substring(6);
    }else if(r == JFileChooser.CANCEL_OPTION){
    Main.MainIconPage.jfc.hide();
    Main.MainIconPage.jfc = null;
    }}

  } catch (Exception e2) {
    e2.printStackTrace();
  }

  }
  public static void main(String[] args) throws Exception {
     try{
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
     }catch(Exception ex){}

    final ScreenCapture sc = new ScreenCapture();
    sc.robot = new Robot();
    sc.mainFrame.setUndecorated(true);
    sc.mainFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    sc.mainFrame.setVisible(false);

       BufferedImage biScreen = robot.createScreenCapture(rectScreenSize);
       sc.mainFrame.setVisible(true);

       ia.setImage(biScreen);
    sc.mainFrame.getContentPane().add(ia);
    sc.mainFrame.setVisible(true);
    sc.mainFrame.addKeyListener(new KeyListener() {

      @Override
      public void keyTyped(KeyEvent e) {
          //throw new UnsupportedOperationException("Not supported yet.");
      }

      @Override
      public void keyPressed(KeyEvent e) {
          char c = e.getKeyChar();
          if(c==KeyEvent.VK_ESCAPE){
          sc.mainFrame.dispose();
          }
      }

      @Override
      public void keyReleased(KeyEvent e) {
          //throw new UnsupportedOperationException("Not supported yet.");
      }
    });
   }
 }
  class ImageArea extends JPanel 
  implements MouseListener, MouseMotionListener{
  private Image image;
  final static float dash1[] = { 2.0f };
  final static BasicStroke dashed = new BasicStroke(1.0f,
    BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, dash1, 0.0f);
  Point startPoint = new Point(), endPoint = new Point();
  buttonActions btAction = new buttonActions();
  Rectangle selectedRectangle=null;
  boolean dragging=false;
  ImageArea component;
   private int width1;
   private int height1;
   private final int PROX_DIST=3;
   private int mousePressedX;
   private int mousePressedY;
   private int x1;
   private int y1;
   private int x2;
   private int y2;
   private int x3;
   private int y3;
   private int width,height;
   static JButton btSave,btClose,btBrowse,btEdit,btSize;
   ImageIcon save = new ImageIcon(ClassLoader.getSystemResource("images/save.png"));
   ImageIcon close = new ImageIcon(ClassLoader.getSystemResource("images/close.png"));
   ImageIcon tool = new ImageIcon(ClassLoader.getSystemResource("images/tool.png"));
   ImageIcon browse = new    ImageIcon(ClassLoader.getSystemResource("images/browse.png"));
  private boolean move=false;
   private int moveX;
   private int moveY;
   boolean yes=true;
   private Point mouseDraggedPoint;
   private Point mousePressedPoint;
   private boolean not;
   private boolean reverse=false;
   private int resetHeight;
   private int resetWidth;
   private boolean resetRectangle=false;
   SwingUtil s = new SwingUtil();
   private Rectangle areaRect;
  public ImageArea() {
  component = this;
  btSave =new JButton(save);
  btSave.setPreferredSize(new Dimension(40,40));
  btSave.setToolTipText("Save");
  btSave.setActionCommand("btSave");
  btClose = new JButton(close);
  btClose.setPreferredSize(new Dimension(40,40));
  btClose.setToolTipText("Close");
  btClose.setActionCommand("btClose");
  btBrowse = new JButton(browse);
  btBrowse.setPreferredSize(new Dimension(40,40));
  btBrowse.setToolTipText("Browse");
  btBrowse.setActionCommand("btBrowse");
  btEdit = new JButton(tool);
  btEdit.setPreferredSize(new Dimension(40,40));
  btEdit.setToolTipText("Edit your image!");
  btEdit.setActionCommand("btEdit");
  btSize = new JButton();
  btSize.setEnabled(false);
  btSave.addMouseListener(new MouseStatic(this,1));
  btEdit.addMouseListener(new MouseStatic(this,2));
  btBrowse.addMouseListener(new MouseStatic(this,3));
  btClose.addMouseListener(new MouseStatic(this,4));
  this.add(btSave);
  this.add(btClose);
  this.add(btBrowse);
  this.add(btEdit);
  this.add(btSize);
  this.requestFocus(true);
  this.requestFocusInWindow(true);
  this.addKeyListener(new KeyListener() {

      @Override
      public void keyTyped(KeyEvent e) {
          //throw new UnsupportedOperationException("Not supported yet.");
      }

      @Override
      public void keyPressed(KeyEvent e) {
          char c = e.getKeyChar();
          if(c==KeyEvent.VK_ESCAPE){
          ScreenCapture.mainFrame.dispose();
          }
      }

      @Override
      public void keyReleased(KeyEvent e) {
          //throw new UnsupportedOperationException("Not supported yet.");
      }
  });
  this.setLayout(null);
    this.setFocusable(true);
    this.requestFocus(true);
    this.requestFocusInWindow(true);
     addMouseListener( this );        // listens for own mouse and
     addMouseMotionListener( this );
   }



  public Image getImage() {
   return image;
  }

 public void paintComponent(Graphics g) {
   super.paintComponent(g);
  if(image != null)
     g.drawImage(image, 0, 0, this);

   if (startPoint.x != endPoint.x || startPoint.y != endPoint.y) {
     x1 = (startPoint.x < endPoint.x) ? startPoint.x : endPoint.x;
     y1 = (startPoint.y < endPoint.y) ? startPoint.y : endPoint.y;
     x2 = (startPoint.x > endPoint.x) ? startPoint.x : endPoint.x;
     y2 = (startPoint.y > endPoint.y) ? startPoint.y : endPoint.y;
     if (Main.MainIconPage.isFirstTime) {
     areaRect = new Rectangle(Main.MainIconPage.d);
     Main.MainIconPage.isFirstTime = false;
    }
     Graphics2D g2 = (Graphics2D) g.create();
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
       RenderingHints.VALUE_ANTIALIAS_ON);
   g2.setStroke(dashed);

    if(x1 ==0 && y1 == 0){
     g2.dispose();
     }
   else{
       g2.setColor(Color.BLACK);
      g2.draw(selectedRectangle);
      g2.setColor(Color.black);
      Area area = new Area();

     area.add(new Area(new Rectangle2D.Float(0, 0, getWidth(), getHeight())));

      g2.setColor(Color.BLACK.brighter());

      int width = getWidth() - 1;
      int height = getHeight() - 1;

      int openWidth = 200;
     int openHeight = 200;

    int x = (width - openWidth) / 2;
    int y = (height - openHeight) / 2;


    area.subtract(new Area(selectedRectangle));



    g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
    g2.fill(area);
    g2.setColor(Color.WHITE);
    g2.setStroke(new BasicStroke(1.5f));

    g2.setColor(Color.BLACK.darker());
    g2.fillRect(selectedRectangle.x-4, selectedRectangle.y-4, 4, 4);
    g2.fillRect(selectedRectangle.x-4,     (selectedRectangle.y+selectedRectangle.height/2)-4, 4, 4);
    g2.fillRect(selectedRectangle.x-4, selectedRectangle.y+selectedRectangle.height, 4, 4);
    g2.fillRect((selectedRectangle.x+selectedRectangle.width/2)-4, selectedRectangle.y-4, 4, 4);
    g2.fillRect(selectedRectangle.x+selectedRectangle.width, selectedRectangle.y-4, 4, 4);
    g2.fillRect((selectedRectangle.x+selectedRectangle.width/2)-4,   selectedRectangle.y+selectedRectangle.height, 4, 4);
    g2.fillRect(selectedRectangle.x+selectedRectangle.width, selectedRectangle.y+selectedRectangle.height, 4, 4);
    g2.fillRect(selectedRectangle.x+selectedRectangle.width, (selectedRectangle.y+selectedRectangle.height/2)-4, 4, 4);
    g2.dispose();
   }}
   }

   public void setImage(Image image) {
   this.image = image;
   setPreferredSize(new Dimension(image.getWidth(this), image.getHeight(this)));
   revalidate();
   startPoint.x = endPoint.x;
   startPoint.y = endPoint.y;
   repaint();
  }


  @Override
   public void mouseClicked(MouseEvent e) {
    if(!selectedRectangle.contains(e.getPoint())){
    ScreenCapture.mainFrame.dispose();
    }
    if(selectedRectangle.x == selectedRectangle.y){
    ScreenCapture.mainFrame.dispose();
    Main.ScreenCapture.mainFrame=null;
    }
  }

   @Override
   public void mousePressed(MouseEvent e) {

    this.requestFocus(true);
    this.requestFocusInWindow(true);
    if(!dragging && !move){if (image == null) {
            return;
        }
    if(selectedRectangle==null)
        selectedRectangle = new Rectangle();
        startPoint = endPoint = e.getPoint();
        mousePressedX = e.getX();
        mousePressedY = e.getY();
        btSize.setVisible(true);
        repaint();
    }
    else if(move&&!dragging){
                    moveX =selectedRectangle.x- e.getX();
                    moveY = selectedRectangle.y-e.getY();
                    mousePressedPoint = e.getPoint();
                    btSave.setVisible(false);
                    btEdit.setVisible(false);
                    btBrowse.setVisible(false);
                    btClose.setVisible(false);
                    not=true;

   }
    else if(this.getCursor() != Cursor.getDefaultCursor() || component.getCursor()!= Cursor.getDefaultCursor()) {

        dragging = true;

    }
   }

   @Override
    public void mouseReleased(MouseEvent e) {

    if(selectedRectangle.x != selectedRectangle.y){   this.requestFocus(true);
    this.requestFocusInWindow(true);
    dragging = true;
    move=false;
    resetHeight = selectedRectangle.height;
    resetWidth = selectedRectangle.width;
    btSave.setBounds(selectedRectangle.x+selectedRectangle.width+2, selectedRectangle.y+selectedRectangle.height-174, 42, 42);
    btEdit.setBounds(selectedRectangle.x+selectedRectangle.width+2, selectedRectangle.y+selectedRectangle.height-130, 42, 42);
    btBrowse.setBounds(selectedRectangle.x+selectedRectangle.width+2, selectedRectangle.y+selectedRectangle.height-86, 42, 42);
    btClose.setBounds(selectedRectangle.x+selectedRectangle.width+2, selectedRectangle.y+selectedRectangle.height-42, 42, 42);
    btSave.setVisible(true);
    btEdit.setVisible(true);
    btBrowse.setVisible(true);
    btClose.setVisible(true);
    btSize.setVisible(true);
    if(selectedRectangle.y<20){
    btSize.setBounds(moveX+e.getX(),moveY+e.getY(), 80, 20);

    }else{
    btSize.setBounds(selectedRectangle.x,selectedRectangle.y-20, 80, 20);
    }
    if(yes){
        btSave.addActionListener(btAction);
    btClose.addActionListener(btAction);
    btBrowse.addActionListener(btAction);
    btEdit.addActionListener(btAction);
    yes=false;}}
  }



    @Override
    public void mouseDragged(MouseEvent e) {
    endPoint = e.getPoint();
    if(!dragging&&!move){

        if (image == null)
        return;
    int mouseDraggedX = e.getX();
    int mouseDraggedY = e.getY();
    width1 = Math.abs(mouseDraggedX - mousePressedX); 
    height1 = Math.abs(mouseDraggedY - mousePressedY); 

    x3 = Math.min(mouseDraggedX, mousePressedX);
     y3 = Math.min(mouseDraggedY, mousePressedY);



      x1 = (startPoint.x < endPoint.x) ? startPoint.x : endPoint.x;
      y1 = (startPoint.y < endPoint.y) ? startPoint.y : endPoint.y;
      x2 = (startPoint.x > endPoint.x) ? startPoint.x : endPoint.x;
      y2 = (startPoint.y > endPoint.y) ? startPoint.y : endPoint.y;
                        width = (x2-2 - x1) + 1;
                        height = (y2-2 - y1) + 1;
                        if(x1<x2 &&y1<y2 ){ 
              btSize.setBounds(x3, y3-20, 80, 20);
                        }
              selectedRectangle.reshape(x3, y3, width1, height1);      
              btSize.setText(width+"x"+height);
              repaint();
    repaint();}
    else if(move && component.getCursor().equals(Cursor.getDefaultCursor())){
    mouseDraggedPoint = e.getPoint();


    int resetY = Math.abs(mousePressedPoint.y-selectedRectangle.y);
    int resetX = Math.abs(mousePressedPoint.x-selectedRectangle.x);
    int y = mousePressedPoint.y-e.getPoint().y;
    int x = mousePressedPoint.x-e.getPoint().x;

    if(!checkRect() ||selectedRectangle.y<1)
    {
        if(not){
        mousePressedPoint=e.getPoint();
        selectedRectangle.y=selectedRectangle.y+1;

        selectedRectangle.height=resetHeight-y+1;
        not=false;
        }


        resetY = Math.abs(mousePressedPoint.y-selectedRectangle.y);
         if(resetY>e.getPoint().y){
    selectedRectangle.x=moveX+e.getX();
    selectedRectangle.y=selectedRectangle.y;
    selectedRectangle.width=selectedRectangle.width;
    selectedRectangle.height=resetHeight-y;
         }else{
         selectedRectangle.setLocation(moveX+e.getX(),moveY+e.getY());
         }

    }else{
    selectedRectangle.setLocation(moveX+e.getX(),moveY+e.getY());
    }


    if(selectedRectangle.y<20){
    btSize.setBounds(moveX+e.getX(),moveY+e.getY(), 80, 20);
    btSize.setBounds(selectedRectangle.x, 0, 80, 20);
    }
    else{
    btSize.setBounds(moveX+e.getX(),moveY+e.getY()-20, 80, 20);
    btSize.setBounds(selectedRectangle.x, selectedRectangle.y-20, 80, 20);
    }
    btSize.setText(selectedRectangle.width+"x"+selectedRectangle.height);
    repaint();
    }else {
    endPoint = e.getPoint();
        Point p1 = e.getPoint();
        Rectangle r = component.selectedRectangle;
        int type = component.getCursor().getType();
        int dx = p1.x - r.x;
        int dy = p1.y - r.y;
        switch(type) {
            case Cursor.N_RESIZE_CURSOR:
                int height=height1 = Math.abs(r.height - dy);
                selectedRectangle.reshape(r.x, r.y+dy, r.width, height);
                repaint();
                break;
            case Cursor.NW_RESIZE_CURSOR:
                int width =width1 = Math.abs(r.width - dx);
                height=height1 = Math.abs(r.height - dy);
                selectedRectangle.reshape(r.x+dx, r.y+dy, width, height);
                repaint();
                break;
            case Cursor.W_RESIZE_CURSOR:
                width =width1 = Math.abs(r.width - dx);
                selectedRectangle.reshape(r.x+dx, r.y, width, r.height);
                repaint();
                break;
            case Cursor.SW_RESIZE_CURSOR:
                width =width1 = Math.abs(r.width - dx);
                height=height1 = Math.abs(dy);
                selectedRectangle.reshape(r.x+dx, r.y, width, height);
                repaint();
                break;
            case Cursor.S_RESIZE_CURSOR:
                height=height1 = Math.abs(dy);
                selectedRectangle.reshape(r.x, r.y, r.width, height);
                repaint();
                break;
            case Cursor.SE_RESIZE_CURSOR:
                width =width1 = Math.abs(dx);
                height=height1 = Math.abs(dy);
                selectedRectangle.reshape(r.x, r.y, width, height);
                repaint();
                break;
            case Cursor.E_RESIZE_CURSOR:
                width =width1 = Math.abs(dx);
                selectedRectangle.reshape(r.x, r.y, width, r.height);
                repaint();
                break;
            case Cursor.NE_RESIZE_CURSOR:
                width =width1 = Math.abs(dx);
                height=height1 = Math.abs(r.height - dy);
                selectedRectangle.reshape(r.x, r.y+dy, width, height);
                repaint();
                break;
            default:
                System.out.println("unexpected type: " + type);
        }
        btSave.setVisible(false);
        btEdit.setVisible(false);
        btBrowse.setVisible(false);
        btClose.setVisible(false);
        btSize.setText(width1+"x"+height1);
        btSize.setBounds(selectedRectangle.x, selectedRectangle.y-20, 80, 20);
    }
   }

   @Override
   public void mouseMoved(MouseEvent e) {
    Point p = e.getPoint();
    if(!isOverRect(p)) {
        if(component.getCursor() != Cursor.getDefaultCursor()) {

            component.setCursor(Cursor.getDefaultCursor());
            dragging = true;
            move = false;

        }
        return;
    }else{

    dragging = false;
    move = true;


    }
    int outcode = getOutcode(p);
    Rectangle r = component.selectedRectangle;
    switch(outcode) {
        case Rectangle.OUT_TOP:
            if(Math.abs(p.y - r.y) < PROX_DIST) {
                component.setCursor(Cursor.getPredefinedCursor(
                                    Cursor.N_RESIZE_CURSOR));
            }
            break;
        case Rectangle.OUT_TOP + Rectangle.OUT_LEFT:
            if(Math.abs(p.y - r.y) < PROX_DIST &&
               Math.abs(p.x - r.x) < PROX_DIST) {
                component.setCursor(Cursor.getPredefinedCursor(
                                    Cursor.NW_RESIZE_CURSOR));
            }
            break;
        case Rectangle.OUT_LEFT:
            if(Math.abs(p.x - r.x) < PROX_DIST) {
                component.setCursor(Cursor.getPredefinedCursor(
                                    Cursor.W_RESIZE_CURSOR));
            }
            break;
        case Rectangle.OUT_LEFT + Rectangle.OUT_BOTTOM:
            if(Math.abs(p.x - r.x) < PROX_DIST &&
               Math.abs(p.y - (r.y+r.height)) < PROX_DIST) {
                component.setCursor(Cursor.getPredefinedCursor(
                                    Cursor.SW_RESIZE_CURSOR));
            }
            break;
        case Rectangle.OUT_BOTTOM:
            if(Math.abs(p.y - (r.y+r.height)) < PROX_DIST) {
                component.setCursor(Cursor.getPredefinedCursor(
                                    Cursor.S_RESIZE_CURSOR));
            }
            break;
        case Rectangle.OUT_BOTTOM + Rectangle.OUT_RIGHT:
            if(Math.abs(p.x - (r.x+r.width)) < PROX_DIST &&
               Math.abs(p.y - (r.y+r.height)) < PROX_DIST) {
                component.setCursor(Cursor.getPredefinedCursor(
                                    Cursor.SE_RESIZE_CURSOR));
            }
            break;
        case Rectangle.OUT_RIGHT:
            if(Math.abs(p.x - (r.x+r.width)) < PROX_DIST) {
                component.setCursor(Cursor.getPredefinedCursor(
                                    Cursor.E_RESIZE_CURSOR));
            }
            break;
        case Rectangle.OUT_RIGHT + Rectangle.OUT_TOP:
            if(Math.abs(p.x - (r.x+r.width)) < PROX_DIST &&
               Math.abs(p.y - r.y) < PROX_DIST) {
                component.setCursor(Cursor.getPredefinedCursor(
                                    Cursor.NE_RESIZE_CURSOR));
            }
            break;
        default:    // center
            component.setCursor(Cursor.getDefaultCursor());
    }


   }
   private int getOutcode(Point p) {
     Rectangle r = (Rectangle)component.selectedRectangle.clone();
    r.grow(-PROX_DIST, -PROX_DIST);
    return r.outcode(p.x, p.y);        
   }

   private boolean isOverRect(Point p) {
    Rectangle r = (Rectangle)component.selectedRectangle.clone();
    r.grow(PROX_DIST, PROX_DIST);
    return r.contains(p);
   }

   private String mouseDirection(Point mousePressedPoint, Point mouseDraggedPoint) {



    return "";
   }

   private static class buttonActions implements ActionListener {

    public buttonActions() {
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        switch(e.getActionCommand()){
            case "btSave":
                Main.ScreenCapture.save();
                break;
            case "btBrowse":
                Main.ScreenCapture.browse();
                break;
            case "btEdit":
                Main.ScreenCapture.edit();
                break;
            case "btClose":
                Main.ScreenCapture.close();

                break;
        }
    }
   }
   boolean checkRect() {
   if (this.areaRect == null) {
  return false;
   }

    if (this.areaRect.contains(this.selectedRectangle.x-10,    this.selectedRectangle.y-10, this.selectedRectangle.width, this.selectedRectangle.height))    {
  return true;
  }
  int new_x = this.selectedRectangle.x;
  int new_y = this.selectedRectangle.y;

  if ((this.selectedRectangle.x + this.selectedRectangle.width) >   this.areaRect.getWidth()) {
    new_x = (int) this.areaRect.getWidth() - (this.selectedRectangle.width-1);
   }
   if (this.selectedRectangle.x < 1) {
    new_x = -1;
   }
  if ((this.selectedRectangle.y + this.selectedRectangle.height) >    this.areaRect.getHeight()) {
    new_y = (int) this.areaRect.getHeight() - (this.selectedRectangle.height-1);
  }
  if (this.selectedRectangle.y < 1) {
    new_y = -1;
  }
  this.selectedRectangle.setLocation(new_x, new_y);
  return false;
  }
  }
4

1 に答える 1

0

全く正常な状態だと思います。マウス ドライバー (OS 内) は特定の周波数で動作し、一定の速度で一連の測定を実行します。そのため、監視されているよりも速くマウスを動かしている場合、言及した動作をキャッチする可能性があります.

回避策:

  • OS の設定でマウス ポインターの感度を上げます。
  • コード内で補間を実行します (既知のポイントで関数を構築し、未知のポイントを再計算します)。
于 2013-03-22T09:23:22.580 に答える