【问题标题】:Removing Highlight from specific word - Java从特定单词中删除突出显示 - Java
【发布时间】:2013-08-25 04:16:33
【问题描述】:

我想构建一个示例以从与我的应用过滤器匹配的单词中删除突出显示。因此,我基于以下示例:

    public void removeHighlights(JTextComponent jTextArea) {

        Highlighter hilite = jTextArea.getHighlighter();
        Highlighter.Highlight[] hilites = hilite.getHighlights();

        for (int i = 0; i < hilites.length; i++) {
            if (hilites[i].getPainter() instanceof TextHighLighter) {
                hilite.removeHighlight(hilites[i]);
            }
        }
    } 

此示例用于删除文本区域的所有高光。例如,如果我选择了三个单词并且取消选中一个框,则所有过滤器都将被删除,我只想删除未选中单词的突出显示。有没有简单的方法来检查哪个单词与过滤器匹配?还是我需要手动完成?因为直到现在我发现我的研究没有任何成功

提前致谢

最终编辑:

基于@camickr 回答为我工作的逻辑:

public void removeHighlights(JTextComponent jTextArea, String turnLightOff) {


           Highlighter hilite = jTextArea.getHighlighter();

           Highlighter.Highlight[] hilites = hilite.getHighlights();

           for (int i = 0; i < hilites.length; i++) {

              int wordLenght = hilites[i].getEndOffset() - hilites[i].getStartOffset();

              if(wordLenght == turnLightOff.length()){

                  if (hilites[i].getPainter() instanceof TextHighLighter) {

                      hilite.removeHighlight(hilites[i]);
              }

              }
           }                
}

【问题讨论】:

  • if I have three selected words and I uncheck the box of one,请问我的问题是什么and I uncheck the box of one。 ,您可以将视图和/或荧光笔转换为模型,转换为文档,无论如何 +1
  • 我应该如何处理这种情况?你能指导我更多吗?
  • hmm ...如何保留每个单词的荧光笔数据结构,f.i.地图>?

标签: java swing highlight jtextarea swing-highlighter


【解决方案1】:

如果您不想保留任何亮点,可以将它们全部删除。

highlighter.removeAllHighlights();

【讨论】:

    【解决方案2】:

    有没有一种简单的方法来检查哪个单词与过滤器匹配?

    没有。

    还是我需要手动操作?

    是的。每个高光包含高光的开始/结束偏移量。因此,您可以使用这些值从 Document 中获取文本。如果文本匹配,则删除突出显示。

    【讨论】:

    • :-) 答案可能只有noyes
    • 我想过这个逻辑,但我不确定它是否应该是要完成的写入方式。干杯 =)
    【解决方案3】:
    • 查看关于添加/删除 Highlighter/instanceof myHighLighter 的简单示例

    .

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.FontMetrics;
    import java.awt.Graphics;
    import java.awt.Rectangle;
    import java.awt.Shape;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextField;
    import javax.swing.JTextPane;
    import javax.swing.UIManager;
    import javax.swing.event.DocumentEvent;
    import javax.swing.event.DocumentListener;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.DefaultHighlighter;
    import javax.swing.text.Document;
    import javax.swing.text.Highlighter;
    import javax.swing.text.JTextComponent;
    import javax.swing.text.LayeredHighlighter;
    import javax.swing.text.Position;
    import javax.swing.text.View;
    
    public class HighlightExample {
    
        public static void main(String[] args) {
            UIManager.put("TextPane.caretForeground", Color.yellow);
            UIManager.put("TextPane.selectionBackground", Color.green);
            UIManager.put("TextPane.selectionForeground", Color.blue);
            /*try {
             UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
             } catch (Exception evt) {
             }*/
            JFrame f = new JFrame("Highlight example");
            final JTextPane textPane = new JTextPane();
            textPane.setHighlighter(highlighter);
            textPane.setText("This text pane contains no html. It supports letter wrapping, "
                    + "\nThis text pane contains no html. It supports letter wrapping!, "
                    + "\nThis text pane contains no html. It supports letter wrapping!, "
                    + "\nThis text pane contains no html. It supports letter wrapping!, "
                    + "\nThis text pane contains no html. It supports letter wrapping!, "
                    + "\nThis text pane contains no html. It supports letter wrapping!");
            JPanel pane = new JPanel();
            pane.setLayout(new BorderLayout());
            pane.add(new JLabel("Enter word, then press ENTER key: "), "West");
            final JTextField tf = new JTextField("wrapping!");
            pane.add(tf, "Center");
            f.add(pane, "South");
            f.add(new JScrollPane(textPane), "Center");
            /*try {
             textPane.read(new FileReader("links1.html"), null);
             } catch (Exception e) {
             System.out.println("Failed to load file " + args[0]);
             System.out.println(e);
             }*/
            final WordSearcher searcher = new WordSearcher(textPane);
            tf.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent evt) {
                    word = tf.getText().trim();
                    int offset = searcher.search(word);
                    if (offset != -1) {
                        try {
                            textPane.scrollRectToVisible(textPane
                                    .modelToView(offset));
                        } catch (BadLocationException e) {
                        }
                    }
                }
            });
            textPane.getDocument().addDocumentListener(new DocumentListener() {
                @Override
                public void insertUpdate(DocumentEvent evt) {
                    searcher.search(word);
                }
    
                @Override
                public void removeUpdate(DocumentEvent evt) {
                    searcher.search(word);
                }
    
                @Override
                public void changedUpdate(DocumentEvent evt) {
                }
            });
            f.setSize(400, 400);
            f.setVisible(true);
        }
        public static String word;
        public static Highlighter highlighter = new UnderlineHighlighter(null);
    }
    
    // A simple class that searches for a word in
    // a document and highlights occurrences of that word
    class WordSearcher {
    
        public WordSearcher(JTextComponent comp) {
            this.comp = comp;
            this.painter = new UnderlineHighlighter.UnderlineHighlightPainter(
                    Color.red);
        }
    
        // Search for a word and return the offset of the
        // first occurrence. Highlights are added for all
        // occurrences found.
        public int search(String word) {
            int firstOffset = -1;
            Highlighter highlighter = comp.getHighlighter();
            // Remove any existing highlights for last word
            Highlighter.Highlight[] highlights = highlighter.getHighlights();
            for (int i = 0; i < highlights.length; i++) {
                Highlighter.Highlight h = highlights[i];
                if (h.getPainter() instanceof UnderlineHighlighter.UnderlineHighlightPainter) {
                    highlighter.removeHighlight(h);
                }
            }
            if (word == null || word.equals("")) {
                return -1;
            }
            // Look for the word we are given - insensitive search
            String content = null;
            try {
                Document d = comp.getDocument();
                content = d.getText(0, d.getLength()).toLowerCase();
            } catch (BadLocationException e) {
                // Cannot happen
                return -1;
            }
            word = word.toLowerCase();
            int lastIndex = 0;
            int wordSize = word.length();
            while ((lastIndex = content.indexOf(word, lastIndex)) != -1) {
                int endIndex = lastIndex + wordSize;
                try {
                    highlighter.addHighlight(lastIndex, endIndex, painter);
                } catch (BadLocationException e) {
                    // Nothing to do
                }
                if (firstOffset == -1) {
                    firstOffset = lastIndex;
                }
                lastIndex = endIndex;
            }
            return firstOffset;
        }
        protected JTextComponent comp;
        protected Highlighter.HighlightPainter painter;
    }
    
    class UnderlineHighlighter extends DefaultHighlighter {
    
        public UnderlineHighlighter(Color c) {
            painter = (c == null ? sharedPainter : new UnderlineHighlightPainter(c));
        }
    
        // Convenience method to add a highlight with
        // the default painter.
        public Object addHighlight(int p0, int p1) throws BadLocationException {
            return addHighlight(p0, p1, painter);
        }
    
        @Override
        public void setDrawsLayeredHighlights(boolean newValue) {
            // Illegal if false - we only support layered highlights
            if (newValue == false) {
                throw new IllegalArgumentException(
                        "UnderlineHighlighter only draws layered highlights");
            }
            super.setDrawsLayeredHighlights(true);
        }
    
        // Painter for underlined highlights
        public static class UnderlineHighlightPainter extends LayeredHighlighter.LayerPainter {
    
            public UnderlineHighlightPainter(Color c) {
                color = c;
            }
    
            @Override
            public void paint(Graphics g, int offs0, int offs1, Shape bounds,
                    JTextComponent c) {
                // Do nothing: this method will never be called
            }
    
            @Override
            public Shape paintLayer(Graphics g, int offs0, int offs1, Shape bounds,
                    JTextComponent c, View view) {
                g.setColor(color == null ? c.getSelectionColor() : color);
                Rectangle alloc = null;
                if (offs0 == view.getStartOffset() && offs1 == view.getEndOffset()) {
                    if (bounds instanceof Rectangle) {
                        alloc = (Rectangle) bounds;
                    } else {
                        alloc = bounds.getBounds();
                    }
                } else {
                    try {
                        Shape shape = view.modelToView(offs0,
                                Position.Bias.Forward, offs1,
                                Position.Bias.Backward, bounds);
                        alloc = (shape instanceof Rectangle) ? (Rectangle) shape
                                : shape.getBounds();
                    } catch (BadLocationException e) {
                        return null;
                    }
                }
                FontMetrics fm = c.getFontMetrics(c.getFont());
                int baseline = alloc.y + alloc.height - fm.getDescent() + 1;
                g.drawLine(alloc.x, baseline, alloc.x + alloc.width, baseline);
                g.drawLine(alloc.x, baseline + 1, alloc.x + alloc.width, baseline + 1);
                return alloc;
            }
            protected Color color; // The color for the underline
        }
        // Shared painter used for default highlighting
        protected static final Highlighter.HighlightPainter sharedPainter = new UnderlineHighlightPainter(
                null);
        // Painter used for this highlighter
        protected Highlighter.HighlightPainter painter;
    }
    

    【讨论】:

    • =/ 这个例子适用于字符串,对于一个连续的字符串,处理单独的字符串,或者在我的情况下,适应多个复选框仍然不合适......但感谢您的尝试
    猜你喜欢
    • 2019-06-24
    • 2014-03-08
    • 2012-11-01
    • 2015-01-10
    • 1970-01-01
    • 2021-06-28
    • 2020-10-11
    • 1970-01-01
    相关资源
    最近更新 更多