Вы можете добиться этого, хотя и не напрямую, так как вам нужно сохранить ссылку на Highlight
, добавленную вами к указанной строке, поэтому вам нужно пройти через все основные моменты, чтобы удалить тот, который вы хотите, взгляните на программа прилагается, может быть, это поможет вам достичь того, что вам так хочется:
Последней EDIT: НОВЫЙ КОД, REMOVED НЕКОТОРЫХ ОШИБОК И походит ДОБАВЛЕНО желаемые ФУНКЦИОНАЛЬНЫЕ СВЯЗИ с УСТАНОВКОЙ CARET ПОЗИЦИИ
import java.awt.*;
import java.awt.event.*;
import java.util.Map;
import java.util.HashMap;
import javax.swing.*;
import javax.swing.text.*;
public class TextHighlight
{
private JTextArea tarea;
private JComboBox cbox;
private JTextField lineField;
private String[] colourNames = {"RED", "ORANGE", "CYAN"};
private Highlighter.HighlightPainter redPainter;
private Highlighter.HighlightPainter orangePainter;
private Highlighter.HighlightPainter cyanPainter;
private int firstUpdateIndex;
private int counter;
private Map<Integer, Highlighter.Highlight> highlights = new HashMap<Integer, Highlighter.Highlight>();
public TextHighlight()
{
redPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.RED);
orangePainter = new DefaultHighlighter.DefaultHighlightPainter(Color.ORANGE);
cyanPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.CYAN);
firstUpdateIndex = -1;
counter = 0;
}
private void createAndDisplayGUI()
{
final JFrame frame = new JFrame("Text HIGHLIGHT");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
JPanel contentPane = new JPanel();
contentPane.setBorder(BorderFactory.createTitledBorder(
BorderFactory.createEmptyBorder(5, 5, 5, 5), "Highlighter JTextArea"));
tarea = new JTextArea(10, 10);
JScrollPane scrollPane = new JScrollPane(tarea);
contentPane.add(scrollPane);
JButton remHighButton = new JButton("REMOVE HIGHLIGHT");
remHighButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
String input = JOptionPane.showInputDialog(frame, "Please Enter Start Index : "
, "Highlighting Options : "
, JOptionPane.PLAIN_MESSAGE);
if (input != null && (highlights.size() > 0))
{
int startIndex = Integer.parseInt(input.trim());
Highlighter highlighter = tarea.getHighlighter();
highlighter.removeHighlight(highlights.get(startIndex));
tarea.setCaretPosition(startIndex);
tarea.requestFocusInWindow();
highlights.remove(startIndex);
}
}
});
JButton button = new JButton("HIGHLIGHT TEXT");
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
String text = null;
text = tarea.getSelectedText();
if (text != null && text.length() > 0)
{
int startIndex = tarea.getText().indexOf(text);
int endIndex = startIndex + text.length();
Highlighter highlighter = tarea.getHighlighter();
int selection = JOptionPane.showConfirmDialog(
frame, getOptionPanel(), "Highlight Colour : "
, JOptionPane.OK_CANCEL_OPTION
, JOptionPane.PLAIN_MESSAGE);
System.out.println("TEXT : " + text);
System.out.println("START INDEX : " + startIndex);
System.out.println("END INDEX : " + endIndex);
if (selection == JOptionPane.OK_OPTION)
{
String colour = (String) cbox.getSelectedItem();
try
{
if (colour == colourNames[0])
{
System.out.println("Colour Selected : " + colour);
highlighter.addHighlight(startIndex, endIndex, redPainter);
}
else if (colour == colourNames[1])
{
System.out.println("Colour Selected : " + colour);
highlighter.addHighlight(startIndex, endIndex, orangePainter);
}
else if (colour == colourNames[2])
{
System.out.println("Colour Selected : " + colour);
highlighter.addHighlight(startIndex, endIndex, cyanPainter);
}
Highlighter.Highlight[] highlightIndex = highlighter.getHighlights();
System.out.println("Lengh of Highlights used : " + highlightIndex.length);
highlights.put(startIndex, highlightIndex[highlightIndex.length - 1]);
}
catch(BadLocationException ble)
{
ble.printStackTrace();
}
}
else if (selection == JOptionPane.CANCEL_OPTION)
{
System.out.println("CANCEL BUTTON PRESSED.");
}
else if (selection == JOptionPane.CLOSED_OPTION)
{
System.out.println("JOPTIONPANE CLOSED DELIBERATELY.");
}
}
}
});
frame.add(remHighButton, BorderLayout.PAGE_START);
frame.add(contentPane, BorderLayout.CENTER);
frame.add(button, BorderLayout.PAGE_END);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private JPanel getOptionPanel()
{
JPanel panel = new JPanel();
panel.setBorder(BorderFactory.createTitledBorder(
BorderFactory.createLineBorder(Color.DARK_GRAY, 2), "COLOUR SELECTION"));
panel.setLayout(new GridLayout(0, 2, 5, 5));
JLabel colourLabel = new JLabel("Select One Colour : ");
cbox = new JComboBox(colourNames);
panel.add(colourLabel);
panel.add(cbox);
return panel;
}
public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new TextHighlight().createAndDisplayGUI();
}
});
}
}
ВЫХОД:
НАЧАТЬ:
ВЫСВЕТИТЬ FIRST LINEВТОРОЙ
Удалены ВЫСВЕТИТЬ
Подчеркивая одной линии с разной цветовой
последняя правка в строках с кодом SAMPLE в ВОПРОСЕ
import java.awt.*;
import java.net.MalformedURLException;
import javax.swing.*;
import javax.swing.text.*;
public class Test {
public static void main(final String[] args) throws MalformedURLException {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
init();
} catch (BadLocationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
private static void init() throws BadLocationException {
JFrame frame = new JFrame();
final JTextArea textArea = new JTextArea();
JScrollPane pane = new JScrollPane(textArea);
textArea.setText("Something. Something else.\nA second line\na third line"
+ "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n"
+ "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nSomething. Samething else.\nA second line\na third line"
+ "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n"
+ "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nSomething. Sbmething else.\nA second line\na third line"
+ "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n"
+ "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nSomething. Scmething else.\nA second line\na third line"
+ "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n"
+ "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nSomething. Sdmething else.\nA second line\na third line"
+ "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n"
+ "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nSomething. Semething else.\nA second line\na third line"
+ "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n"
+ "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nSomething. Sfmething else.\nA second line\na third line"
+ "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n"
+ "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nSomething. Sgmething else.\nA second line\na third line"
+ "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n"
+ "Blabla\nBlabla\nBlabla\nBlabla\nBlabla\nBlabla\n");
textArea.setSelectionColor(Color.RED);
frame.add(pane);
frame.setSize(300, 120);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
String turnToString2 = "Sdmething else.\nA second line\na third line"
+ "Blabla\nBlabla\nBlabla\nBlabla\nBlabla";
int pos2 = textArea.getText().indexOf(turnToString2);
Rectangle startIndex = textArea.modelToView(pos2);
textArea.getHighlighter().addHighlight(pos2,
pos2 + turnToString2.length(),
new DefaultHighlighter.DefaultHighlightPainter(Color.yellow));
int y = startIndex.y + (pane.getHeight() - 10);
System.out.println("Pane Height : " + pane.getHeight());
System.out.println("X : " + startIndex.x);
System.out.println("Y : " + y);
System.out.println("Y (pos2) : " + startIndex.y);
textArea.setCaretPosition(textArea.viewToModel(new Point(startIndex.x, y)));
pane.scrollRectToVisible(new Rectangle(startIndex.x, y));
}
}
Вот ВЫВОД:
Проверьте это мое последнее редактирование, это то, что вы хотели? –
@nIcEcOw Привет, так важно для вашего редактирования. Теперь я использую демо-код Guillaume Polet, чтобы проиллюстрировать мою проблему. Не могли бы вы запустить его и посмотреть на него? Благодарю. – AnneS
Я сделал это немного, попробую протестировать его, запустив последний код, надеюсь, что это может помочь :-) –