0

StyledEditorKit を変更して defaultKeyTyped アクションをオーバーライドするにはどうすればよいですか? TextAction を作成し、StyledEditorKit を拡張しました。しかし、拡張された StyledEditorKit 内のアクションのリストにアクションを追加するにはどうすればよいでしょうか?

最終的に、defaultKeyTyped アクションをオーバーライドしようとしています。キー リスナーを追加することでこれを行うことができますが、代わりにエディター キットを使用するべきではありませんか? アーキテクチャ的には、これはより高いレベルのアクションに対して実行されるアクションに近いのではないでしょうか? addKeyListener は下位レベルのメソッドですか?

4

2 に答える 2

2

いいえ、これは EditorKit の適切な使用法ではないと思います。ドキュメントにコミットされる前または後に入力を処理するかどうかに応じて、DocumentListener または DocumentFilter を使用することをお勧めします。また、別のオプションは、InputVerifier の使用を検討することです。


あなたの状態を編集
:

正規表現を検索し、スペース キーが入力された後にそれらの正規表現に基づいてテキストを強調表示したい

私自身はこれに DocumentListener を使用しますが、コードがドキュメントに変更を加えているときは必ずリスナーをオフにしてから、再度オンにします。

于 2013-09-22T23:01:18.047 に答える
1

これは、ずっと前にウェブで見つけた古いコードです。

上部のテキスト領域にコードを貼り付けます。テキスト フィールドに正規表現を入力します。チェックボックスの状態に応じて、入力時またはボタンをクリックしたときに検索を実行できます。

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;

import java.awt.*;
import java.awt.event.*;

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class RegexKing implements ActionListener, DocumentListener
{

    public static void main(String[] args)
    {
        new RegexKing();
    }

    public RegexKing()
    {
        initGUI();
        setupGUI();
        displayFrame();

    }

    public void initGUI()
    {
        // init
        frame = new JFrame("Regex King");
        container = new JPanel();

        inputArea = new JTextArea();
        regexField =new JTextField();
        outputArea = new JTextArea();

        quickMatch = new JCheckBox("Attempt Match on Change");
        matchButton = new JButton("Match");

        inputScroll = new JScrollPane(inputArea);
        outputScroll = new JScrollPane(outputArea);

        // setup
        outputArea.setEditable(false);
        matchButton.addActionListener(this);
        regexField.getDocument().addDocumentListener(this);

        // key binding
        KeyStroke key = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, Event.SHIFT_MASK, false);
        Action keyact = new AbstractAction()
        {
            public void actionPerformed(ActionEvent e)
            {
                doMatch();
            }
        };

        container.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(key, "DO_MATCH");
        container.getActionMap().put("DO_MATCH", keyact);

    }

    public void setupGUI()
    {
        gbl = new GridBagLayout();
        gbc = new GridBagConstraints();

        container.setLayout(gbl);

        setInsets(2, 2, 2, 2);
        gbcf = GridBagConstraints.BOTH;

        setComp(inputScroll, 10, 10, 20, 1, 1, 1);
        setComp(quickMatch, 10, 20, 1, 1, 1, .1);
        setComp(matchButton, 20, 20, 1, 1, 1, .1);
        setComp(regexField, 10, 30, 20, 1, 1, .1);
        setComp(outputScroll, 10, 40, 20, 1, 1, 1);
    }

    public void setComp(JComponent comp, int gx, int gy, int gw, int gh, double wx, double wy)
    {
        gbc.gridx = gx;
        gbc.gridy = gy;
        gbc.gridwidth = gw;
        gbc.gridheight = gh;
        gbc.weightx = wx;
        gbc.weighty = wy;

        gbc.fill = gbcf;

        gbl.setConstraints(comp, gbc);
        container.add(comp);
    }

    public void setInsets(int top, int bottom, int left, int right)
    {
        gbc.insets.top = top;
        gbc.insets.bottom = bottom;
        gbc.insets.left = left;
        gbc.insets.right = right;
    }

    public void displayFrame()
    {
        frame.setContentPane(container);
        frame.setSize(500, 500);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public void insertUpdate(DocumentEvent e)
    {
        if(quickMatch.isSelected() == true)
        {
            doMatch();
        }
    }

    public void removeUpdate(DocumentEvent e)
    {
        if(quickMatch.isSelected() == true)
        {
            doMatch();
        }
    }

    public void changedUpdate(DocumentEvent e)  {}


    public void actionPerformed(ActionEvent evt)
    {
        if(evt.getSource() == matchButton)
        {
            doMatch();
        }
    }

    public void doMatch()
    {
        outputArea.setText("\nAttempting Match...");
        inputArea.getHighlighter().removeAllHighlights();

        try
        {

            String inputText = inputArea.getText();
            Pattern pattern = Pattern.compile(regexField.getText());
            Matcher matcher = pattern.matcher(inputText);

            int matchCount = 0;

            while(matcher.find())
            {

                matchCount++;
                outputArea.append("\n\nMatch #" + matchCount);

                for (int i = 0; i < matcher.groupCount() + 1; i++)
                {
                    outputArea.append("\nGroup #" + i + ": " + matcher.group(i));
                    outputArea.append(" , " + matcher.end(i));
                    int start = matcher.start(i);
                    int end = matcher.end(i);
                    System.out.println(start + " : " + end);
                    inputArea.getHighlighter().addHighlight( start, end, DefaultHighlighter.DefaultPainter );

                    System.out.println(i);
                    if (matchCount == 1) inputArea.setCaretPosition(start);
                }

            }

        }
        catch(Exception exc)
        {
            outputArea.append("\nEXCEPTION THROWN");
        }

        outputArea.append("\n\nFinished.\n");

    }

    GridBagLayout gbl;
    GridBagConstraints gbc;
    int gbcf;

    JFrame frame;
    JPanel container;

    JTextArea inputArea;
    JTextField regexField;
    JTextArea outputArea;

    JScrollPane inputScroll;
    JScrollPane outputScroll;

    JCheckBox quickMatch;
    JButton matchButton;

}
于 2013-09-23T16:05:25.100 に答える