2009-09-28 10 views
5

'da anında metin stilini uygulama Java'da bir not alma uygulaması yazarken, siz yazarken bazı basit metin değişikliklerini yapan bir fikrim var; Muhtemelen Markdown sözdiziminin küçük bir alt kümesidir. Eğer #sometext bir çizgi girdiyse mesela, bu render olur:Bir JEditorPane

sometext

Wikidpad Ben sadece yeniden uygulamayı değilim (yapmaya çalışıyorum şeyin parçasıdır, sadece sözdizimi/ekran işlevselliği parçaları).

Temelde, kullanıcı "geri dönme" ye ulaştığında, girilen satırlara bakacak ve html etiketlerini almak için yapmanız gereken herhangi bir sihri yapacak bir tür bileşen yazmanın bir yolunu arıyorum. sağ.

Kafamı Documents and DocumentFilters ve DocumentListeners ve HTMLReader'lara karşı savundum ve çok fazla şansım yok, herkes beni doğru yola sokabilir mi?

cevap

3

İlginizi çeken bir java text editor kit. Bu eğitim harikaydı ve probleminize benzeyen bir wiki editörü uygulamamda bana yardımcı oldu. Döndürücü Düzenleyici seti (inanın veya etmeyin) sorununuzu çözmek için özel olarak tasarlanmıştır. Bu tekniği kullanarak, çok fazla mücadele vermeden de olsa, bağlantı sistemi gibi dinamik bir wiki yazdım.İşte yapmak zorunda budur:

  1. Belge ilk görev o metni belirlediğinde desen etiketleri belge model oluşturmak için olduğundan emin olun. Bağlantılı örnekte JavaDocument'e bakarsanız, bir insertUpdate çağrısı vardır. Belgede aradığınız kalıbı bulabilir ve uygun bir özel stil ile değiştirebilirsiniz. Esasen bir stil yaratır ve desenin eşleştiği belgeye uygularsınız. Güncelleme yöntemine alternatif olarak, yeni wiki içeriğini düzenli olarak taramak için özel bir çalışan iş parçacığı kullanmaktır.

  2. Bir oluşturma oluşturma İçerik Modeliniz tamamlandıktan sonra, yeni metninizi oluşturmaya uygun bir görünüm oluşturan bir İçerik uygulayabilirsiniz. Bağlantılı örnekte bir StyleContext uzatırlar. Metni görünümüne dönüştürmek için kullanılan budur. Burada, belirli etiketinizi bulacağınız ve altını çizen ve köşeli parantezleri kaldıracak bir şeyler yapabilecek oluşturma kuralları belirleyebilirsiniz.

  3. Bir editör seti hazırlayın Bu, her şeyi birlikte diker ve belgeniz için bir içerik türü belirler.

ayrı bağlamlarda belgeyi ve görünümü tutmak hakkında iyi bir şey iki görünümden, düz metin olarak biri, yeni özel bağlamında diğer belgeyi ekleyebilir olduğunu. Varsayılan stil etiketinizi tanıyamadığı için ham viki kodu biçiminde göstermelidir. Yeni görünüm, görünümü uygun bağlantıya dönüştürecektir.

Umarım bu yardımcı olur. Dikkatli bir kelime, bu şeyler ne yazık ki karmaşık, hatta salıncak için. İyi şanslar!

+0

Evet, gittiğim yer burasıydı - ama henüz bu eğiticiye rastlamadım. Sinir bozucu karmaşıktı, ama sanırım bu sayfa çok yardımcı olacak. – decitrig

+0

Hayal kırıklığınızı anlıyorum. Metin editörü – reccles

+0

refactoring bazı kod kullanılabilirliği kullanabilir Neredeyse tüm Oracle gibi, bu bağlantı bozuk. Şimdi bu öğreticiyi nerede bulacağınız hakkında bir ipucu var mı? –

1

Yapmanız gereken şey, tuş vuruşlarını metin alanına girmeden önce inceleyen, editör bileşeninizde bir tür anahtar dinleyiciyi uygulamaktır. Ardından arabelleği tekrar arayabilir, kontrol karakterlerinizi bulabilir ve ne yapması gerekeni yapabilir.

JEditorPanes ve benzeri bir çok deneyimim yok. Ama sanırım başka bir salıncak bileşeni gibi onlara anahtar dinleyiciler ekleyebilirsin.

Temel olarak bunun gibi bir bileşen olduğunu düşünmüyorum, bu yüzden kendi başınıza uygulamayı gerçekleştirmeniz gerekecek.

Yine de yanılıyor olabilirim.

+0

Evet, keylisteners ile oynadım, ancak önemli olayı tüketiyor gibi görünmüyorlar, bu nedenle, bölme, içeriğin içerisindeki karakterini zaten eklemeden önce "yapmam gerekeni yapamıyorum". – decitrig

0

Girişe girdiklerinde veya yalnızca verileri gönderdiklerinde gerçekleşmek zorunda mı?

Gönderme sırasında, verileri kaydedecek bir düğmeye basmasını bekleyin, ardından metni JEditorPane.getText(), "düzeltin" ve JEditorPane.setText (text) yapın;

Tamam, anında uçuyorsa, Giriş Yöntemi Dinleyicisi eklemeyi deneyin. InputMethodEvent, "getText()" adını verebilmeli ve her bir tuşa basmadan sonra bunun için ayrışabilmeniz gerekir. Kullanıcının girdiği her seferinde istediğini yapmak istediğinizde, her bir tuşa basarak metni alın ve metindeki geçerli konumun \ n veya benzerlerinden sonra bir karakter olup olmadığını görün.

+0

Anında bunu yapmak istiyorum. – decitrig

0

İlk olarak, metne stil uygulamak için daha uygun olduğundan JTextPane'u kullanmanızı öneririz. Ardından, bir keyPressed olayı eklemek çok kolaydır:

jTextPane1.addKeyListener(new java.awt.event.KeyAdapter() { 
    public void keyPressed(java.awt.event.KeyEvent evt) { 
     jTextPane1KeyPressed(evt); 
    } 
}); 

private void jTextPane1KeyPressed(java.awt.event.KeyEvent evt) { 
    // TODO add your handling code here: 
    String txt = jTextPane1.getText(); 

} 

Yukarıdaki kod, Netbeans ile kolayca oluşturulmuştur.

Daha sonra böyle bir şey yaptığını stilleri uygulayabilirsiniz:

StyledDocument doc = jTextPane1.getStyledDocument(); 
Style style = jTextPane1.addStyle("Bold", null); 
StyleConstants.setBold(style, true); 

int pos, endpos; 
// Find pos of word to be displayed in bold 
... 

// Set style 
doc.setCharacterAttributes(pos, endpos, style, true); 
+0

Bunu da düşündüm; Benim endişem, büyük bir belgeyle ölçeklenmemesidir, çünkü tüm metni okurken ve bir tuşa her basıldığında yeniden biçimlendirildiğinden. – decitrig

+0

Evt.getKeyChar() öğesini kullanabilir ve tüm metni yalnızca gerektiğinde okuyabilirsiniz. '#' Tuşuna ilk basıldığında bir bayrak ayarlayın ve ardından metni okuyun ve boşluk/yeni satıra basıldığında formatı uygulayın. Ayrıca, bir kullanıcının metni metne yapıştırmadaki duruma da hitap etmelisiniz. Bu tür olaylar için meta karakterleri izleyebilirsiniz. – kgiannakakis

0

Kullanım RSyntaxTextArea, ihtiyacınız yapar ve kendi lexer/kurallar ekleyebilirsiniz.

+0

Kesinlikle kontrol edeceğim. – decitrig