Да и нет: код yggdraa от 13 марта отлично работал в Windows, но не работал в Linux.
Может не быть универсального решения для Linux вообще: нет таких вещей, как Windows GetKeyboardLayout () и ActivateKeyboardLayout (). Однако могут быть возможны некоторые зависящие от конфигурации хаки, такие как синтаксический анализ выходных данных xset ( подробности здесь ) и принудительное расположение, скажем, при нажатии клавиши вверх / вниз.
В приведенном выше примере код выбора входа в eventDispatched () вызывается слишком поздно - когда клавиатура ОС уже переключилась обратно на системный стандарт США.
Несколько попыток грубой силы также не сработали: myParticularJField.setLocale (myForcedLocale) из обработчика фокуса поля немедленно отменяется при первом нажатии клавиши. То же самое для форсирования локали верхнего уровня (JFrame / JDialog).
Обновление:
У нас в производстве только Windows, поэтому выполнение этой работы под Linux нецелесообразно: слишком много усилий.
На всякий случай, побочный продукт. Это правильно определяет, какой макет в данный момент активен: по умолчанию или альтернативный («локальный»). Он не может отличить несколько альтернативных макетов:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class LinuxKeyboardLayoutStatus {
public enum LayoutType { DEFAULT, LOCAL }
public LinuxKeyboardLayoutStatus.LayoutType getCurrentKeyboardLayoutType() throws IOException, InterruptedException {
String[] command = createCommand();
Process p = Runtime.getRuntime().exec(command);
BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
String l = r.readLine();
r.close();
p.waitFor();
return decodeLayoutType(l);
}
protected String[] createCommand() {
return new String[] { "/bin/sh", "-c", "xset -q | grep LED | awk '{ print $10 }' | cut -c5" };
}
protected LinuxKeyboardLayoutStatus.LayoutType decodeLayoutType(String commandOutput) {
return
commandOutput != null && !commandOutput.equals("0") ? LayoutType.LOCAL : LayoutType.DEFAULT;
}
}
Обновление:
В Ubuntu изменение обратно к макету по умолчанию происходит на уровне окна X (события DBus). Обходной путь: отключить отдельные макеты для каждого окна: Настройки => Клавиатура => Макеты, снимите флажок «Отдельный макет для каждого окна».