Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-4102251

SwingUtilities.computeDifference()

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Duplicate
    • Icon: P4 P4
    • None
    • 1.2.0
    • client-libs



      Name: dgC58589 Date: 01/07/98


      SwingUtilities.computeDifference(rc1,rc2) method returns wrong
      result if a bottom of rc1 is lower that a bottom of rc2.

      Also computeUnion, computeDifference, and computeIntersection
      methods modify the source rectangles, so I have to clone source
      rectangles before call.

      /**
        * MySwingUtil version 1.1 10/26/97
        */
      import java.awt.*;
      import java.awt.event.*;
      import java.awt.swing.*;

      public class MySwingUtil extends JFrame implements
      MouseListener, MouseMotionListener
      {
      boolean m_hasRect, m_bCanClip;
      int m_Xini, m_Yini, m_Xend, m_Yend;
      final Rectangle m_baseRect = new Rectangle(100, 100, 200, 200);

      public MySwingUtil()
      {
      super("Swing Utilities");
      setSize(400, 400);

      m_hasRect = false;
      m_bCanClip = false;
      addMouseListener(this);
      addMouseMotionListener(this);

      addWindowListener(new MyWindowListener());
      setVisible(true);
      }

      public void paint(Graphics g)
      {
      Rectangle rClip = g.getClipBounds();
      g.clearRect(rClip.x-1, rClip.y-1,
      rClip.width+2, rClip.height+2);

      Rectangle rc = getSelectedRect();
      if (m_baseRect != null && rc != null)
      {

      Rectangle rb3 = new Rectangle(m_baseRect);
      g.setColor(Color.yellow);
      Rectangle rcUnion = SwingUtilities.
      computeUnion(rc.x, rc.y, rc.width,
      rc.height, rb3);
      g.fillRect(rcUnion.x, rcUnion.y,
      rcUnion.width, rcUnion.height);

      Rectangle rb1 = new Rectangle(m_baseRect);
      g.setColor(Color.gray);
      Rectangle[] rcDiff = SwingUtilities.
      computeDifference(rc, rb1);
      if (rcDiff != null)
      for (int k=0; k<rcDiff.length; k++)
      g.fillRect(rcDiff[k].x, rcDiff[k].y,
      rcDiff[k].width, rcDiff[k].height);

      Rectangle rb2 = new Rectangle(m_baseRect);
      g.setColor(Color.green);
      Rectangle rcInter = SwingUtilities.
      computeIntersection(rc.x, rc.y, rc.width,
      rc.height, rb2);
      g.fillRect(rcInter.x, rcInter.y,
      rcInter.width, rcInter.height);
      }

      if (m_baseRect != null)
      {
      g.setColor(Color.black);
      g.drawRect(m_baseRect.x, m_baseRect.y,
      m_baseRect.width, m_baseRect.height);
      }

      if (rc != null)
      {
      g.setColor(Color.red);
      g.drawRect(rc.x, rc.y, rc.width, rc.height);
      }

      }

      // Coordinate methods
      public Rectangle getSelectedRect()
      {
      if (!m_hasRect)
      return null;

      int x = Math.min(m_Xini, m_Xend);
      int y = Math.min(m_Yini, m_Yend);
      int w = Math.abs(m_Xini - m_Xend);
      int h = Math.abs(m_Yini - m_Yend);
      if (w<=1 && h<=1)
      return null; // Avoid accidental point rectangles

      return new Rectangle(x, y, w, h);
      }

      protected void checkXY()
      {
      Dimension d = getSize();
      m_Xini = Math.min(Math.max(m_Xini, 0), d.width);
      m_Yini = Math.min(Math.max(m_Yini, 0), d.height);
      m_Xend = Math.min(Math.max(m_Xend, 0), d.width);
      m_Yend = Math.min(Math.max(m_Yend, 0), d.height);
      }

      // MouseListener implementation
      public void mousePressed(MouseEvent e)
      {
      // New click removes old selection
      if (m_hasRect)
      {
      m_hasRect = false;
      repaint();
      }
      m_Xini = m_Xend = e.getX();
      m_Yini = m_Yend = e.getY();
      checkXY();
      m_bCanClip = true; // clipping now is available
      }

      public void mouseReleased(MouseEvent e)
      {
      m_bCanClip = false;
      }

      public void mouseClicked(MouseEvent e) {}
      public void mouseEntered(MouseEvent e) {}
      public void mouseExited(MouseEvent e) {}


      // MouseMoveListener implementation
      public void mouseDragged(MouseEvent e)
      {
      if (!m_bCanClip)
      return;

      Rectangle rc1 = getSelectedRect();
      m_hasRect = true;
      m_Xend = e.getX();
      m_Yend = e.getY();
      checkXY();
      Rectangle rc2 = getSelectedRect();

      // Repaint intersection of old and new selection
      if (rc1==null || rc2==null)
      return;
      repaint();
      }

      public void mouseMoved(MouseEvent e) {}


      public static void main(String argv[])
      {
      new MySwingUtil();
      }

      class MyWindowListener extends WindowAdapter
      {
      public void windowClosing(WindowEvent e)
      {System.exit(0);}
      }

      }

      (Review ID: 22485)
      ======================================================================

            stewilso Steve Wilson (Inactive)
            dgrahamcsunw David Graham-cumming (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: