Action 中的 KeyListener Class 使用 setAction() 时听不到
KeyListener inside an Action Class Not heard when using setAction()
对于如何让以下内容发挥作用的任何建议,我将不胜感激。
原来我所有的动作都塞进了GUI。随着项目的进展,GUI 变得相当大。所以我一直在将所有这些动作移动到它们自己的类中。在这样做的过程中,某些方面失去了可见性。我很有希望捕捉到所有可见性问题,我确信这一点。
现在是问题。
在 JButton 上实施 setAction() 调用允许操作工作并且如果它只是一个 MouseListener 或 MouseMotionListener,它会很好地工作。但是,KeyListener代码没有达到。您会注意到 //调试行.
代码 #1 下方 - GUI 类中的代码
/**
* This method initializes toolRotateButton
*
* @return javax.swing.JButton
*/
private JToggleButton getToolRotateButton() {
if (toolRotateButton == null) {
toolRotateButton = new JToggleButton();
toolRotateButton.setPreferredSize(dimension30x30);
toolRotateButton.setHideActionText(true);
toolRotateButton.setAction(new RotateAction(this));
toolRotateButton.setToolTipText("Rotate Bearings or Selected Items");
}
return toolRotateButton;
}
下面的代码 #2 - RotateAction 类中的代码
package litetie.view.actions;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Rectangle2D;
import java.util.Collection;
import java.util.Collections;
import javafx.geometry.Point3D;
import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import litetie.LiteTieTRIAL;
import litetie.controller.Transform;
import litetie.listeners.UndoableRotateBearing;
import litetie.model.Coordinate;
import litetie.model.NegativeNumberException;
import litetie.model.UnitConvert;
import litetie.view.Zoom;
@SuppressWarnings("serial")
public class RotateAction extends AbstractAction {
/**
* The host provides all of the state of the interface
*/
private final ActionHost host;
/**
* Constructs the move action, attaching it to the
* given host GUI.
*
* @param host The hosting GUI
*/
public RotateAction(ActionHost host) {
super("Rotate Selected Items", new ImageIcon(RotateAction.class.getResource("/icons_LiteTie_v2/rotate.png")));
this.host = host;
}
@Override
public void actionPerformed(ActionEvent e) {
host.setCurrentMouseMover(null); //set as nothing so that the new mouse listener can be applied later in the code
host.setStrokeColourLabelText("Stroke");
host.setStrokeColourWellBackground(host.getCurrentColour());
host.setCurrentMouseClicker(firstClicker);
host.setCurrentKeyEvent(currentKeyEvent);
}
/**
* The easting of the first click
*/
private double xClick;
/**
* The northing of the first click
*/
private double yClick;
/**
* The elevation of the first click
*/
private double zClick;
/**
* The offset between the click and the centre of the selection in easting
*/
private double xOffset;
/**
* The offset between the click and the centre of the selection in northing
*/
private double yOffset;
/**
* The offset between the click and the centre of the selection in elevation
*/
private double zOffset;
/**
* Boolean flag that is set by the currentKeyEvent for when the "C" key is pressed down.
*/
private boolean isVKCDown;
/**
* Boolean flag that is set by the currentKeyEvent for when the "P" key is pressed down.
*/
private boolean isVKPDown;
/**
* Boolean flag that is set by the currentKeyEvent for when the "SHIFT" key is pressed down.
*/
private boolean isVKShiftDown;
/**
* "currentKeyEvent" KeyListener to listen to when the various keys are pressed and then set the boolean flag
* allowing the code in the mouse motion listener to run.
*/
public KeyListener currentKeyEvent = new java.awt.event.KeyAdapter(){
@Override
public void keyPressed(KeyEvent e){
if (e.getKeyCode() == KeyEvent.VK_C){
LiteTieTRIAL.setConsoleOutput("Aim bearings at mouse location");
System.out.println("Listening to key..."+e.getKeyChar()); //Debug currently this code is not reached.
System.out.println("VKCDown");//Debug currently this code is not reached.
isVKCDown = true;
}
if (e.getKeyCode() == KeyEvent.VK_P){
LiteTieTRIAL.setConsoleOutput("Rotate orientation of pattern");
System.out.println("Listening to key..."+e.getKeyChar()); //Debug currently this code is not reached.
System.out.println("VKPDown");//Debug currently this code is not reached.
isVKPDown = true;
}
if (e.getKeyCode() == KeyEvent.VK_SHIFT) {
LiteTieTRIAL.setConsoleOutput("Rotation in increments of Five Degrees");
System.out.println("Listening to key..."+e.getKeyChar()); //Debug currently this code is not reached.
System.out.println("VKCShiftDown");//Debug currently this code is not reached.
isVKShiftDown = true;
}
if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
host.setSelection(null);
}
}
@Override
public void keyReleased(KeyEvent e){
if (e.getKeyCode() == KeyEvent.VK_C){
isVKCDown = false;
}
if (e.getKeyCode() == KeyEvent.VK_P){
isVKPDown = false;
}
if (e.getKeyCode() == KeyEvent.VK_SHIFT){
isVKShiftDown = false;
}
if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
host.setSelection(null);
}
}
};
/**
* "firstClicker" MouseListener to listen to when the mouse is clicked for the first time
*/
private MouseListener firstClicker = new MouseAdapter() {
//Mouse Event method
public void mouseReleased(MouseEvent e) {
//Get the Mouse Location and store it.
Rectangle2D canvas = host.getCanvasSize();
yClick = canvas.getY() + canvas.getHeight() - UnitConvert.pixelsToMeters(e.getY()) / Zoom.getScalingFactor(); //mouse's X location in the user co ords
xClick = canvas.getX() + UnitConvert.pixelsToMeters(e.getX()) / Zoom.getScalingFactor(); //mouse's Y location in the user co ords
zClick = 0;
Rectangle2D bounds = new Rectangle2D.Double();
host.getWorld().addAllCoordinates();
Object selection = host.getSelection();
if (selection == null) { // nothing selected yet
selection = host.selectFirstObjectNear(xClick, yClick, zClick);
if (selection == null) {
// nothing near the click location, wait for the next click
return;
}
}
if (!(selection instanceof Collection<?>)) {
// Put any single object into a collection so we only have one set of code
host.setSelection(Collections.singleton(selection));
}
// Reaching this point means one or more items are selected
// and are stored in a collection
for (Coordinate c: host.getWorld().getCoordList().values()) {
boolean isSelected = ((Collection<?>)selection).contains(c);
//STEP THROUGH CHECK
if (isSelected) {
if (bounds.isEmpty()) {
bounds = c.getBounds();
} else {
bounds = bounds.createUnion(c.getBounds());
}
}
}
host.setCentreBounds(bounds.getCenterX(), bounds.getCenterY(), 0);
host.setDelta(0, 0, 0);
yOffset = bounds.getCenterY() - yClick;
xOffset = bounds.getCenterX() - xClick;
host.setCurrentMouseClicker(nextClicker);
host.setCurrentMouseMover(mover);
}
};
/**
* "nextClicker" MouseListener to listen to when the mouse is clicked for the second time
*/
private MouseListener nextClicker = new MouseAdapter() {
public void mouseReleased(MouseEvent e) {
Rectangle2D canvas = host.getCanvasSize();
double yMouseClick = canvas.getY() + canvas.getHeight() - UnitConvert.pixelsToMeters(e.getY()) / Zoom.getScalingFactor();
double xMouseClick = canvas.getX() + UnitConvert.pixelsToMeters(e.getX()) / Zoom.getScalingFactor();
try {
if (!isVKShiftDown && !isVKPDown && !isVKCDown) {
Transform.rotateBearingsOfCollection((Collection<?>) host.getSelection(), xMouseClick, yMouseClick);
host.updateCanvas();
} // ROTATE THE BEARING OF THE HOLE
else if (isVKShiftDown && !isVKPDown && !isVKCDown) {
Transform.rotateBearingsOfCollectionByFive((Collection<?>) host.getSelection(), xMouseClick, yMouseClick);
host.updateCanvas();
} // ROTATE THE BEARING OF THE HOLE BY 5 DEGREE INCREMENTS
if (isVKPDown && !isVKShiftDown && !isVKCDown){
Transform.rotateCoordinateCollection((Collection<?>) host.getSelection(), xMouseClick, yMouseClick);
host.updateCanvas();
}
else if (isVKPDown && isVKShiftDown && !isVKCDown){
// Transform.rotatePointByFive((Collection<?>) host.getSelection(), xMouseClick, xMouseClick);
// host.updateCanvas();
}
} catch (NumberFormatException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (NegativeNumberException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
host.updateCanvas();
//UNDO RECORD
host.addUndo(new UndoableRotateBearing(host.getWorld(), host.getSelection(), new Point3D(xClick + xOffset, yClick + yOffset, 0), new Point3D(xMouseClick, yMouseClick, 0)));
System.out.println("Add Coordinate Move - UndoableMoveObject()");
host.setSelection(null);
host.updateCanvas();
host.updateTrees();
host.setCurrentMouseClicker(firstClicker);
host.setCurrentMouseMover(host.getDefaultMouseMover());
host.setCentreBounds(0, 0, 0);
host.setDelta(0, 0, 0);
}
};
/**
* "mover" MouseMotionListener to listen to when the mouse is moved around the screen
*/
private MouseMotionListener mover = new MouseMotionAdapter() {
public void mouseMoved(MouseEvent e){
Rectangle2D canvas = host.getCanvasSize();
double yMouseClick = canvas.getY() + canvas.getHeight() - UnitConvert.pixelsToMeters(e.getY()) / Zoom.getScalingFactor();
double xMouseClick = canvas.getX() + UnitConvert.pixelsToMeters(e.getX()) / Zoom.getScalingFactor();
try {
if (!isVKShiftDown && !isVKPDown && !isVKCDown) {
Transform.rotateBearingsOfCollection((Collection<?>) host.getSelection(), xMouseClick, yMouseClick);
host.updateCanvas();
} // ROTATE THE BEARING OF THE HOLE
if (isVKShiftDown && !isVKPDown && !isVKCDown) {
Transform.rotateBearingsOfCollectionByFive((Collection<?>) host.getSelection(), xMouseClick, yMouseClick);
host.updateCanvas();
} // ROTATE THE BEARING OF THE HOLE BY 5 DEGREE INCREMENTS
if (isVKPDown && !isVKShiftDown && !isVKCDown){
Transform.rotateCoordinateCollection((Collection<?>) host.getSelection(), xMouseClick, yMouseClick);
host.updateCanvas();
}
if (isVKPDown && isVKShiftDown && !isVKCDown){
}
} catch (NumberFormatException e1) {
System.out.println("rotated - Error");
} catch (NegativeNumberException e1) {
System.out.println("rotated - Error");
}
host.updateCanvas();
}
};
}
值得注意的是: 我在将 KeyListener 留在 GUI 中但未将其带入 Action 的地方进行其他操作。
那么为什么 MouseListeners 可以正常工作而 KeyListeners 不能正常工作?
假设 keybindings 可能是更合适的方法,但这不是我在这部分应用程序中使用的方法.
感谢您的回复,但是今天一位朋友提出了这个建议...它修复了 KeyListener。 就这么简单的两行。
private JToggleButton getToolRotateButton() {
if (toolRotateButton == null) {
RotateAction action = new RotateAction(this); //Code Added to fix
toolRotateButton = new JToggleButton();
toolRotateButton.setPreferredSize(dimension30x30);
toolRotateButton.setHideActionText(true);
toolRotateButton.setAction(action);
toolRotateButton.setToolTipText("Rotate Bearings or Selected Items");
toolRotateButton.addKeyListener(action.currentKeyEvent); //Code Added to fix
}
return toolRotateButton;
}
对于那些有兴趣的人。
对于如何让以下内容发挥作用的任何建议,我将不胜感激。
原来我所有的动作都塞进了GUI。随着项目的进展,GUI 变得相当大。所以我一直在将所有这些动作移动到它们自己的类中。在这样做的过程中,某些方面失去了可见性。我很有希望捕捉到所有可见性问题,我确信这一点。
现在是问题。
在 JButton 上实施 setAction() 调用允许操作工作并且如果它只是一个 MouseListener 或 MouseMotionListener,它会很好地工作。但是,KeyListener代码没有达到。您会注意到 //调试行.
代码 #1 下方 - GUI 类中的代码
/**
* This method initializes toolRotateButton
*
* @return javax.swing.JButton
*/
private JToggleButton getToolRotateButton() {
if (toolRotateButton == null) {
toolRotateButton = new JToggleButton();
toolRotateButton.setPreferredSize(dimension30x30);
toolRotateButton.setHideActionText(true);
toolRotateButton.setAction(new RotateAction(this));
toolRotateButton.setToolTipText("Rotate Bearings or Selected Items");
}
return toolRotateButton;
}
下面的代码 #2 - RotateAction 类中的代码
package litetie.view.actions;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Rectangle2D;
import java.util.Collection;
import java.util.Collections;
import javafx.geometry.Point3D;
import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import litetie.LiteTieTRIAL;
import litetie.controller.Transform;
import litetie.listeners.UndoableRotateBearing;
import litetie.model.Coordinate;
import litetie.model.NegativeNumberException;
import litetie.model.UnitConvert;
import litetie.view.Zoom;
@SuppressWarnings("serial")
public class RotateAction extends AbstractAction {
/**
* The host provides all of the state of the interface
*/
private final ActionHost host;
/**
* Constructs the move action, attaching it to the
* given host GUI.
*
* @param host The hosting GUI
*/
public RotateAction(ActionHost host) {
super("Rotate Selected Items", new ImageIcon(RotateAction.class.getResource("/icons_LiteTie_v2/rotate.png")));
this.host = host;
}
@Override
public void actionPerformed(ActionEvent e) {
host.setCurrentMouseMover(null); //set as nothing so that the new mouse listener can be applied later in the code
host.setStrokeColourLabelText("Stroke");
host.setStrokeColourWellBackground(host.getCurrentColour());
host.setCurrentMouseClicker(firstClicker);
host.setCurrentKeyEvent(currentKeyEvent);
}
/**
* The easting of the first click
*/
private double xClick;
/**
* The northing of the first click
*/
private double yClick;
/**
* The elevation of the first click
*/
private double zClick;
/**
* The offset between the click and the centre of the selection in easting
*/
private double xOffset;
/**
* The offset between the click and the centre of the selection in northing
*/
private double yOffset;
/**
* The offset between the click and the centre of the selection in elevation
*/
private double zOffset;
/**
* Boolean flag that is set by the currentKeyEvent for when the "C" key is pressed down.
*/
private boolean isVKCDown;
/**
* Boolean flag that is set by the currentKeyEvent for when the "P" key is pressed down.
*/
private boolean isVKPDown;
/**
* Boolean flag that is set by the currentKeyEvent for when the "SHIFT" key is pressed down.
*/
private boolean isVKShiftDown;
/**
* "currentKeyEvent" KeyListener to listen to when the various keys are pressed and then set the boolean flag
* allowing the code in the mouse motion listener to run.
*/
public KeyListener currentKeyEvent = new java.awt.event.KeyAdapter(){
@Override
public void keyPressed(KeyEvent e){
if (e.getKeyCode() == KeyEvent.VK_C){
LiteTieTRIAL.setConsoleOutput("Aim bearings at mouse location");
System.out.println("Listening to key..."+e.getKeyChar()); //Debug currently this code is not reached.
System.out.println("VKCDown");//Debug currently this code is not reached.
isVKCDown = true;
}
if (e.getKeyCode() == KeyEvent.VK_P){
LiteTieTRIAL.setConsoleOutput("Rotate orientation of pattern");
System.out.println("Listening to key..."+e.getKeyChar()); //Debug currently this code is not reached.
System.out.println("VKPDown");//Debug currently this code is not reached.
isVKPDown = true;
}
if (e.getKeyCode() == KeyEvent.VK_SHIFT) {
LiteTieTRIAL.setConsoleOutput("Rotation in increments of Five Degrees");
System.out.println("Listening to key..."+e.getKeyChar()); //Debug currently this code is not reached.
System.out.println("VKCShiftDown");//Debug currently this code is not reached.
isVKShiftDown = true;
}
if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
host.setSelection(null);
}
}
@Override
public void keyReleased(KeyEvent e){
if (e.getKeyCode() == KeyEvent.VK_C){
isVKCDown = false;
}
if (e.getKeyCode() == KeyEvent.VK_P){
isVKPDown = false;
}
if (e.getKeyCode() == KeyEvent.VK_SHIFT){
isVKShiftDown = false;
}
if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
host.setSelection(null);
}
}
};
/**
* "firstClicker" MouseListener to listen to when the mouse is clicked for the first time
*/
private MouseListener firstClicker = new MouseAdapter() {
//Mouse Event method
public void mouseReleased(MouseEvent e) {
//Get the Mouse Location and store it.
Rectangle2D canvas = host.getCanvasSize();
yClick = canvas.getY() + canvas.getHeight() - UnitConvert.pixelsToMeters(e.getY()) / Zoom.getScalingFactor(); //mouse's X location in the user co ords
xClick = canvas.getX() + UnitConvert.pixelsToMeters(e.getX()) / Zoom.getScalingFactor(); //mouse's Y location in the user co ords
zClick = 0;
Rectangle2D bounds = new Rectangle2D.Double();
host.getWorld().addAllCoordinates();
Object selection = host.getSelection();
if (selection == null) { // nothing selected yet
selection = host.selectFirstObjectNear(xClick, yClick, zClick);
if (selection == null) {
// nothing near the click location, wait for the next click
return;
}
}
if (!(selection instanceof Collection<?>)) {
// Put any single object into a collection so we only have one set of code
host.setSelection(Collections.singleton(selection));
}
// Reaching this point means one or more items are selected
// and are stored in a collection
for (Coordinate c: host.getWorld().getCoordList().values()) {
boolean isSelected = ((Collection<?>)selection).contains(c);
//STEP THROUGH CHECK
if (isSelected) {
if (bounds.isEmpty()) {
bounds = c.getBounds();
} else {
bounds = bounds.createUnion(c.getBounds());
}
}
}
host.setCentreBounds(bounds.getCenterX(), bounds.getCenterY(), 0);
host.setDelta(0, 0, 0);
yOffset = bounds.getCenterY() - yClick;
xOffset = bounds.getCenterX() - xClick;
host.setCurrentMouseClicker(nextClicker);
host.setCurrentMouseMover(mover);
}
};
/**
* "nextClicker" MouseListener to listen to when the mouse is clicked for the second time
*/
private MouseListener nextClicker = new MouseAdapter() {
public void mouseReleased(MouseEvent e) {
Rectangle2D canvas = host.getCanvasSize();
double yMouseClick = canvas.getY() + canvas.getHeight() - UnitConvert.pixelsToMeters(e.getY()) / Zoom.getScalingFactor();
double xMouseClick = canvas.getX() + UnitConvert.pixelsToMeters(e.getX()) / Zoom.getScalingFactor();
try {
if (!isVKShiftDown && !isVKPDown && !isVKCDown) {
Transform.rotateBearingsOfCollection((Collection<?>) host.getSelection(), xMouseClick, yMouseClick);
host.updateCanvas();
} // ROTATE THE BEARING OF THE HOLE
else if (isVKShiftDown && !isVKPDown && !isVKCDown) {
Transform.rotateBearingsOfCollectionByFive((Collection<?>) host.getSelection(), xMouseClick, yMouseClick);
host.updateCanvas();
} // ROTATE THE BEARING OF THE HOLE BY 5 DEGREE INCREMENTS
if (isVKPDown && !isVKShiftDown && !isVKCDown){
Transform.rotateCoordinateCollection((Collection<?>) host.getSelection(), xMouseClick, yMouseClick);
host.updateCanvas();
}
else if (isVKPDown && isVKShiftDown && !isVKCDown){
// Transform.rotatePointByFive((Collection<?>) host.getSelection(), xMouseClick, xMouseClick);
// host.updateCanvas();
}
} catch (NumberFormatException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (NegativeNumberException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
host.updateCanvas();
//UNDO RECORD
host.addUndo(new UndoableRotateBearing(host.getWorld(), host.getSelection(), new Point3D(xClick + xOffset, yClick + yOffset, 0), new Point3D(xMouseClick, yMouseClick, 0)));
System.out.println("Add Coordinate Move - UndoableMoveObject()");
host.setSelection(null);
host.updateCanvas();
host.updateTrees();
host.setCurrentMouseClicker(firstClicker);
host.setCurrentMouseMover(host.getDefaultMouseMover());
host.setCentreBounds(0, 0, 0);
host.setDelta(0, 0, 0);
}
};
/**
* "mover" MouseMotionListener to listen to when the mouse is moved around the screen
*/
private MouseMotionListener mover = new MouseMotionAdapter() {
public void mouseMoved(MouseEvent e){
Rectangle2D canvas = host.getCanvasSize();
double yMouseClick = canvas.getY() + canvas.getHeight() - UnitConvert.pixelsToMeters(e.getY()) / Zoom.getScalingFactor();
double xMouseClick = canvas.getX() + UnitConvert.pixelsToMeters(e.getX()) / Zoom.getScalingFactor();
try {
if (!isVKShiftDown && !isVKPDown && !isVKCDown) {
Transform.rotateBearingsOfCollection((Collection<?>) host.getSelection(), xMouseClick, yMouseClick);
host.updateCanvas();
} // ROTATE THE BEARING OF THE HOLE
if (isVKShiftDown && !isVKPDown && !isVKCDown) {
Transform.rotateBearingsOfCollectionByFive((Collection<?>) host.getSelection(), xMouseClick, yMouseClick);
host.updateCanvas();
} // ROTATE THE BEARING OF THE HOLE BY 5 DEGREE INCREMENTS
if (isVKPDown && !isVKShiftDown && !isVKCDown){
Transform.rotateCoordinateCollection((Collection<?>) host.getSelection(), xMouseClick, yMouseClick);
host.updateCanvas();
}
if (isVKPDown && isVKShiftDown && !isVKCDown){
}
} catch (NumberFormatException e1) {
System.out.println("rotated - Error");
} catch (NegativeNumberException e1) {
System.out.println("rotated - Error");
}
host.updateCanvas();
}
};
}
值得注意的是: 我在将 KeyListener 留在 GUI 中但未将其带入 Action 的地方进行其他操作。
那么为什么 MouseListeners 可以正常工作而 KeyListeners 不能正常工作?
假设 keybindings 可能是更合适的方法,但这不是我在这部分应用程序中使用的方法.
感谢您的回复,但是今天一位朋友提出了这个建议...它修复了 KeyListener。 就这么简单的两行。
private JToggleButton getToolRotateButton() {
if (toolRotateButton == null) {
RotateAction action = new RotateAction(this); //Code Added to fix
toolRotateButton = new JToggleButton();
toolRotateButton.setPreferredSize(dimension30x30);
toolRotateButton.setHideActionText(true);
toolRotateButton.setAction(action);
toolRotateButton.setToolTipText("Rotate Bearings or Selected Items");
toolRotateButton.addKeyListener(action.currentKeyEvent); //Code Added to fix
}
return toolRotateButton;
}
对于那些有兴趣的人。