2010-01-30 10 views
5

Java'da basit bir WYSIWYG RTF editörü geliştiriyorum ve küçük bir sorun yaşıyorum. Stil seçimi geçiş düğmelerini (kalın, italik, altı çizili) kullanıcı metin seçimiyle senkronize edebilmem gerekir. Örneğin, geçerli metin seçimi düzse, kalın, italik ve altı çizili geçiş düğmeleri seçilmez, ancak kullanıcı kalın ve altı çizili bir metin seçtiğinde, kalın ve altı çizili düğmeler seçilir.JTextPane Stil Seçimini Senkronize Et UI Sorun

Şimdi, JTextPane.getInputAttributes()'un bana istediğim seçim özelliklerini kazandığı konusunda eminim, ancak düzeltme güncellemelerini dinlemeyle ilgili bir sorun var. Sorun şu ki, JTextPane no'lu ek dosya dinleyicisi, AFTER giriş özniteliği değişikliği gerçekleştiğinde gözüküyor. Yani seçim her zaman bir adım geride. Yani, geçiş düğmeleri güncellenmeden önce metni iki kez seçmeliyim!

önemli kod buradadır:

textPane.addCaretListener(new CaretListener() { 

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

Ve: önceden

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

teşekkürler!

+0

Sorunuz mu var? Değilse, bir SSCCE –

cevap

1

CaretListener, textPane dinlerken, ancak varolan öznitelikler Document ürününüzde bulunmaktadır. Document'un seçilen bölümünü bulmak için CaretEvent yöntemlerini kullanabilir ve düğmelerin orada bulunan stilleri temel alarak koşullandırmasını sağlayabilirsiniz. Maalesef, seçim tutarsız olabilir, örn. bölüm kalın ve italik kısmı. Genel bir uygulama, kullanıcının tüm seçime tamamen yeni bir özellik seti uygulamak istediğini varsaymaktır.

+0

yayınlamayı düşünün. Önerdiğiniz yöntem aslında benim yaptığım şeydir. Seçimin her bir karakter elemanını alır ve UI'nin neyi yansıtması gerektiğini belirlemek için özellik kümesi kavşağını bulurdum. Fakat sonra farkettim ki 1) getInputAttributes() yöntemi bunu zaten yapıyor gibi görünüyor ve 2) Yöntemim, kullanıcı bir girişi tetikleyene kadar belgede belge son konumuna taşınırsa hangi stilin uygulandığını belirleyemiyor. Tabii ki muhtemelen bu karakteri (son pozisyonda - 1) çalışarak belirleyebilirim, ama daha temiz bir şekilde olmasını umuyordum :( – S73417H

+0

Kullanıcının 'getInputAttributes() tarafından döndürülen öznitelikleri istemesini beklerdim. Piyanonun sonunda olduğu zaman değiştirilemez. – trashgod

0

Sen senkronizasyon ertelemeye çalışabileceği, bu yüzden diğer değişiklikler ilk olabilirdi:

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

(Yasal Uyarı: başımın üstünden Tahmin - Aslında bir test yazmadım onaylamak için)