Подтвердить что ты не робот

Автоматическое переключение ширины символов с помощью методов ввода Windows 7 в Java

У меня есть несколько методов ввода для написания (традиционный китайский) тайваньских, которые поставляются с Windows 7. Кроме того, все методы ввода имеют возможность переключения ширины символов (одиночные байты/двойные байтовые символы).

  • Китайский (традиционный) - новый быстрый
  • Китайский (традиционный) - ChangJie
  • Китайский (традиционный) - Быстрый
  • Китайский (традиционный) - Фонетический
  • Китайский (традиционный) - новый фонетический
  • Китайский (традиционный) - новый ChangJie

Если я выбираю один из этих методов ввода в приложении Java и устанавливаю ширину символа в полуширину (режим с одним байтовым символом), я могу успешно вводить текст в JTextField. Но если приложение отображает некоторое диалоговое окно (например, JOptionPane) или всплывающее окно, ширина символа метода ввода автоматически изменится на полноразмерный (режим с двумя байтовыми символами). После этого пользователь должен вручную переключиться на символы полуширины.

Я могу программно включить или отключить метод ввода с использованием класса Java "InputContext", но я не могу управлять, если для метода ввода задан режим символа полной ширины/полуширины (один/двойной байт).

Я думал, может быть, это может быть отключено из настроек метода ввода Windows, но не было никакой опции, связанной с автоматическим переключением ширины символа.

Вопрос: Есть ли способ обработать (отключить) это автоматическое переключение?

Вот пример кода для проверки этого с помощью приведенных выше методов ввода:

public class Example implements ActionListener {

    JFrame f = new JFrame("pasod");
    JTextField txt = new JTextField();
    Button btn = new Button("Locale");

    public Example() {

        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout());
        btn.addActionListener(this);
        panel.add(btn);
        panel.add(txt);
        f.add(panel);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setSize(800, 100);
        f.setVisible(true);
    }   

    public static void main(String[] args) {
        new Example();              
    }

    public void actionPerformed(ActionEvent arg0) {
        JOptionPane.showMessageDialog(btn, "Neso", "Neso",
                 JOptionPane.INFORMATION_MESSAGE);
    }
}

Спасибо.

4b9b3361

Ответ 1

Хорошо, у меня есть след через исходный код Java, который ищет все, что выделяется;

Вы вызываете JOptionPane.showMessageDialog(), это перегружает до JOptionPane.showOptionDialog();

public static int showOptionDialog(Component parentComponent,
        Object message, String title, int optionType, int messageType,
        Icon icon, Object[] options, Object initialValue) 
        throws HeadlessException {
        JOptionPane             pane = new JOptionPane(message, messageType,
                                                       optionType, icon,
                                                       options, initialValue);

        pane.setInitialValue(initialValue);
        pane.setComponentOrientation(((parentComponent == null) ?
        getRootFrame() : parentComponent).getComponentOrientation());

        int style = styleFromMessageType(messageType);
        JDialog dialog = pane.createDialog(parentComponent, title, style);

        pane.selectInitialValue();
        dialog.show();    
        //..Result handling code
    }

Итак, рассмотрим createDialog();

public JDialog createDialog(String title) throws HeadlessException {
    int style = styleFromMessageType(getMessageType());
    JDialog dialog = new JDialog((Dialog) null, title, true);
    initDialog(dialog, style, null);
    return dialog;
}

Итак, мы проверяем конструктор /s JDialog, что все вызовы dialogInit();

protected void dialogInit() {
    enableEvents(AWTEvent.KEY_EVENT_MASK | AWTEvent.WINDOW_EVENT_MASK);
    setLocale( JComponent.getDefaultLocale() );
    setRootPane(createRootPane());
    setRootPaneCheckingEnabled(true);
    if (JDialog.isDefaultLookAndFeelDecorated()) {
        boolean supportsWindowDecorations = 
        UIManager.getLookAndFeel().getSupportsWindowDecorations();
        if (supportsWindowDecorations) {
            setUndecorated(true);
            getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_DIALOG);
        }
    }
    sun.awt.SunToolkit.checkAndSetPolicy(this, true);
}

Здесь мы нашли setLocale( JComponent.getDefaultLocale() );;

Таким образом, он появляется всякий раз, когда вы создаете JDialog, независимо от того, является ли он косвенным, или не локали вашей программы reset по умолчанию, я предполагаю, что это включает в себя сброс настроек ввода.

Существует несколько способов установить языковой стандарт по умолчанию (программно, системные свойства или параметры времени исполнения); Подробности, найденные здесь

Надеюсь, что поможет вам

Ответ 2

Я сделал простой тест:

Я открыл IE, выбрал вкладку и в адресной строке установил, чтобы китайский IME был половинной шириной. Затем нажмите другую вкладку, IME изменится на полную ширину.

Поэтому я не думаю, что это имело какое-либо отношение к Java. Это поведение Windows.