Я обычно придерживаюсь следующего подхода:
- Зарегистрируйте
Action
с помощью карты действий Component
.
- Определите общедоступную константу
String
, позволяющую коду начальной загрузки приложения "вытянуть" Action
из необходимого Component
(например, добавить его к JToolBar
, JMenuBar
и т. Д.).
- Определить закрытый
updateActionStates()
метод внутри Component
, который вызывается, когда пользователь выполняет какое-либо действие (например, выбирает N строк из JTable
). Этот метод включает / отключает все сделанные на заказ действия в зависимости от текущего состояния Component
.
* * Пример тысяча двадцать-один: * * 1 022
public class MyPanel extends JPanel {
public static final String MY_ACTION_NAME = "MyAction";
private final JTable myTable;
public MyPanel() {
// Create action and define behaviour.
this.myAction = new AbstractAction(MY_ACTION_NAME, ...);
// Register with component's action map.
getActionMap().put(myAction.getValue(Action.NAME), myAction);
// Optionally register keyboard shortcuts using component's input map.
getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(...);
// Create JTable and add a call to updateActionStates when the selection changes.
myTable = new JTable(...);
myTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent evt) {
updateActionStates();
}
});
}
private void updateActionStates() {
// Action will only be enabled if one table row is selected.
getActionMap.get(MY_ACTION_NAME).setEnabled(myTable.getSelectedRowCount == 1);
}
}
// Application start-up code:
MyPanel pnl = new MyPanel();
JToolBar toolBar = new JToolBar();
// Pull out action from action map and add to toolbar.
toolBar.add(pnl.getActionMap().get(MyPanel.MY_ACTION_NAME));
Кстати, я обычно предпочитаю Action
с ActionListener
с для показа Action
с, которые являются частью моего Component
API. Для действий, которые просто существуют внутри Component
(например, кнопка «Очистить» диалогового окна), я обычно использую ActionListener
. Тем не менее, я не согласен с тем, что ActionListener
является наиболее стандартным подходом - это может быть справедливо для небольших графических интерфейсов, но не для более сложных приложений Swing.