2010-01-30 24 views
5

मैं जावा में एक साधारण WYSIWYG RTF संपादक विकसित कर रहा हूं और एक छोटा मुद्दा है। मुझे उपयोगकर्ताओं के चयन चयन में स्टाइल चयन टॉगल बटन (जैसे बोल्ड, इटैलिक, रेखांकित) को सिंक्रनाइज़ करने में सक्षम होना चाहिए। उदाहरण के लिए, यदि वर्तमान पाठ चयन सादा है, बोल्ड, इटैलिक और रेखांकित टॉगल बटन चयनित नहीं हैं, लेकिन जब उपयोगकर्ता बोल्ड और रेखांकित कुछ पाठ का चयन करता है, तो बोल्ड और रेखांकित टॉगल बटन चुने जाते हैं।JTextPane सिंक्रनाइज़ स्टाइल चयन UI समस्या

अब मुझे पूरा यकीन है कि JTextPane.getInputAttributes() मुझे चयन गुण प्राप्त करता है लेकिन मुझे कैरेट अपडेट ईवेंट सुनने के साथ कोई समस्या है। मुद्दा यह है कि JTextPane से जुड़े कैरेट श्रोता को इनपुट विशेषता परिवर्तन होने के बाद कहा जाता है। तो चयन हमेशा एक कदम पीछे है। यही है, टॉगल बटन अपडेट होने से पहले मुझे दो बार टेक्स्ट का चयन करना होगा!

महत्वपूर्ण कोड यहाँ है:

textPane.addCaretListener(new CaretListener() { 

     @Override 
     public void caretUpdate(CaretEvent e) { 
      syncAttributesWithUI(textPane.getInputAttributes()); 
     } 
    }); 

और:

private void syncAttributesWithUI(AttributeSet attributes) { 
    boldButton.setSelected(StyleConstants.isBold(attributes)); 
    italicButton.setSelected(StyleConstants.isItalic(attributes)); 
    underlineButton.setSelected(StyleConstants.isUnderline(attributes)); 
} 

अग्रिम धन्यवाद!

+0

क्या आपके प्रश्न का उत्तर दिया गया है? यदि नहीं, तो एक एसएससीसीई –

उत्तर

1

CaretListener आपके textPane को सुन रहा है, लेकिन चयन के लिए मौजूदा विशेषताएं आपके Document में हैं। आप Document के चयनित भाग को खोजने के लिए CaretEvent विधियों का उपयोग कर सकते हैं और वहां पाए गए शैलियों के आधार पर आपके बटन को हालत कर सकते हैं। दुर्भाग्यवश, चयन असंगत हो सकता है, उदा। भाग बोल्ड और भाग इटालिक। एक सामान्य अभ्यास यह मानना ​​है कि उपयोगकर्ता पूरे चयन में विशेषताओं का एक बिल्कुल नया सेट लागू करना चाहता है।

+0

पोस्ट करने पर विचार करें जो विधि आप सुझाते हैं वह वास्तव में मैं मूल रूप से कर रहा था। मुझे चयन के प्रत्येक व्यक्तिगत चरित्र तत्व मिलेगा और यूआई को प्रतिबिंबित करने के लिए यह निर्धारित करने के लिए विशेषता सेट छेड़छाड़ मिल जाएगी। लेकिन फिर मुझे एहसास हुआ कि 1) GetInputAttributes() विधि पहले से ही ऐसा प्रतीत होता है, और 2) मेरी विधि यह निर्धारित नहीं कर सकती कि क्या शैली को लागू किया जा रहा है यदि दस्तावेज़ को दस्तावेज़ में अंतिम स्थिति में ले जाया जाता है जब तक उपयोगकर्ता ने इनपुट ट्रिगर नहीं किया हो। बेशक मैं शायद चरित्र शैली (अंत स्थिति - 1) पर काम करके इसे निर्धारित कर सकता हूं, लेकिन मैं उम्मीद कर रहा था कि वहां एक क्लीनर तरीका हो :( – S73417H

+0

मैं उम्मीद करता हूं कि उपयोगकर्ता 'getInputAttributes() द्वारा लौटाए गए गुणों को प्राप्त करे। जब देखभाल समाप्त हो जाती है तो अनियंत्रित रहना। – trashgod

0

आप सिंक को स्थगित करने की कोशिश कर सकते हैं, इसलिए अन्य परिवर्तन पहले भी हो सकता है:

@Override 
public void caretUpdate(CaretEvent e) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      syncAttributesWithUI(textPane.getInputAttributes()); 
     } 
    }); 
} 

(अस्वीकरण: मेरे सिर के ऊपर से भाँप रहे - मैं वास्तव में एक परीक्षण नहीं लिखा था पुष्टि करने के लिए)

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

  • कोई संबंधित समस्या नहीं^_^