【问题标题】:Is there a way to filter / search for content in a HTMLEditorKit?有没有办法过滤/搜索 HTMLEditorKit 中的内容?
【发布时间】:2017-08-20 22:28:02
【问题描述】:

我有一个普通的 HTMLEditorKit() 对象:

        historyKit = new HTMLEditorKit();
        historyDoc = new HTMLDocument();
        history = new JEditorPane("text/html", "");
        JScrollPane historyScrollPane = new JScrollPane(history);
        historyPanel.add(historyScrollPane, "cell 0 0 1 2,grow");
        history.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null,
                null, null));

我将它用作某种“日志”,因此它会根据此对象进行更新:

public class Logger {

    public static ArrayList<String[]> log = new ArrayList<String[]>();

    public static void update(String s) {
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy | HH:mm:ss");
        String historyText = "<b>" + sdf.format(new Date()) + "</b>: " + s;
        String[] sArray = { sdf.format(new Date()), s };
        log.add(sArray);
        append(historyText);
    }

    public static void append(String s) {
        MainFrame.history.setEditorKit(MainFrame.historyKit);
        MainFrame.history.setDocument(MainFrame.historyDoc);
        try {
            MainFrame.historyKit.insertHTML(MainFrame.historyDoc,
                    MainFrame.historyDoc.getLength(), s, 0, 0, null);
        } catch (BadLocationException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

问题是,我相信“遍历”数据结构以便根据某些 JTextField 过滤内容比“遍历”组件本身(在这种情况下,模型,我想)。是否有一种众所周知的过滤文档的方法,使用文本字段作为“搜索字段”?

【问题讨论】:

  • 使用 JTextPane 然后你可以只搜索文本而不用担心 HTML 标签。
  • 我正在使用 HTML 工具包,以便我可以突出显示文本的不同部分(例如,日期是粗体)。相同字体/颜色的所有字符串真的很难读(我知道,也许我可以更聪明一些,用标签做一些黑魔法,或者甚至使用高度定制的 JTable,但无论如何)。当然,总是可以选择放弃美学而支持实用主义。

标签: java swing search filter


【解决方案1】:

我正在使用 HTML 工具包,以便我可以突出显示文本的不同部分

JTextPane 可以与不同的字体、颜色等一起使用。

下面是一个简单的示例,可以帮助您入门:

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

public class TextPaneAttributes extends JPanel
{

    public TextPaneAttributes()
    {
        setLayout( new BorderLayout() );

        JTextPane textPane = new JTextPane();
        textPane.setText( "one\ntwo\nthree\nfour\nfive\nsix\nseven\neight" );

        StyledDocument doc = textPane.getStyledDocument();

        //  Define some character and paragraph attribute sets

        SimpleAttributeSet keyWord = new SimpleAttributeSet();
        StyleConstants.setBold(keyWord, true);

        SimpleAttributeSet green = new SimpleAttributeSet();
        StyleConstants.setForeground(green, Color.GREEN);

        SimpleAttributeSet center = new SimpleAttributeSet();
        StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);

        SimpleAttributeSet left = new SimpleAttributeSet();
        StyleConstants.setAlignment(left, StyleConstants.ALIGN_LEFT);

        //  Change attributes on some existing text

        doc.setCharacterAttributes(0, 3, keyWord, false);
        doc.setCharacterAttributes(8, 5, green, true);
        doc.setParagraphAttributes(20, 1 , center, false);

        //  Add some text with attributes

        try
        {
            doc.insertString(doc.getLength(), "\nNormal text", null);
            doc.insertString(doc.getLength(), "\nGreen text centered", green);
            doc.setParagraphAttributes(doc.getLength(), 1 , center, false);
            doc.insertString(doc.getLength(), "\nKeyword text", keyWord);
            doc.setParagraphAttributes(doc.getLength(), 1 , left, false);

            //  Newly typed text at the end of the document will inherit the
            //  "keyword" attributes unless we remove the attributes

            textPane.setCaretPosition(doc.getLength());
            textPane.getInputAttributes().removeAttributes(keyWord);
        }
        catch(Exception e) {}

        //  Add text pane to frame

        JScrollPane scrollPane = new JScrollPane( textPane );
        scrollPane.setPreferredSize( new Dimension( 200, 250 ) );
        add( scrollPane );

        //  Create a Button panel

        JPanel buttons = new JPanel();
        add(buttons, BorderLayout.PAGE_END);

        //  Add a Bold button

        JButton bold = new JButton( new StyledEditorKit.BoldAction() );
        buttons.add( bold );

        //  Add Right Alignment button

        JButton right = new JButton( new StyledEditorKit.AlignmentAction("Align Right", StyleConstants.ALIGN_RIGHT) );
        buttons.add( right );
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new TextPaneAttributes());
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater( () -> createAndShowGUI() );
/*
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
*/
    }
}

阅读 Text Component Features 上的 Swing 教程部分以获取更多信息和示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 2017-04-02
    • 1970-01-01
    • 2019-09-27
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多