问题1:通过使用defaulthighlighter,我可以使聚焦线变为蓝色。 现在我想将其更改为其他颜色。有谁知道如何更改此参数? ---已解决
问题2:pos是我想要突出显示的子字符串的起始索引。我用setCaretPosition(pos);更新显示内容。但它总是出现在窗口的底部。我想把它放在最顶层。有谁能告诉我如何处理它?</ p>
我使用一个演示来显示我的问题:
import java.awt.Color;
import java.net.MalformedURLException;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter;
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);
textArea.getHighlighter().addHighlight(pos2,
pos2 + turnToString2.length(),
new DefaultHighlighter.DefaultHighlightPainter(Color.yellow));
textArea.setCaretPosition(pos2);
结果是:
我希望它位于屏幕的右上方,但在此代码中,它显示在滚动窗格的底部。任何人都可以知道如何改变这个? 感谢。
答案 0 :(得分:19)
你可以实现这一点,但不能直接实现,因为你必须保存对你所添加到所述行的Highlight
的引用,因此你必须遍历所有的要点以删除你想要的那个,看看附上的程序,可能会帮助你达到你想要的目标:
最新编辑:新代码,删除了一些错误,并添加了与设置收入位置相关的所需功能
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();
}
});
}
}
输出:
开始:
亮点第一行 第二次
删除突出显示
突出显示具有不同颜色的相同行
在问题中使用SAMPLE CODE排成一行的最新编辑
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));
}
}
这是OUTPUT:
答案 1 :(得分:6)
要设置选择背景颜色,请使用setSelectionColor(如下所示但未使用)。
我真的不明白你用说什么,它总是出现在窗口的底部。我想把它放在顶部,但我猜测(我可能在这里错了)你的textarea在一个滚动窗格中,并通过突出显示它滚动到你选择的结尾的文本,所以我建议在突出显示文本后设置插入位置。
这是我理解的样本。如果这不是您想要的,请告诉我:
import java.awt.Color;
import java.net.MalformedURLException;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter;
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\n");
textArea.setSelectionColor(Color.RED);
frame.add(pane);
frame.setSize(300, 120);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
String turnToString = "Something else.\nA second line\na third line"
+ "Blabla\nBlabla\nBlabla\nBlabla\nBlabla";
final int pos = textArea.getText().indexOf(turnToString);
textArea.getHighlighter().addHighlight(pos,
pos + turnToString.length(),
new DefaultHighlighter.DefaultHighlightPainter(Color.yellow));
textArea.scrollRectToVisible(new Rectangle(0, 0, pane.getViewport().getWidth(), pane.getViewport().getHeight()));
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
textArea.setCaretPosition(pos);
}
});
}
}
答案 2 :(得分:6)
我认为在使用Highlighter的情况下,不能为所有JTextComponents更改这些方法,但是可以仅更改Foreground
例如
import java.awt.*;
import javax.swing.*;
import javax.swing.text.DefaultHighlighter;
public class TextAreaLineHightLight {
public static void main(String[] args) throws Exception {
UIManager.put("TextArea.selectionBackground", Color.yellow);
UIManager.put("TextArea.selectionForeground", Color.red);
String string = "Lorem ipsum eum putant gubergren evertitur in, "
+ "no assueverit vituperatoribus eum. Ea cibo offendit vim, est et vivendum qualisque prodesset. "
+ "Vis doctus expetenda contentiones an, no ius mazim epicuri expetendis, "
+ "saperet salutandi forensibus ne usu. Ex fugit alterum usu. "
+ "His ignota cotidieque in, augue erroribus eam no.";
JTextArea textArea = new JTextArea(string);
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
JScrollPane textAreaScroll = new JScrollPane(textArea);
JFrame frame = new JFrame();
frame.setLayout(new BorderLayout());
frame.add(textAreaScroll, BorderLayout.CENTER);
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
String term = "qualisque prodesset. "
+ "Vis doctus expetenda contentiones an, no ius mazim epicuri expetendis";
int termOffset = string.indexOf(term);
Rectangle view = textArea.modelToView(termOffset);
int startOffset = textArea.viewToModel(new Point(0, view.y));
//int rowH = textArea.
int endOffset = textArea.viewToModel(new Point(textArea.getSize().width, view.y));
textArea.getHighlighter().addHighlight(startOffset, endOffset, new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW));
}
}
与JTextPane的结果相同
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
public class TextPaneHighlighting extends JFrame {
private static final long serialVersionUID = 1L;
private Highlighter.HighlightPainter cyanPainter;
private Highlighter.HighlightPainter redPainter;
public TextPaneHighlighting() {
UIManager.put("TextPane.selectionBackground", Color.yellow);
UIManager.put("TextPane.selectionForeground", Color.red);
JTextPane textPane = new JTextPane();
textPane.setText("one\ntwo\nthree\nfour\nfive\nsix\nseven\neight\n");
JScrollPane scrollPane = new JScrollPane(textPane);
getContentPane().add(scrollPane);// Highlight some text
cyanPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.cyan);
redPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.red);
try {
textPane.getHighlighter().addHighlight(0, 3, DefaultHighlighter.DefaultPainter);
textPane.getHighlighter().addHighlight(8, 14, cyanPainter);
textPane.getHighlighter().addHighlight(19, 24, redPainter);
} catch (BadLocationException ble) {
}
}
public static void main(String[] args) {
TextPaneHighlighting frame = new TextPaneHighlighting();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setSize(300, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
答案 3 :(得分:3)
解决2) 使用modelToView获取第一个选定行的点。然后使用Point使用scrollRectToVisible(注意:矩形的高度必须是您的视口高度)。