-
Bug
-
Resolution: Duplicate
-
P4
-
None
-
1.2.0
-
x86
-
windows_95
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)
======================================================================
- duplicates
-
JDK-4118974 SwingUtilities.computeDifference returns rectangles outside of the given
-
- Closed
-