2016-11-28 11 views
4

JTextfield 객체를 텍스트 입력 구성 요소로 사용하는 응용 프로그램에서 작업하고 있습니다. 일부 테스트 중에이 구성 요소를 사용하여 모든 중국어 문자를 표시 할 수있는 것은 아닙니다. 처음에는 이것이 정상적으로 보입니다. 일부 중국어 문자는 커다란 유니 코드로 덮여 있지 않아서 (내 겸손한 견해로) 왜 클립 보드로 복사 할 수 없는지 설명합니다 (비트 맵으로 만, 글꼴 수정 테스트 할 수 없습니다).더 많은 한자를 다루는 JTextField 자손 또는 교체?

그러나 클립 보드에 복사 할 수 있지만 JTextField 개체에서 허용하지 않는 것 같은 4 개의 용 문자 (URL Largest Chinese character in Unicode에서 설명 됨)와 같은 문자가있는 것 같습니다.

내 질문 : 모든 중국어 문자 또는 적어도 유니 코드에 존재하는 것들을 커버하는 JTextField의 자손이 있습니까? 아니면 다른 사람이 더 강력한 구성 요소를 알고 있습니까? JTextField와 사전

+0

문제의 예를 제공해 주시겠습니까? 의미있는 String과 그렇지 않은 String을 의미합니다. 또한 정확한 인코딩을 사용하고 있습니까? 이 테스트를 위해 [mcve]를 제공해주십시오. – AxelH

+0

내가 사용하고있는 JTextField에서 허용하는 중국어 문장의 예제를 추가하고 싶습니다만, 첨부 파일로만 이미지를 사용할 수있는 것 같습니다. 문장을 포함한 RTF 파일은 허용되지 않습니다 (그리고 간단한 복사/한자 붙여 넣기가이 주석 창에서 작동하지 않습니다. 그러나 많은 중국어 문자가 허용되지만 가장 큰 것은 문제가됩니다 (하이퍼 링크의 것과 같습니다). – Dominique

+0

일반적으로이 문제는 JTextField 자체가 아닙니다. , 그러나 당신이 사용하고있는 글꼴로.원하는 문자를 표시 할 수있는 글꼴을 찾아야합니다. 일반적으로 대부분의 유니 코드 문자를 표시 할 수있는 'Arial Unicode MS'를 사용하지만 '4 개의 용'문자는 표시 할 수 없습니다. – Enwired

답변

1

에서

덕분에 당신은 당신이 사용하고자하는 모든 문자를 지원할 수있는 글꼴을 지정해야합니다.

많은 수의 문자를 지원하려는 경우 불가능할 수 있습니다. 예를 들어, 글꼴 MingLiU-ExtB과 같이 일반적인 중국어는 지원하지 않지만 漢字과 같은 일반적인 중국어 문자는 지원하지 않습니다.

Arial Unicode MS 또는 MingLiU과 같은 글꼴은 일반적인 문자를 지원하지만 일반적이지 않은 글꼴은 지원하지 않습니다.

따라서 JTextField으로는 불가능할 수 있습니다.

그러나 JTextPane은 적어도 Windows에서 실행할 때 더욱 유연합니다. 지정한 글꼴에없는 문자가 필요한 경우 다른 대체 글꼴의 문자를 추가합니다. (. 나는 자바에서 다른이 문제는 윈도우 자체에서 오는 될 수 글꼴 및하지를 선택하기 위해 사용하는 어떤 알고리즘 아무 생각이 없다 :. Font Fallback here의 설명을 참조)를

이 코드로 JTextFieldJTextPane의 몇 가지 예를 제공합니다 몇 가지 글꼴.

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를 사용하여 텍스트의 각 섹션에 대한 글꼴을 지정할 수 있습니다. this answer

0

@Enwired와 마찬가지로 더 많은 문자를 지원하는 글꼴을 사용하십시오. 글꼴은 모든 문자를 포함하는 그림과 그 문자를 표시하는 방법에 대한 정보입니다. 그래서 더 많은 글자를 가진 글꼴이나 한자를 위해 고안된 글꼴이 훨씬 더 잘 작동합니다. This site은 글꼴 찾기에 매우 효과적입니다. 그것은 귀하의 필요에 맞는 많은 것들을 가지고 있습니다.