考虑下面的 MouseListener。我的问题是:具有此侦听器提供的额外功能(其中一些您不需要)是否值得拥有这些功能所带来的内存和处理开销?还是应该避免像这样的“冗长”实现?
import java.awt.Component;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.Timer;
/**
* This is an overkill class that is useful for distinguishing between buttons and includes functions for hold and double-click events.
*
* @author Paranoid Android
*/
public class ParanoidMouseListener extends MouseAdapter {
public static final int LEFT = MouseEvent.BUTTON1;
public static final int MIDDLE = MouseEvent.BUTTON2;
public static final int RIGHT = MouseEvent.BUTTON3;
private DoubleClickTimer leftDouble = new DoubleClickTimer();
private DoubleClickTimer middleDouble = new DoubleClickTimer();
private DoubleClickTimer rightDouble = new DoubleClickTimer();
private MouseEvent event;
private int pressedButton;
private Component pressed;
private boolean dragging;
/**
* This method allows methods to ignore the MouseEvent when not needed.
*
* @return the latest mouse event.
*/
public MouseEvent getEvent() {
return event;
}
private HoldTimer leftHold = new HoldTimer() {
@Override
public void perform() {
onLeftHold();
}
};
private HoldTimer middleHold = new HoldTimer() {
@Override
public void perform() {
onMiddleHold();
}
};
private HoldTimer rightHold = new HoldTimer() {
@Override
public void perform() {
onRightHold();
}
};
@Override
public final void mouseClicked(MouseEvent event) {
this.event = event;
switch (event.getButton()) {
case LEFT:
if (leftDouble.isRunning()) {
leftDouble.stop();
onLeftDoubleClick();
} else {
leftDouble.start();
onPureLeftClick();
}
break;
case MIDDLE:
if (middleDouble.isRunning()) {
middleDouble.stop();
onMiddleDoubleClick();
} else {
middleDouble.start();
onPureMiddleClick();
}
break;
case RIGHT:
if (rightDouble.isRunning()) {
rightDouble.stop();
onRightDoubleClick();
} else {
rightDouble.start();
onPureRightClick();
}
break;
}
}
@Override
public final void mousePressed(MouseEvent event) {
this.event = event;
pressedButton = event.getButton();
pressed = event.getComponent();
switch (event.getButton()) {
case LEFT:
leftHold.start();
onLeftPress();
break;
case MIDDLE:
middleHold.start();
onMiddlePress();
break;
case RIGHT:
rightHold.start();
onRightPress();
break;
}
}
@Override
public final void mouseReleased(MouseEvent event) {
this.event = event;
pressedButton = -1;
Component src = event.getComponent();
boolean contains = src.contains(event.getPoint());
switch (event.getButton()) {
case LEFT:
leftHold.stop();
onLeftRelease();
if (!dragging && src == pressed && contains) onLeftClick();
break;
case MIDDLE:
middleHold.stop();
onMiddleRelease();
if (!dragging && src == pressed && contains) onMiddleClick();
break;
case RIGHT:
rightHold.stop();
onRightRelease();
if (!dragging && src == pressed && contains) onRightClick();
break;
}
dragging = false;
}
@Override
public final void mouseMoved(MouseEvent event) {
this.event = event;
moved();
}
@Override
public final void mouseDragged(MouseEvent event) {
this.event = event;
dragging = true;
switch (pressedButton) {
case LEFT:
onLeftDrag();
break;
case MIDDLE:
onMiddleDrag();
break;
case RIGHT:
onRightDrag();
break;
}
}
@Override
public final void mouseEntered(MouseEvent event) {
this.event = event;
entered();
}
@Override
public final void mouseExited(MouseEvent event) {
this.event = event;
exited();
}
private int getDoubleClickInterval() {
String property = "awt.multiClickInterval";
return (int) Toolkit.getDefaultToolkit().getDesktopProperty(property);
}
private class DoubleClickTimer extends Timer {
public DoubleClickTimer() {
super(getDoubleClickInterval(), null);
this.setRepeats(false);
}
}
public int getHoldInitialDelay() {
return 300;
}
public int getHoldQueueDelay() {
return 60;
}
private class HoldTimer extends Timer {
public HoldTimer() {
super(getHoldQueueDelay(), null);
this.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
perform();
}
});
this.setInitialDelay(getHoldInitialDelay());
}
public void perform() {
}
}
public void moved() {
}
public void entered() {
}
public void exited() {
}
public void onLeftHold() {
}
public void onMiddleHold() {
}
public void onRightHold() {
}
public void onLeftClick() {
}
public void onMiddleClick() {
}
public void onRightClick() {
}
public void onPureLeftClick() {
}
public void onPureMiddleClick() {
}
public void onPureRightClick() {
}
public void onLeftDoubleClick() {
}
public void onMiddleDoubleClick() {
}
public void onRightDoubleClick() {
}
public void onLeftPress() {
}
public void onMiddlePress() {
}
public void onRightPress() {
}
public void onLeftRelease() {
}
public void onMiddleRelease() {
}
public void onRightRelease() {
}
public void onLeftDrag() {
}
public void onMiddleDrag() {
}
public void onRightDrag() {
}
}