2

ボタンがクリックされたときにJButtonを使用して、次のコードを実行しました。

StyledDocument doc = (StyledDocument) textPane.getDocument(); 
MutableAttributeSet attr = new SimpleAttributeSet(); 
int p0=textPane.getSelectionStart();
int p1=textPane.getSelectionEnd();
if(p0!=p1){
   StyleConstants.setForeground(attr, Color.RED); 
   doc.setCharacterAttributes(p0,p1-p0, attr,false);
}
textPane.getInputAttributes().addAttributes(attr);

p0からp1までの文字が赤に変わりました

しかし、私が入力した文字はまだ赤ではなく黒です:(

例:

「12345」と入力して「234」を選択しました。

新しい5はまだ黒です。

ここに画像の説明を入力してください

しかし、「1234」と入力して「234」を選択するとします。

新しい5は赤になります。

「textPane.getInputAttributes()。addAttributes(attr);」がなくても

ここに画像の説明を入力してください

4

1 に答える 1

5

問題は、getInputAttributeが現在のキャレット位置の文字属性を反映していることです。

  1. 「234」を選択します(キャレットは4の後です)->InputAttributesは「234」のものを反映します
  2. 「234」と現在のInputAttributes(同じであると想定されている)に赤いスタイルの前景を適用します
  3. 「5」->InputAttributesが更新された後にキャレットを移動し、「5」のものを反映します

さて、ここにあなた自身からインスピレーションを得るためのいくつかのコードがあります(これは実際には機能していません)そしておそらくあなたはカレットの動きを聞く必要があります(あなたが何を達成しようとしているのかを知らずに言うのは難しいです):

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;

public class TestTextPane {

    protected void initUI() {
        JFrame frame = new JFrame(TestTextPane.class.getSimpleName());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JTextPane textPane2 = new JTextPane();
        textPane2.setText("12345");
        frame.add(textPane2);
        JButton button = new JButton("Make it red");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                final SimpleAttributeSet set = new SimpleAttributeSet();
                StyleConstants.setForeground(set, Color.RED);
                int p0 = textPane2.getSelectionStart();
                int p1 = textPane2.getSelectionEnd();
                if (p0 != p1) {
                    StyledDocument doc = textPane2.getStyledDocument();
                    doc.setCharacterAttributes(p0, p1 - p0, set, false);
                }
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        textPane2.getCaret().setDot(textPane2.getText().length());
                        MutableAttributeSet inputAttributes = textPane2.getInputAttributes();
                        inputAttributes.addAttributes(set);
                    }
                });

            }
        });
        button.setFocusable(false);
        frame.add(button, BorderLayout.SOUTH);
        frame.setSize(600, 400);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnsupportedLookAndFeelException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                TestTextPane t = new TestTextPane();
                t.initUI();
            }
        });
    }

}
于 2012-11-27T15:40:55.090 に答える