0

JTextPanewikiソース編集用のアプリで使用しています。を介して文字属性を別のスタイルに変更することにより、スペルミスのある単語に下線を引く簡単なスペル チェック機能を追加しましたStyledDocument.setCharacterAttributes

使用されるスタイルは、デフォルトと「スペルミス」の 2 つだけです。テキスト エディター コントロールはワード ラップを行いますが、これは予期された動作です。

私の問題は、場合によっては (常にではありませんが、特定の wiki ドキュメントで再現可能です)、この文字属性を変更すると、何らかの形でワード ラッピングが無効になることです。より具体的には、ドキュメントの途中から 3 行を削除し、次にスペル チェッカーを実行したときに、(スペル チェックを再実行する前に) 文字属性をデフォルト スタイルにリセットすると、ワード ラッピング機能が無効になり、そのまま残ります。仕方。削除を元に戻すと、ワード ラッピングは通常に戻ります。

スタイルをリセットする 1 行をコメント アウトします。

editorPane.getStyledDocument().setCharacterAttributes(0, editorPane.getStyledDocument().getLength(), defaultStyle, true);

問題を解決します。

編集1

問題を簡単なテストケースに抽出しました。長い行で申し訳ありませんが、サンプル テキストはバグを再現するために重要です (ランダム化されています)。

package jtextpanebug;

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.WindowConstants;
import javax.swing.text.Style;


public class DemoFrame extends javax.swing.JFrame {

    private final JButton btResetStyle;
    private final JScrollPane scrollPane;
    private final JTextPane textPane;    
    private final Style defaultStyle;

    public DemoFrame() {
        // Creating a simple form with a scrollable text pane and a button
        scrollPane = new JScrollPane();
        textPane = new JTextPane();
        btResetStyle = new JButton();

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));

        // The text pane's text is the scrambled version of my original test data,
        // it is important because the problem depends on the pane's text
        // (not every text makes it wrong)
        textPane.setText("= Gernela Stuff Dogo to Wnko Obuat Oebrfe Disytung hte Iidnividal Oitpcs =\n\n== Elmyonrogit ==\n\n'''memidtaie-ngiebhro opnits''' - 2 points, \nwihhc nac eb ense ot eb mmiieadte hnigeorbs fo haec othre. \nThere si no strict | cxeat defiintoin. \nEth etipcur owebl shsow sa an example optins dna the rispa \nienbg mimedtiea iebnghsor ear ncnoetced.\n\n[[Amieg:einogrhb_pinsot.pgn]]\n\n'''enihgorb optnsi distacne''' - het avaeegr of sdntaisce \nderemitedn by het mimeidate-hieobngr tonpi ipras. \n\n'''lalw''' - a iotpntes nepgesnietrr a llwa, with toerh orwds: 2 apraelll, \nevyr sloce sraufce picsee. Heer is an xamelpe. \nIt is eualgttandri ofr eterbt zisiuaitovlan.\n\n[[Gimae:llwa.npg]]\n\n'''addtaiilon emmory reeueimtnqr of na laigorthm''' - \n(eth kepa mmeory suaeg fo teh nltpiaciapo ndirug the excteouin of eht grlaotihm) - \n(hte moeymr sueag fo hte loragitmh befoer ro ftrea eht ucxeeiont of the laogrihmt)\n\n== Het Input Pnoitset Ash to Repnrsete Ufscear Arsnoelbay Elwl ==\n\nIf tno efisciped toehrwsie yb hte cdoritnpsei of an aoglirthm, \nhetn hte eqtunrmeersi of it are heste:\n\n* Ifsrt fo all the poisentt umst reprseent urfseac, not urvec ro uvomel or nayithng eesl.\n* Awlls aym otn eb tniehnr tanh at least 3 * fo ienhbgro-tpoin-sidenact.\n* Dseeg amy ton be rhserap tnha 70 grdesee (as het agnle fo eht trmeaial) nda husdol be ta tleas 290 redeseg (ni caes fo cnvocae eedgs).\n* Onpti edintsy amy ont vayr oto humc \n** Het angre fo the coall ption desitnsei of a igsenl pisnotte nutip ushold eb sallm. Ahtt is: teh orait of het oclla oitnp idsentise oarund any 2 ipnost lsdhou eb lmitied.\n** Hte lcoal noipt deisynt ushlod otn ahencg sdduelyn (gliftyscaiinn ni a hotsr idnsteac). \n\nYreftntunaoul the largoimths cna tno yb ethmsevesl \nhcekc these qutenmeserir nda usjt yden rnuning, \nso it si eth rseu's iyponerissbtil to ton extucee an raltghomi no a itseopnt \nthat does ont mete het aogitmlhr's terieseurmnq.\n\nIf eth rmeteriuqen fo na airlgmoth on its npuit is ont mte, then tobh hte ueavbhior nad hte srluet fo hte alghoritms si dinfeuned. \nTeh loirgamth amy nru rfo iinfntie long imet or rodpuce evry abd rselut, ro a eruslt htat oolsk good btu is nicrtroec. Ni htis scea rtehe si tno nay aguntreee toabu the tmniatreion of the iralgtmho ro eht lqutaiy fo the sreltu ecxept htat the nptapalcioi iwll ont carsh.\n");
        scrollPane.setViewportView(textPane);

        getContentPane().add(scrollPane);

        btResetStyle.setText("Reset style");
        btResetStyle.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent evt) {
                btResetStyleActionPerformed(evt);
            }
        });
        getContentPane().add(btResetStyle);

        pack();

        // The default style, the problem happens when we reset the full document
        // to it:
        defaultStyle = textPane.addStyle("default", null);        
    }

    private void btResetStyleActionPerformed(java.awt.event.ActionEvent evt) {

        // When the button is pressed we reset the full document to the default
        // style. In the original application this was periodically done as 
        // part of the spell checking
        textPane.getStyledDocument().setCharacterAttributes(0, textPane.getStyledDocument().getLength(), defaultStyle, true);
    }

    public static void main(String args[]) {                
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new DemoFrame().setVisible(true);
            }
        });
    }    
}

問題の再現:

  1. 上記のクラスをコンパイルして実行します
  2. フレームのサイズを変更してみてください - ワードラップは機能します
  3. 以下にコピーした 3 行を見つけて削除します。
  4. Reset styleボタンを押します
  5. ワードラップがオフになりました
* Onpti edintsy amy ont vayr oto humc
** Het angre for the coall ption desitnsei of a igsenl pisnotte nutip ushold eb sallm. Ahtt is: teh orait of het oclla oitnp idsentise oarund any 2 ipnost lsdhou eb lmitied.
** Hte lcoal noipt deisynt ushlod otn ahencg sdduelyn (gliftyscaiinn ni a hotsr idnsteac).

編集2

スタイルの代わりに蛍光ペンを使用することで問題は解決しましたが、元のアプローチの何が問題だったのかまだ知りません。

4

1 に答える 1

0

これは、私がここで尋ねたのと同じ問題のようです: Java 7 を使用した JTextPane でスタイル付きテキストを使用した奇妙なテキスト ラッピング

私の知る限り、これは Java 7 のバグであり、Oracle のJava Bug Paradeには記載されていません。私はまだ回避策を見つけていません (私の場合、蛍光ペンの使用はオプションではありません)。

于 2012-12-12T10:01:03.983 に答える