2012-09-13 18 views
6

मैं जर्मन सीखने वाले लोगों के लिए जावा एप्लिकेशन पर काम कर रहा हूं, और मैंने इस भाषा के विशेष पात्रों के साथ एक समस्या में भाग लिया है। मैं जेटीक्स्टफिल्ड का उप-वर्ग बनाना चाहता हूं जो एएलटीआई ए के रूप में एएलटी + ए के रूप में एएसी, एएलटी + ओ के रूप में व्याख्या करेगा, जबकि सभी ASCII वर्णों के लिए सामान्य रूप से व्यवहार करते समय।JTextField में जर्मन वर्ण

मेरे प्रयास अब तक:

public class GermanTextField extends JTextField implements KeyListener{ 
    public GermanTextField() { 
    init(); 
    } 

    // other constructors ... 

    private void init() { 
    addKeyListener(this); 
    } 



    public void keyPressed(KeyEvent arg0) {} 


    public void keyReleased(KeyEvent arg0) {} 


    public void keyTyped(KeyEvent evt) { 
    if(evt.getKeyChar() == 'o' && evt.isAltGraphDown()){ 
     setText(getText() + "ö"); 
     evt.consume(); 
    } 
    } 


} 

कोड से काम नहीं होता (GermanTextField बर्ताव मानक JTextField की तरह), और जब मैं evt.getKeyChar() प्रिंट सांत्वना देने के लिए इस मैं क्या मिलता है:

? 
? 
? 
? 

यह मेरी अपनी भाषा के कारण हो सकता है, क्योंकि ALT + o मेरे सिस्टम पर उत्पादन करता है। बेशक मैं इसे ऐसा कर सकता था:

public void keyTyped(KeyEvent evt) { 
    if(evt.getKeyChar() == 'ó'){ 
     setText(getText() + "ö"); 
     evt.consume(); 
    } 
    } 

लेकिन शायद यह पोलिश के अलावा किसी भी सिस्टम पर काम नहीं करेगा।

मेरा प्रश्न है: क्या इस समस्या का कोई समाधान है जो अलग-अलग भाषा सेटिंग्स वाले सिस्टम पर अपेक्षित व्यवहार करेगा? इस समस्या का


पूर्ण समाधान, MvGs के आधार पर उत्तर दें:

package daswort.gui; 

import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.util.HashMap; 
import java.util.Map; 

import javax.swing.JTextField; 

public class GermanTextField extends JTextField implements KeyListener{ 

    private Map<Integer, String> transform = 
     new HashMap<Integer, String>(); 

    public GermanTextField() { 
    init(); 
    } 


    public GermanTextField(int columns) { 
    super(columns); 
    init(); 
    } 


    public GermanTextField(String text, int columns) { 
    super(text, columns); 
    init(); 
    } 


    public GermanTextField(String text) { 
    super(text); 
    init(); 
    } 


    private void init() { 
    transform.put(KeyEvent.VK_A, "äÄ"); 
    transform.put(KeyEvent.VK_U, "üÜ"); 
    transform.put(KeyEvent.VK_O, "öÖ"); 

    addKeyListener(this); 
    } 



    public void keyPressed(KeyEvent evt) { 
    if(evt.isAltGraphDown()){ 
     String umlaut = transform.get(evt.getKeyCode()); 
     if(umlaut != null){ 
     int idx = evt.isShiftDown() ? 1 : 0; 
     setText(getText() + umlaut.charAt(idx)); 
     } 
    } 
    } 

    public void keyReleased(KeyEvent arg0) {} 


    public void keyTyped(KeyEvent evt) { 
    if(evt.isAltGraphDown()){ 
     evt.consume(); 
    } 
    } 


} 
+0

आपके आवेदन के लिए इनपुट क्या ओएस, जिस पर आपके आवेदन रन Alt-एक या के लिए पैदा करता है पर निर्भर करता है बनाने के लिए Alt-o, जो संभवतः ओएस या कीबोर्ड की क्षेत्रीय सेटिंग्स पर निर्भर करेगा। – Pao

+0

आप किस ऑपरेटिंग सिस्टम पर काम कर रहे हैं? आप इसे लिखते हैं "ALT + o उत्पादन करता है" लेकिन अधिकांश ओएस पर मुझे पता है, Alt अनुप्रयोग शॉर्टकट के लिए उपलब्ध है। एक उल्लेखनीय अपवाद ओएस एक्स है, जहां Alt [Alt Gr] (http://en.wikipedia.org/wiki/AltGr_key) की भूमिका निभाता है यानी वैकल्पिक वर्ण सक्षम करता है। – MvG

उत्तर

6

वर्तमान लोकेल से स्वतंत्र प्रमुख घटनाओं की पहचान करने के लिए, getKeyChar का उपयोग न करें। इसके बजाय, इसके साथ जुड़े चरित्र से स्वतंत्र कुंजी की पहचान करने के लिए isKeyCode() का उपयोग करें। इस तरह:

if (evt.getKeyCode() == KeyEvent.VK_O && evt.isAltGraphDown()) 

यह किसी भी कीबोर्ड लेआउट पर Alt जीआर + हे मेल खाना चाहिए।

+1

evt.getKeyCode() केवल keyPressed() और keyReleased() ईवेंट में कुछ सार्थक लौटाता है, इसलिए यह दृष्टिकोण काम नहीं करता है (मैंने इसे पहले चेक किया है) – KCH

+0

मैंने आपके द्वारा सुझाए गए तरीके से थोड़ा अलग तरीके से उपयोग किया (कुंजीपटल() में अपना कोड रखा, keyTyped() में दबाए गए एएलटी जीआर के साथ सभी घटनाओं का उपभोग किया और यह काम करता है जैसे मैं चाहता था। धन्यवाद। – KCH

0

समस्या यह है कि JTextField JTextArea तुलना में एक अलग डिफ़ॉल्ट फ़ॉन्ट का उपयोग करता है। मुझे एक ऐसे ऐप्लिकेशन में एक ही समस्या थी जिसे मैंने लिखा था जिसे बहु-भाषाओं का समर्थन करना था।

आपकी समस्या का कारण यह है कि JTextField आमतौर पर कूरियर न्यू जैसे मोनो-स्पेस फ़ॉन्ट दिखाने के लिए उपयोग किया जाता है। आम तौर पर जावा में कांजी प्रदर्शित करने के लिए एक मोनो-स्पेस ग्राफिकल फ़ॉन्ट के लिए कोई अतिरिक्त मैपिंग नहीं होती है।

आपके द्वारा तय किया गया फ़िक्स, क्योंकि "123" नामक कोई फ़ॉन्ट नहीं है, इसलिए डिफ़ॉल्ट लिया जाता है (संवाद)। "संवाद" फ़ॉन्ट को आपके प्लेटफॉर्म की font.properties फ़ाइल में एक फ़ॉन्ट परिवार में आंतरिक रूप से मैप किया गया है। यह वही फ़ॉन्ट होगा जो JTextField का उपयोग करता है।

मेरे पास यह सुनिश्चित करने के लिए निम्न फ़िक्स है कि सभी ग्राफिकल घटकों में एक ही फ़ॉन्ट परिभाषा का उपयोग किया जाता है। आप JTextField के लिए विशिष्ट कुंजी भी ढूंढ सकते हैं और इसे बदल सकते हैं। इस तरह आपको किसी भी घटक के फोंट के बारे में चिंता करने की ज़रूरत नहीं है, उन्हें संवाद के साथ शुरू किया जाएगा। कृपया अपनी कक्षा के अंदर JTextField युक्त निम्न कोड दर्ज करें।

Object fontDefinition = new UIDefaults.ProxyLazyValue("javax.swing.plaf.FontUIResource", null, new Obje 

java.util.Enumeration keys = UIManager.getDefaults().keys(); 
while (keys.hasMoreElements()) { 
    Object key = keys.nextElement(); 
    Object value = UIManager.get(key); 
    if (value instanceof javax.swing.plaf.FontUIResource) { 
     UIManager.put(key, fontDefinition); 
    } 
} 

उम्मीद है कि इससे मदद मिलती है।

+0

अपना कोड स्वरूपित करने के बाद, ऐसा लगता है कि पहली पंक्ति के अंत में कुछ गुम है। क्या आप एक उचित संपादन करेंगे? –

+0

@ कोड-गुरु आपके फिक्स के लिए धन्यवाद लेकिन मुझे नहीं लगता कि कुछ भी गुम है। – Ewen

+2

पहली पंक्ति को देखो। यह 'नई Obje' के साथ समाप्त होता है। वहां निश्चित रूप से कुछ याद आ रही है। (आपको इसे देखने के लिए दाईं ओर दिए गए कोड को स्क्रॉल करने की आवश्यकता हो सकती है।) –

1

यह मेरी अपनी भाषा के कारण हो सकता है, क्योंकि ALT + o मेरे सिस्टम पर उत्पादन करता है।के लिए JTextComponents

उपयोग DocumentFilter लेकिन यह शायद किसी भी पॉलिश अलावा अन्य सिस्टम पर काम नहीं करेगा: बेशक मुझे लगता है कि जैसे कि यह किया जा सकता था है।

मेरा प्रश्न है: क्या इस समस्या का कोई समाधान है जो अलग-अलग भाषा सेटिंग्स वाले सिस्टम पर अपेक्षित व्यवहार करेगा?

  • कोई वहाँ

  • आशा है कि सभी पीसी Native OS (गलत निर्णय) में Locale के लिए अध्यारोपित सही मान मिल गया है

  • आप में सक्षम हैं, नहीं कर रहे हैं किसी भी Unicode Chars लिखा ALT और numbers

  • सबसे सुरक्षिततम केवल उपयोग करके Locale के बारे में useraction से सेटिंग है, तो आप कर सकते हैं ठोस Locale (खुद Encode Page) के लिए वर्ण की एक सरणी

+1

मुझे यह पता लगाने में कठिनाई होती है कि आइटमइज़ सूची में वाक्य के टुकड़े वास्तव में क्या मतलब है। उन्हें संपादित नहीं करेंगे क्योंकि मुझे अभी भी यकीन नहीं है। – MvG

संबंधित मुद्दे