请问一下,在不修改该程序结构的情况下如何实现对MousePanel类中的find、add、remove方法??程序:
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;public class MouseTest2
{
public static void main(String[] args)
{
MouseFrame frame = new MouseFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}class MouseFrame extends JFrame
{
public MouseFrame()
{
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize();
int screenWidth = screenSize.width;
int screenHeight = screenSize.height;
setBounds(screenWidth / 4, screenHeight /4, screenWidth / 2, screenHeight / 2);
setTitle("Sketch");

MousePanel panel = new MousePanel();
add(panel);
}
}class MousePanel extends JPanel
{
public MousePanel()
{
squares = new ArrayList<Rectangle2D>();
current = null;

addMouseListener(new MouseHandler(current, this));
addMouseMotionListener(new MouseMotionHandler(current, this));

}

public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;

for (Rectangle2D r: squares)
g2.draw(r);
}

public Rectangle2D find(Point2D p)
{
for (Rectangle2D r: squares)
if (r.contains(p)) return r;
return null;
}

public void add(Point2D p)
{
double x = p.getX();
double y = p.getY();

current = new Rectangle2D.Double(
x - SIDELENGTH / 2,
y - SIDELENGTH / 2,
SIDELENGTH,
SIDELENGTH);
squares.add(current);
repaint();
}

public void remove(Rectangle2D s)
{
if (s == null) return;
if (s == current) current = null;
squares.remove(s);
repaint();
}

public static final int SIDELENGTH = 10;

private ArrayList<Rectangle2D> squares;
private Rectangle2D current;
}class MouseHandler extends MouseAdapter
{
public MouseHandler(Rectangle2D cur, JPanel aim)
{
current = cur;
aimPanel = aim;
}

private Rectangle2D current;
private JPanel aimPanel;

public void mousePressed(MouseEvent event)
{
current = find(event.getPoint());
if (current == null)
add(event.getPoint());
}

public void mouseClicked(MouseEvent event)
{
current = find(event.getPoint());
if (current != null && event.getClickCount() >= 2)
remove(current);
}
}

class MouseMotionHandler implements MouseMotionListener
{
public MouseMotionHandler(Rectangle2D cur, JPanel aim)
{
current = cur;
aimPanel = aim;
}

private Rectangle2D current;
private JPanel aimPanel; public void mouseMoved(MouseEvent event)
{
if (find(event.getPoint()) == null) //如何才能够实现调用MousePanel类中find、add、remove方法??? 
aimPanel.setCursor(Cursor.getDefaultCursor());
else
aimPanel.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
}

public void mouseDragged(MouseEvent event)
{
if (current != null)
{
int x = event.getX();
int y = event.getY();

current.setFrame(
x - MousePanel.SIDELENGTH / 2,
y - MousePanel.SIDELENGTH / 2,
MousePanel.SIDELENGTH,
MousePanel.SIDELENGTH);
aimPanel.repaint();
}
}
}

解决方案 »

  1.   

    这是写成内部类结构的程序:(《JAVA2核心思想》第八章的一个源程序)
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.*;
    import java.util.*;
    import javax.swing.*;public class MouseTest
    {
    public static void main(String[] args)
    {
    MouseFrame frame = new MouseFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    }
    }class MouseFrame extends JFrame
    {
    public MouseFrame()
    {
    Toolkit kit = Toolkit.getDefaultToolkit();
    Dimension screenSize = kit.getScreenSize();
    int screenWidth = screenSize.width;
    int screenHeight = screenSize.height;
    setBounds(screenWidth / 4, screenHeight /4, screenWidth / 2, screenHeight / 2);
    setTitle("Sketch");

    MousePanel panel = new MousePanel();
    add(panel);
    }
    }class MousePanel extends JPanel
    {
    public MousePanel()
    {
    squares = new ArrayList<Rectangle2D>();
    current = null;

    addMouseListener(new MouseHandler());
    addMouseMotionListener(new MouseMotionHandler());

    }

    public void paintComponent(Graphics g)
    {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;

    for (Rectangle2D r: squares)
    g2.draw(r);
    }

    public Rectangle2D find(Point2D p)
    {
    for (Rectangle2D r: squares)
    if (r.contains(p)) return r;
    return null;
    }

    public void add(Point2D p)
    {
    double x = p.getX();
    double y = p.getY();

    current = new Rectangle2D.Double(
    x - SIDELENGTH / 2,
    y - SIDELENGTH / 2,
    SIDELENGTH,
    SIDELENGTH);
    squares.add(current);
    repaint();
    }

    public void remove(Rectangle2D s)
    {
    if (s == null) return;
    if (s == current) current = null;
    squares.remove(s);
    repaint();
    }

    private static final int SIDELENGTH = 10;
    private ArrayList<Rectangle2D> squares;
    private Rectangle2D current;

    private class MouseHandler extends MouseAdapter
    {
    public void mousePressed(MouseEvent event)
    {
    current = find(event.getPoint());
    if (current == null)
    add(event.getPoint());
    }

    public void mouseClicked(MouseEvent event)
    {
    current = find(event.getPoint());
    if (current != null && event.getClickCount() >= 2)
    remove(current);
    }
    }

    private class MouseMotionHandler implements MouseMotionListener
    {
    public void mouseMoved(MouseEvent event)
    {
    if (find(event.getPoint()) == null)
    setCursor(Cursor.getDefaultCursor());
    else
    setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
    }

    public void mouseDragged(MouseEvent event)
    {
    if (current != null)
    {
    int x = event.getX();
    int y = event.getY();

    current.setFrame(
    x - SIDELENGTH / 2,
    y - SIDELENGTH / 2,
    SIDELENGTH,
    SIDELENGTH);
    repaint();
    }
    }
    }
    }
      

  2.   

    我把那两个内部类提到外面来后感觉程序变得很臃肿:
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.*;
    import java.util.*;
    import javax.swing.*;public class MouseTest
    {
    public static void main(String[] args)
    {
    MouseFrame frame = new MouseFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    }
    }class MouseFrame extends JFrame
    {
    public MouseFrame()
    {
    Toolkit kit = Toolkit.getDefaultToolkit();
    Dimension screenSize = kit.getScreenSize();
    int screenWidth = screenSize.width;
    int screenHeight = screenSize.height;
    setBounds(screenWidth / 4, screenHeight /4, screenWidth / 2, screenHeight / 2);
    setTitle("Sketch");

    MousePanel panel = new MousePanel();
    add(panel);
    }
    }class MousePanel extends JPanel
    {
    public MousePanel()
    {
    squares = new ArrayList<Rectangle2D>();
    current = null;

    addMouseListener(new MouseHandler(current, squares, this));
    addMouseMotionListener(new MouseMotionHandler(current, squares, this));

    }

    public void paintComponent(Graphics g)
    {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;

    for (Rectangle2D r: squares)
    g2.draw(r);
    }
    private static final int SIDELENGTH = 10;
    private ArrayList<Rectangle2D> squares;
    private Rectangle2D current;
    }class MouseHandler extends MouseAdapter
    {
    public MouseHandler(Rectangle2D cur, ArrayList<Rectangle2D> sqr, JPanel aim)
    {
    current = cur;
    aimPanel = aim;
    squares = sqr;
    }

    private Rectangle2D current;
    private JPanel aimPanel;
    private ArrayList<Rectangle2D> squares;

    private static final int SIDELENGTH = 10;

    public void mousePressed(MouseEvent event)
    {
    current = find(event.getPoint());
    if (current == null)
    add(event.getPoint());
    }

    public void mouseClicked(MouseEvent event)
    {
    current = find(event.getPoint());
    if (current != null && event.getClickCount() >= 2)
    remove(current);
    }

    public Rectangle2D find(Point2D p)
    {
    for (Rectangle2D r: squares)
    if (r.contains(p)) return r;
    return null;
    }

    public void add(Point2D p)
    {
    double x = p.getX();
    double y = p.getY();

    current = new Rectangle2D.Double(
    x - SIDELENGTH / 2,
    y - SIDELENGTH / 2,
    SIDELENGTH,
    SIDELENGTH);
    squares.add(current);
    aimPanel.repaint();
    }

    public void remove(Rectangle2D s)
    {
    if (s == null) return;
    if (s == current) current = null;
    squares.remove(s);
    aimPanel.repaint();
    }
    }

    class MouseMotionHandler implements MouseMotionListener
    {
    public MouseMotionHandler(Rectangle2D cur, ArrayList<Rectangle2D> sqr, JPanel aim)
    {
    current = cur;
    aimPanel = aim;
    squares = sqr;
    }

    private Rectangle2D current;
    private JPanel aimPanel;
    private ArrayList<Rectangle2D> squares;

    private static final int SIDELENGTH = 10;

    public void mouseMoved(MouseEvent event)
    {
    if (find(event.getPoint()) == null)
    aimPanel.setCursor(Cursor.getDefaultCursor());
    else
    aimPanel.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
    }

    public Rectangle2D find(Point2D p)
    {
    for (Rectangle2D r: squares)
    if (r.contains(p)) return r;
    return null;
    }

    public void mouseDragged(MouseEvent event)
    {
    if (current != null)
    {
    int x = event.getX();
    int y = event.getY();

    current.setFrame(
    x - SIDELENGTH / 2,
    y - SIDELENGTH / 2,
    SIDELENGTH,
    SIDELENGTH);
    aimPanel.repaint();
    }
    }
    }