Как напечатать глиф дополнительных символов в Java на моем JTextField, когда я просто нажимаю кнопку

У меня есть простая программа, мне просто нужно установить символ, значение которого в Юникоде больше, чем символьный тип данных (дополнительный символ) в JTextField при нажатии кнопки. Скажите, я действительно сыт по горло и как я это сделаю. Эта проблема уже решена мои 4 дня.

 //importing the packages
import java.awt.event.*;
import javax.swing.*;

import java.util.*;
import java.awt.*;

//My own custom class 
public class UnicodeTest implements ActionListener
{
JFrame jf;
JLabel jl;
JTextField jtf;
JButton jb;
UnicodeTest()
{
    jf=new JFrame();// making a frame
    jf.setLayout(null); //seting the layout null of this frame container
    jl=new JLabel("enter text"); //making the label 
    jtf=new JTextField();// making a textfied onto which a character will be shown
    jb=new JButton("enter");
//setting the bounds 
    jl.setBounds(50,50,100,50);
    jtf.setBounds(50,120,400,100);
    jb.setBounds(50, 230, 100, 100);
    jf.add(jl);jf.add(jtf);jf.add(jb);
    jf.setSize(400,400);
    jf.setVisible(true); //making frame visible
    jb.addActionListener(this); //  registering the listener object
}
public void actionPerformed(ActionEvent e) // event generated on the button click
{   try{

           int x=66560; //to print the character of this code point

           jtf.setText(""+(char)x);// i have to set the textfiled with a code point character which is supplementary in this case 

         }
     catch(Exception ee)// caughting the exception if arrived
        { ee.printStackTrace(); // it will trace the stack frame where exception arrive 
        }   
}
   // making the main method the starting point of our program
  public static void main(String[] args)
   {

    //creating and showing this application's GUI.
      new UnicodeTest();     
  }
}

1 ответ

Решение

Поскольку вы не предоставляете достаточно информации о том, что не так, я могу только догадываться, что одно или оба:

  1. Вы не используете шрифт, который может отображать символ.
  2. Вы не даете текстовому полю правильное строковое представление текста.

Установка шрифта, который может отображать символ

Не все шрифты могут отображать все символы. Вы должны найти один (или более), который может и настроить компонент Swing для использования этого шрифта. Доступные вам шрифты зависят от системы, поэтому то, что работает для вас, может не работать для других. При развертывании приложения вы можете связывать шрифты, чтобы оно работало для всех.

Чтобы найти в вашей системе шрифт, который может отображать ваш персонаж, я использовал

Font[] fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();
for (Font f : fonts) {
    if (f.canDisplay(66560)) {
        System.out.println(f);
        textField.setFont(f.deriveFont(20f));
    }
}

Вывод (для меня) - один шрифт, поэтому я позволил себе установить его в цикле:

java.awt.Font[family=Segoe UI Symbol,name=Segoe UI Symbol,style=plain,size=1]

как также отмечено в комментариях к вопросу Эндрю Томпсона.

Предоставление текстовому полю правильного строкового представления

Текстовые поля требуют UTF-16. Дополнительные символы в UTF-16 кодируются в двух кодовых единицах (2 из них: \u12CD). Предполагая, что вы начинаете с кодовой точки, вы можете преобразовать ее в символы, а затем сделать из них строку:

int x = 66560;
char[] chars = Character.toChars(x); // chars [0] is \uD801 and chars[1] is \uDC00
textField.setText(new String(chars)); // The string is "\uD801\uDC00"
// or just
textField.setText(new String(Character.toChars(x)));

как отмечает Эндрю Томпсон в комментариях к этому ответу (ранее я использовал StringBuilder).

введите описание изображения здесь

Другие вопросы по тегам