Java: фокусируются ли щелчки в меню файлов? - PullRequest
3 голосов
/ 05 января 2012

У меня была проблема с таблицами, из-за которой редактируемая ячейка не сохраняла свое новое значение до тех пор, пока пользователь не нажал Enter или Tab, тогда как я хотел, чтобы он зафиксировал значение, как только фокус был потерян, когда я обнаружил, что файл выбора -> сохранить ', в то время как редактирование ячейки привело к потере данных этой ячейки. Я обнаружил, что вы можете просто установить

table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);

, который хорошо работает при каждом изменении фокуса, кроме случаев, когда выбрано меню файла, и в этом случае ячейка остается в режиме редактирования. У меня такой вопрос: не работает ли настройка этого свойства так, как можно было бы ожидать, или фокусировка по-другому работает для пунктов меню по умолчанию в Java?

Ответы [ 3 ]

2 голосов
/ 05 января 2012

Если вы не хотите, чтобы пункты меню были фокусируемыми, вам нужно добавить код, подобный следующему, в вашем действии сохранения:

if (table.isEditing())
    table.getCellEditor().stopCellEditing();
1 голос
/ 05 января 2012

Если вы посмотрите на исходный код JMenuItem, то вызов функции initFocusability() выполняется по очереди setFocusable(false).

Java Doc для initFocusability ()

Инициирует фокусировку JMenuItem. JMenuItem фокусируются, но подклассы могут захотеть, это предоставляет им и вызывает что-то еще, или вообще ничего. Обратитесь к {@link javax.swing.JMenu # initFocusability} для мотивации этого.

Java Doc от JMenu.JMenu # initFocusability

Переопределено, чтобы ничего не делать. Мы хотим, чтобы JMenu был сфокусированным, но JMenuItem не хочет быть, поэтому мы отвергаем это, ничего не делаем. Мы не призываем setFocusable (true) после завершения конструктора super, так как побочный эффект, что JMenu будет считаться проходимым через клавиатура, которая нам не нужна. Создание компонента, доступного для клавиатура после вызова setFocusable (true) в порядке, так как setFocusable новый API и предусмотрен как таковой, но внутренне мы не хотим его использовать таким же образом мы меняем проходимость клавиатуры.

Похоже, вам нужно позвонить setFocusable(true);.

0 голосов
/ 06 января 2012

Я обнаружил, что комбинация двух ответов выше решила эту проблему. У меня есть фокусируемая строка меню, и я добавил DefaultCellEditor с переопределенным методом getTableCellEditorComponent, который добавляет слушателя фокуса, чтобы остановить редактирование:

table.setDefaultEditor(String.class, new DefaultCellEditor(new JTextField()){
@Override
public Component getTableCellEditorComponent(JTable table, Object value,
             boolean isSelected,
             int row, int column)
{
    Component c = super.getTableCellEditorComponent(table, value, isSelected, row, column);
    c.addFocusListener(new FocusListener()
    {
        public void focusGained(FocusEvent e)
        {
        }
        public void focusLost(FocusEvent e)
        {
            stopCellEditing();
        }
    });
    return c;
    }
});
...