Java: 如何 select 文本区域中的多个非连续文本行,与 MS Word 中的 Ctrl 功能相同?
Java: How to select multiple NON-CONSECUTIVE lines of text in a Text Area, the same way Ctrl functions in MS Word?
我想要 select TextArea
中的多个非连续行,如此图所示(但非连续)
并将 selected 行(作为 String[]
参数)传递给按下 Button
时调用的方法。
我该怎么做?
你不能。摆动 JTextArea 仅支持连续选择。
您可以使用 JList
并将每行文本显示为 JList
中的单独项目。 JList
确实支持非连续选择,并且具有 return 所选行数组的方法。
阅读 How to Use JLists 上的 Swing 教程部分了解更多信息。
请注意,JTextArea 确实支持向文本添加 "highlights" 的概念。您可以突出显示任何一段文本,但没有自动处理 add/remove 突出显示,因此您需要创建一个全新的 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();
}
});
*/
}
}
我想要 select TextArea
中的多个非连续行,如此图所示(但非连续)
并将 selected 行(作为 String[]
参数)传递给按下 Button
时调用的方法。
我该怎么做?
你不能。摆动 JTextArea 仅支持连续选择。
您可以使用 JList
并将每行文本显示为 JList
中的单独项目。 JList
确实支持非连续选择,并且具有 return 所选行数组的方法。
阅读 How to Use JLists 上的 Swing 教程部分了解更多信息。
请注意,JTextArea 确实支持向文本添加 "highlights" 的概念。您可以突出显示任何一段文本,但没有自动处理 add/remove 突出显示,因此您需要创建一个全新的 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();
}
});
*/
}
}