在View2d中专门有一个方法用于按钮的创建
protected JPopupMenu buidContexMenu(final MouseEvent evt) {
JPopupMenu popupMenu = new JPopupMenu();
TitleMenuItem itemTitle = new TitleMenuItem(Messages.getString("View2d.left_mouse"), popupMenu.getInsets()); //$NON-NLS-1$
popupMenu.add(itemTitle);
final EventManager event = EventManager.getInstance();
popupMenu.setLabel(MouseActions.LEFT);
String action = event.getMouseActions().getLeft();
ButtonGroup groupButtons = new ButtonGroup();
ImageViewerPlugin<DicomImageElement> view = eventManager.getSelectedView2dContainer();
if (view != null) {
final ViewerToolBar toolBar = view.getViewerToolBar();
if (toolBar != null) {
ActionListener leftButtonAction = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() instanceof JRadioButtonMenuItem) {
JRadioButtonMenuItem item = (JRadioButtonMenuItem) e.getSource();
toolBar.changeButtonState(MouseActions.LEFT, item.getActionCommand());
}
}
};
List<ActionW> actionsButtons = ViewerToolBar.actionsButtons;
synchronized (actionsButtons) {
for (int i = 0; i < actionsButtons.size(); i++) {
ActionW b = actionsButtons.get(i);
JRadioButtonMenuItem radio =
new JRadioButtonMenuItem(b.getTitle(), b.getIcon(), b.cmd().equals(action));
radio.setActionCommand(b.cmd());
radio.setAccelerator(KeyStroke.getKeyStroke(b.getKeyCode(), b.getModifier()));
// Trigger the selected mouse action
radio.addActionListener(toolBar);
// Update the state of the button in the toolbar
radio.addActionListener(leftButtonAction);
popupMenu.add(radio);
groupButtons.add(radio);
}
}
}
}
在他里面为每一个右键条目都增加了监听器,一个用于同步更新toolbar上按钮的状态
另一个用于修改相应的鼠标监听事件,该方法在ViewerToolBar中
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() instanceof JRadioButtonMenuItem) {
JRadioButtonMenuItem item = (JRadioButtonMenuItem) e.getSource();
if (item.getParent() instanceof JPopupMenu) {
JPopupMenu pop = (JPopupMenu) item.getParent();
MouseActions mouseActions = eventManager.getMouseActions();
mouseActions.setAction(pop.getLabel(), item.getActionCommand());
ImageViewerPlugin<E> view = eventManager.getSelectedView2dContainer();
if (view != null) {
view.setMouseActions(mouseActions);
}
if (pop.getInvoker() instanceof DropDownButton) {
changeButtonState(pop.getLabel(), item.getActionCommand());
}
}
}
}
然后就调用到了ImageViewerPlugin的如下方法
public synchronized void setMouseActions(MouseActions mouseActions) {
if (mouseActions == null) {
for (DefaultView2d<E> v : view2ds) {
v.disableMouseAndKeyListener();
// Let the possibility to get the focus
v.iniDefaultMouseListener();
}
} else {
for (DefaultView2d<E> v : view2ds) {
v.enableMouseAndKeyListener(mouseActions);
}
}
}
最后就是我们熟悉的View2d的enableMouseAndKeyListener方法用于修改具体的鼠标事件