Любой потомок или замена JTextField, который охватывает больше китайских символов?

Я работаю над приложением, которое использует объект JTextfield в качестве компонента ввода текста. Во время некоторых тестов я увидел, что не все китайские иероглифы могут отображаться с помощью этого компонента. На первый взгляд это кажется нормальным: некоторые китайские иероглифы настолько велики, что даже не покрываются Unicode, что (по моему скромному мнению) объясняет, почему их нельзя скопировать в буфер обмена (только как растровое изображение, что означает, что модификации шрифта могут не подвергаться испытанию).

Тем не менее, похоже, есть и такие символы, как четыре дракона (объяснение в URL крупнейший китайский символ в Юникоде), который можно скопировать в буфер обмена, но который, похоже, не принимается объектом JTextField.

Отсюда мой вопрос: есть ли потомок JTextField, который охватывает все китайские символы или, по крайней мере, те, которые присутствуют в Unicode? Или кто-нибудь знает о другом, более мощном компоненте?

заранее спасибо


person Dominique    schedule 28.11.2016    source источник
comment
Не могли бы вы привести пример вашей проблемы? Имеется в виду строка, которая подходит, и та, которая не подходит. Кроме того, вы уверены, что используете правильную кодировку? Предоставьте нам минимальный воспроизводимый пример для проверки.   -  person AxelH    schedule 01.12.2016
comment
Я хотел бы добавить пример китайского предложения, которое принимается JTextField, который я использую, но, похоже, я могу использовать только изображения в качестве вложения, файл RTF, включающий предложение, не принимается (и простое копирование/вставка китайских иероглифов не работает в этом окне комментариев, однако я уверен, что многие китайские иероглифы принимаются, в то время как только самые большие вызывают проблемы (например, тот, что в гиперссылке).   -  person Dominique    schedule 01.12.2016
comment
Обычно проблема не в самом JTextField, а в используемом вами шрифте. Вам нужно найти шрифт, который может отображать нужные символы. Обычно я использую «Arial Unicode MS», который может отображать большинство символов Unicode, но не может отображать символ «четыре дракона» ????   -  person Enwired    schedule 01.12.2016
comment
Извините, но в любом случае, похоже, есть проблема: я только что попробовал, и действительно, в MS Word, используя шрифт Arial Unicode MS, я могу отобразить упомянутый символ, однако компонент JTextField моего приложения имеет проблемы с этим . Во всяком случае, ваш комментарий наводит меня на мысль, что работа со свойствами компонента JTextField может решить мою проблему. Спасибо.   -  person Dominique    schedule 02.12.2016
comment
@Dominique Этот символ не существует в шрифте Arial Unicode MS. Программа MS Word выполняет некоторые дополнительные приемы для отображения символов, которых нет в указанном вами шрифте, если в вашей системе есть какой-либо другой шрифт, поддерживающий этот символ, но Java не выполняет таких трюков. По этой ссылке показаны некоторые шрифты, поддерживающие этот символ: fileformat.info/info /unicode/char/2a6a5/fontsupport.htm   -  person Enwired    schedule 03.12.2016
comment
Это проблема кодировки или шрифта, а не проблема управления графическим интерфейсом.   -  person user207421    schedule 03.12.2016
comment
@EJP, вы правы, но разные компоненты графического интерфейса обрабатывают шрифты по-разному. Каждый JTextField может использовать один единственный шрифт. Каждый JTextPane может использовать несколько шрифтов, и, по крайней мере, в Windows он использует резервные шрифты для символов, не включенных в выбранный шрифт.   -  person Enwired    schedule 05.12.2016


Ответы (2)


С JTextField вам нужно будет указать шрифт, который может поддерживать все символы, которые вы хотите использовать.

Это может быть невозможно, если вы хотите поддерживать большое количество символов. Например, шрифт MingLiU-ExtB поддерживает некоторые необычные китайские символы, такие как ????, но не поддерживает распространенные китайские символы, такие как 漢字.

Такие шрифты, как Arial Unicode MS или MingLiU, поддерживают распространенные символы, но не редкость.

Таким образом, это может быть невозможно с JTextField.

Но JTextPane более гибкий, по крайней мере, при работе в Windows. Если ему нужны символы, которых нет в указанном вами шрифте, он добавит символы из других резервных шрифтов. (Я понятия не имею, какой алгоритм он использует для выбора других шрифтов. Такое поведение может исходить из самой Windows, а не из Java: см. обсуждение Font Fallback здесь.)

Этот код дает несколько примеров JTextField и JTextPane с несколькими шрифтами.

public class ChineseFont {

  public static void main(String[] args) {
    SwingUtilities.invokeLater(() -> {
      String text = "test ???? test 漢字.";

      JTextField textField1 = new JTextField(text);
      textField1.setFont(new Font("Arial Unicode MS", Font.PLAIN, 24));
      JLabel label1 = new JLabel("JTextField " + textField1.getFont().getFontName());

      JTextField textField2 = new JTextField(text);
      textField2.setFont(new Font("MingLiU", Font.PLAIN, 24));
      JLabel label2 = new JLabel("JTextField " + textField2.getFont().getFontName());

      JTextField textField3 = new JTextField(text);
      textField3.setFont(new Font("MingLiU-ExtB", Font.PLAIN, 24));
      JLabel label3 = new JLabel("JTextField " + textField3.getFont().getFontName());

      JTextPane  textPane4 = new JTextPane();
      textPane4.setFont(new Font("Arial Unicode MS", Font.PLAIN, 24));
      textPane4.setText(text);
      JLabel label4 = new JLabel("JTextPane " + textPane4.getFont().getName());

      JTextPane  textPane5 = new JTextPane();
      textPane5.setFont(new Font("MingLiU", Font.PLAIN, 24));
      textPane5.setText(text);
      JLabel label5 = new JLabel("JTextPane " + textPane5.getFont().getName());

      JFrame frame = new JFrame();
      Container contentPane = frame.getContentPane();
      contentPane.setLayout(new GridLayout(5, 2, 2, 6));
      contentPane.add(label1);
      contentPane.add(textField1);
      contentPane.add(label2);
      contentPane.add(textField2);
      contentPane.add(label3);
      contentPane.add(textField3);
      contentPane.add(label4);
      contentPane.add(textPane4);
      contentPane.add(label5);
      contentPane.add(textPane5);

      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setVisible(true);
    });
  }
}

Вы также можете вручную указать шрифты для каждого раздела текста, используя AttributedText. См. этот ответ

person Enwired    schedule 03.12.2016

Как сказал @Enwired, используйте шрифт, который поддерживает больше символов. Шрифты — это просто изображения, которые содержат все символы и информацию о том, как их отображать. Таким образом, шрифт с большим количеством символов или шрифт, предназначенный для китайских иероглифов, будет работать намного лучше. Этот сайт очень хорошо подходит для поиска шрифтов. У этого есть много, которые могут удовлетворить Ваши потребности.

person Cody Richardson    schedule 07.12.2016