突出显示 JTextArea 中的一个特定行/行
Posted
技术标签:
【中文标题】突出显示 JTextArea 中的一个特定行/行【英文标题】:Highlight one specific row/line in JTextArea 【发布时间】:2012-04-28 19:43:15 【问题描述】:我试图仅突出显示 JTextArea
中的一个特定行,但我不知道该怎么做。我需要获取特定的行,然后突出显示它。我已经阅读了其他帖子,但我仍然不明白如何将它们组合在一起来解决我的问题......非常感谢帮助。
【问题讨论】:
你试过这个精彩的 POST,How to highlight by @mKorbel -1 表示没有对此进行研究。谷歌上弹出的第一件事是一个有效的代码 sn-p。 我试过了,但它们并没有解决我突出显示特定行的问题,我正在尝试获取特定行并突出显示它 “还是不明白” 你懂怎么提问吗?如果是这样,请添加一个,并使其具体。 “它们不能解决我突出显示特定行的问题” 只有在行不自动换行时才有意义。顺便说一句,如果你“不能让它工作”,你最好张贴SSCCE尽你最大的努力。我看不出任何有能力这样做的人会用勺子喂这个非常具体的问题的答案。 “我已经尝试过您发布的那些链接” 1) 除了我之外,没有人收到该评论的通知。 2) 我们不是通灵者。因此,最好提及您尝试过的内容、查看的线程以及它们不符合规范的原因。 (等等。)。 SO 不是帮助台,而是问答网站。更好的指定问题得到更好的答案。 【参考方案1】:试试这个代码示例,如果有什么不清楚的地方,请询问:
import java.awt.*;
import java.awt.event.*;
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 painter;
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 button = new JButton("HIGHLIGHT TEXT");
button.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent ae)
int selection = JOptionPane.showConfirmDialog(
frame, getOptionPanel(), "Highlighting Options : ", JOptionPane.OK_CANCEL_OPTION
, JOptionPane.PLAIN_MESSAGE);
if (selection == JOptionPane.OK_OPTION)
System.out.println("OK Selected");
int lineNumber = Integer.parseInt(lineField.getText().trim());
try
int startIndex = tarea.getLineStartOffset(lineNumber);
int endIndex = tarea.getLineEndOffset(lineNumber);
String colour = (String) cbox.getSelectedItem();
if (colour == colourNames[0])
System.out.println("RED Colour");
painter = new DefaultHighlighter.DefaultHighlightPainter(Color.RED);
tarea.getHighlighter().addHighlight(startIndex, endIndex, painter);
else if (colour == colourNames[1])
System.out.println("ORANGE Colour");
painter = new DefaultHighlighter.DefaultHighlightPainter(Color.ORANGE);
tarea.getHighlighter().addHighlight(startIndex, endIndex, painter);
else if (colour == colourNames[2])
System.out.println("CYAN Colour");
painter = new DefaultHighlighter.DefaultHighlightPainter(Color.CYAN);
tarea.getHighlighter().addHighlight(startIndex, endIndex, painter);
catch(BadLocationException ble)
ble.printStackTrace();
else if (selection == JOptionPane.CANCEL_OPTION)
System.out.println("CANCEL Selected");
else if (selection == JOptionPane.CLOSED_OPTION)
System.out.println("JOptionPane closed deliberately.");
);
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.setLayout(new GridLayout(0, 2, 5, 5));
JLabel lineNumberLabel = new JLabel("Enter Line Number : ");
lineField = new JTextField(10);
JLabel colourLabel = new JLabel("Select One Colour : ");
cbox = new JComboBox(colourNames);
panel.add(lineNumberLabel);
panel.add(lineField);
panel.add(colourLabel);
panel.add(cbox);
return panel;
public static void main(String... args)
SwingUtilities.invokeLater(new Runnable()
public void run()
new TextHighlight().createAndDisplayGUI();
);
这是它的输出:
【讨论】:
感谢您的示例代码,这就是我所做的。code RectanglePainter red = new RectanglePainter( Color.RED ); try f1.textarea.getHighlighter().addHighlight(f1.textarea.getLineStartOffset(iline), f1.textarea.getLineEndOffset(iline), red);// catch (BadLocationException ex) ex.printStackTrace();
【参考方案2】:
如果您无法选择 TextArea 到 TextField 的原因是按钮单击导致 JTextArea 失去焦点,因此不显示其选择。
在按钮点击事件上使用btnImport.transferFocusBackward();
来解决问题。
【讨论】:
【参考方案3】:这样做: 这是java的text area swing
JTextArea area = new JTextArea();
int startIndex = area.getLineStartOffset(2);
int endIndex = area.getLineEndOffset(2);
painter = new DefaultHighlighter.DefaultHighlightPainter(Color.RED);
area.getHighlighter().addHighlight(startIndex, endIndex, painter);
【讨论】:
以上是关于突出显示 JTextArea 中的一个特定行/行的主要内容,如果未能解决你的问题,请参考以下文章
如果另一列中的相应行包含特定值,我想使用条件格式突出显示一列中的单元格