6

ユーザーが選択したテキストの色を変更できる JTextPane を使用してテキスト エディターを作成しています。ただし、ユーザーがテキストを選択し、色を変更するオプション (たとえば、赤) を選択すると、テキストの選択が解除されるまで、テキストは赤として表示されません。setSelectedTextColor を使用して選択したテキストの色を変更しようとしましたが、後でテキストが選択されるたびにテキストが赤に変わるため、機能しません。選択したテキストを実際の色として表示する方法はありますか? または、テキストの実際の色ではなく、異なる色のテキストを選択すると、選択した場合でも異なる色として表示される Word での動作と同様です。

次のコードを使用して、選択したテキストを赤に変更する JTextPane とボタンを設定します。

JButton redButton = new JButton(new StyledEditorKit.ForegroundAction("red", Color.RED));
redButton.setFocusable(false);
buttonPanel.add(redButton);

JTextPane はコンテンツ タイプ HTML と同じように設定され、HTMLEditorKit を使用します。

p=new JTextPane();
p.setSize(300, 300);
kit = new HTMLEditorKit();
p.setEditorKit(kit);
p.setDocument(kit.createDefaultDocument());

p.setContentType("text/html");
p.setEditable(true);

質問を理解するためにさらにソース コードが必要な場合はお知らせください。ありがとう!

4

4 に答える 4

5

DefaultHighlightPainterの内部クラスを見てくださいDefaultHighlighter

方法

    public void paint(Graphics g, int offs0, int offs1, Shape bounds, JTextComponent c) {
        Rectangle alloc = bounds.getBounds();
        try {
            // --- determine locations ---
            TextUI mapper = c.getUI();
            Rectangle p0 = mapper.modelToView(c, offs0);
            Rectangle p1 = mapper.modelToView(c, offs1);

            // --- render ---
            Color color = getColor();

            if (color == null) {
                g.setColor(c.getSelectionColor());
            }
            else {
                g.setColor(color);
            }

ご覧のとおり、またはのいずれgetColor()かを使用しますgetSelectionColor()。クラスを拡張して、ハイライト ペインティングを適応させることができます。

または、より簡単なアプローチを使用して、あなたJTextPaneのをオーバーライドしますgetSelectionColor()。このメソッドでは、テキストが選択されているかどうかを確認し、選択した要素の属性を使用して目的の ccolor を取得します。何も選択されていない場合はそのまま戻りますsuper.getSelectedColor()

更新: 選択のために実際に色を適用することは、低レベルの GlyphView の public void paint(Graphics g, Shape a) { ... JTextComponent tc = (JTextComponent) c; で使用されます。色 selFG = tc.getSelectedTextColor();

        if (// there's a highlighter (bug 4532590), and
            (tc.getHighlighter() != null) &&
            // selected text color is different from regular foreground
            (selFG != null) && !selFG.equals(fg)) {

            Highlighter.Highlight[] h = tc.getHighlighter().getHighlights();
            if(h.length != 0) {
                boolean initialized = false;
                int viewSelectionCount = 0;
                for (int i = 0; i < h.length; i++) {
                    Highlighter.Highlight highlight = h[i];
                    int hStart = highlight.getStartOffset();
                    int hEnd = highlight.getEndOffset();
                    if (hStart > p1 || hEnd < p0) {
                        // the selection is out of this view
                        continue;
                    }
                    if (!SwingUtilities2.useSelectedTextColor(highlight, tc)) {
                        continue;
                    }

...

ご覧のとおり、ビューの選択色とデフォルト色の適用は SwingUtilities2.useSelectedTextColor(highlight, tc) で定義されています

ソースhttp://kickjava.com/src/com/sun/java/swing/SwingUtilities2.java.htm

 public static boolean useSelectedTextColor(Highlighter.Highlight  JavaDoc h, JTextComponent  JavaDoc c) {
     Highlighter.HighlightPainter  JavaDoc painter = h.getPainter();
     String  JavaDoc painterClass = painter.getClass().getName();
     if (painterClass.indexOf("javax.swing.text.DefaultHighlighter") != 0 &&
             painterClass.indexOf("com.sun.java.swing.plaf.windows.WindowsTextUI") != 0) {
         return false;
     }
     try {
         DefaultHighlighter.DefaultHighlightPainter  JavaDoc defPainter =
                 (DefaultHighlighter.DefaultHighlightPainter  JavaDoc) painter;
         if (defPainter.getColor() != null &&
                 !defPainter.getColor().equals(c.getSelectionColor())) {
             return false;
         }
     } catch (ClassCastException  JavaDoc e) {
         return false;
     }
     return true;
 }

なので色の使い方はL&Fとペインター次第。onw ペインターを定義すると、色は使用されません。

于 2013-10-01T05:26:23.397 に答える