沒有違法意圖在任何方向,這僅僅是一個歷史的問題之一
- 最初的要求:做某事時,鼠標懸停的JMenuItem
- 最初大家的寵兒:MouseListener的
初始偏差建議(ko @ to @mKorbel!):ChangeListener on buttonModel,檢查翻滾屬性
精修要求:doSomething when JMenuI只是通過鍵盤和鼠標突出顯示。
- 精製寵兒:在ButtonModel的的ChangeListener,未指定的屬性
精製偏差:ActionListener的
電流需求:doSomething的 「選擇」 或JMenu的JMenuItem的時改變性質。
- 當前的寵兒:不能用監聽器,超控來完成...
- 電流偏差:動作,MenuListener ...
正確和完整的(事後證明,不過,作爲鍵盤還沒有提到)答案已經在第一輪中可用:一些語義監聽器是「足夠低級」的捕獲狀態變化(候選者是滾動,武裝,選中,按下buttonModel級別),這使得menuItems改變他們突出顯示狀態。不幸的是,確切的關係並不爲人所知(至少對我來說),沒有證據(讀:懶惰我無法快速查找任何東西),甚至令人困惑(再次,對我來說),因爲翻轉始終是錯誤的(?) for menuItems
實驗者的反應是......試試:下面是一個代碼片斷,它監聽並記錄某些菜單樹上的狀態更改(只需將其放入任意菜單欄並移動鼠標並通過鍵盤進行導航)即可。
獲勝者是: - 使用ChangeListener並檢查源是選擇還是武裝。
ChangeListener ch = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
if (e.getSource() instanceof JMenuItem) {
JMenuItem item = (JMenuItem) e.getSource();
if (item.isSelected() || item.isArmed()) {
System.out.println("Highlighted: " + item.getActionCommand());
}
}
}
};
作品鍵盤和鼠標,無論是JMenu的JMenuItem的和
//----------- code snippet to track property changes in menuItem/buttonModel
// test menu
JMenu menu = new JMenu("Sample menu");
menu.setMnemonic('s');
installListeners(menu);
// first menuitem
JMenuItem other = menu.add("content1");
installListeners(other);
// second menuitem
other = menu.add("again + ");
installListeners(other);
// sub
JMenu sub = new JMenu("subMenu");
installListeners(sub);
menu.add(sub);
// menus in sub
other = sub.add("first in sub");
installListeners(other);
other = sub.add("second in sub");
installListeners(other);
getJMenuBar().add(menu);
private void installListeners(JMenuItem menu) {
menu.getModel().addChangeListener(getChangeListener());
menu.addChangeListener(getChangeListener());
}
private ChangeListener getChangeListener() {
ChangeListener ch = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
if (e.getSource() instanceof ButtonModel) {
ButtonModel model = (ButtonModel) e.getSource();
System.out.println("from model: " + createStateText(model));
} else if (e.getSource() instanceof JMenuItem) {
JMenuItem item = (JMenuItem) e.getSource();
System.out.println(" from item: " + createStateText(item));
}
}
private String createStateText(ButtonModel model) {
String text = model.getActionCommand() + " armed: " + model.isArmed();
text += " selected: " + model.isSelected();
text += " rollover " + model.isRollover();
text += " pressed: " + model.isPressed();
return text;
}
private String createStateText(JMenuItem model) {
String text = model.getActionCommand() + " armed: " + model.isArmed();
text += " selected: " + model.isSelected();
// not supported on JMenuItem nor on AbstractButton
// text += " rollover " + model.isRollover();
// text += " pressed: " + model.isPressed();
return text;
}
};
return ch;
}
進化的問題(和一個從那裏的鏈接):http://stackoverflow.com/questions/5821701/what- listener-should-i-use-java(只是爲了讓這個角度來看,所以不需要重新開始:-) – kleopatra 2011-05-12 07:39:56
仍然認爲你應該編輯你的第一個問題,正式包含鍵盤要求(而不是隻是在一些評論中提到) - 可能會立即解決;-) – kleopatra 2011-05-12 10:48:08