请问一下,在不修改该程序结构的情况下如何实现对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();
}
}
}
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();
}
}
}
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();
}
}
}
}
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();
}
}
}