Java:如何在文本区域中选择多个非连续文本行,就像在MS Word中使用Ctrl一样?

时间:2016-12-04 03:49:05

标签: java swing awt jtextarea

我想在ERR_TOO_MANY_REDIRECTS中选择多条非连续线,如此图所示(但非连续)

https://i.stack.imgur.com/vjtTv.png

并将选定的行(作为TextArea参数)传递给按下String[]时调用的方法。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

你不能。 Swing JTextArea仅支持连续选择。

您可以使用JList并将每行文字显示为JList中的单独项目。 JList支持非连续选择,并且具有返回所选行数组的方法。

阅读How to Use JLists上的Swing教程中的部分以获取更多信息。

请注意,JTextArea确实支持添加"突出显示"到文本。您可以突出显示任何文本,但没有自动处理来添加/删除突出显示,因此您需要创建一个全新的UI来动态添加和删除高于我的工资等级的突出显示。

编辑:

正如我所提到的,您可以使用Highlighter跟踪个别选择。

一个让你入门的简单例子:

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

public class TextAreaHighlighting extends JPanel
{
    private JTextArea textPane = new JTextArea(10, 30);
    private DefaultHighlighter highlighter =  (DefaultHighlighter)textPane.getHighlighter();

    private Highlighter.HighlightPainter cyanPainter;
    private Highlighter.HighlightPainter yellowPainter;

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

        textPane.setText( "one\ntwo\nthree\nfour\nfive\nsix\nseven\neight\nnine\nten" );
        add( new JScrollPane( textPane ) );

        //  Highlight some text

        highlighter.setDrawsLayeredHighlights(false);

        cyanPainter = new DefaultHighlighter.DefaultHighlightPainter( Color.CYAN );
        yellowPainter = new DefaultHighlighter.DefaultHighlightPainter( Color.YELLOW );

        try
        {
            highlighter.addHighlight( 0, 3, cyanPainter );
        }
        catch(BadLocationException ble) {}

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

        JButton addHighlight = new JButton("Highlight Selected");
        buttons.add(addHighlight);
        addHighlight.addActionListener( new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    int start = textPane.getSelectionStart();
                    int end = textPane.getSelectionEnd();

                    highlighter.addHighlight( start, end, yellowPainter );
                }
                catch(BadLocationException ble) {}
            }
        });

        //  Add Remove Highlight button

        JButton removeHighlight = new JButton("Remove Selected Highlight");
        buttons.add( removeHighlight );
        removeHighlight.addActionListener( new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                int start = textPane.getSelectionStart();
                int end = textPane.getSelectionEnd();

                Highlighter.Highlight[] highlights = textPane.getHighlighter().getHighlights();

                for (int i = 0; i < highlights.length; i++)
                {
                    Highlighter.Highlight h = highlights[i];
                    DefaultHighlighter.DefaultHighlightPainter thePainter =
                        (DefaultHighlighter.DefaultHighlightPainter)h.getPainter();

                    if (h.getStartOffset() >= start
                    &&  h.getEndOffset() <= end)
                        highlighter.removeHighlight(h);
                }
            }
        });

    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("Text Pane Highlighting");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new TextAreaHighlighting());
        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();
            }
        });
*/
    }
}