在 JTextArea 上突出显示文本
Highlight Text on JTextArea
我需要在 JTextArea 上突出显示文本,我使用 JTextField 获取用户输入,然后使用 Button 获取 JTextFields 文本。最终我需要让它突出显示 JTextArea exp 中字符串的所有出现:我有 200 个单词和 10 个单词 'dog' 我希望狗被突出显示 10 次。
我似乎对循环本身有问题,它突出显示了第一次出现,然后是 none。
private void getSearch() throws BadLocationException {
// my textfield (searchT)
String jtf = searchT.getText();
// my jtextarea (userField);
String jta = userField.getText();
hilit = userField.getHighlighter();
hilit.removeAllHighlights();
int index = jta.indexOf(jtf);
while(index >=0){
System.out.println("looping");
int len = jtf.length();
hilit.addHighlight(index,index+len, painter);
index = jta.indexOf(jta, index+len);
}
}
**PER REQUEST:**
public class project extend Frame implements ActionListener{
Highlighter hilit;
Highlighter.HighlightPainter painter;
public project(){
userField = new JTextArea();
searchT = new JTextField("Spotlight");
searchT.setEditable(true);
searchT.setBorder(new LineBorder (Color.black));
searchB = new JButton("Search");
hilit = new DefaultHighlighter();
painter = new DefaultHighlighter.DefaultHighlightPainter(HILIT_COLOR);
// JButton (searchB) with ActionListener
searchB.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt) {
try {
searchBActionPerformed(evt);
} catch (BadLocationException ex) {
Logger.getLogger(DaWord.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void searchBActionPerformed(ActionEvent evt) throws BadLocationException {
Object sb = evt.getSource();
if(searchB==sb){
getSearch();
}
}
private void getSearch() throws BadLocationException {
// my jtextfield
String jtf = searchT.getText();
// my jtextarea
String jta = userField.getText();
hilit = userField.getHighlighter();
hilit.removeAllHighlights();
int index = jta.indexOf(jtf);
while(index >=0){
System.out.println("looping");
System.out.println("im searching for"+index);
int len = jtf.length();
hilit.addHighlight(index,index+len, painter);
index = jta.indexOf(jta, index+len);
System.out.println("this is what I want to highlight"+ index);
// remove hightlights with a timer for example after 10 seconds
}
}
是的,搜索正确的字符串:
while(index >=0){
System.out.println("looping");
int len = jtf.length();
hilit.addHighlight(index,index+len, painter);
index = jta.indexOf(jtf, index+len);
}
--
我根据你的代码编写了一个小程序:唯一的问题是正如我所说你正在寻找错误的字符串(你没有在 indexOf() 中将 jta 更改为 jtf。否则它工作正常并突出显示聚光灯红色(我的颜色你可以设置成你想要的):
class project extends Frame { // implements ActionListener{
Highlighter hilit;
Highlighter.HighlightPainter painter;
JTextArea userField;
JTextField searchT;
JButton searchB;
public project(){
userField = new JTextArea("spotlight aaa spotlight");
searchT = new JTextField("spotlight");
searchT.setEditable(true);
// searchT.setBorder(new LineBorder (Color.black));
searchB = new JButton("Search");
hilit = new DefaultHighlighter();
painter = new DefaultHighlighter.DefaultHighlightPainter(Color.red);
// JButton (searchB) with ActionListener
searchB.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt) {
try {
searchBActionPerformed(evt);
} catch (BadLocationException ex) {
// Logger.getLogger(DaWord.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void searchBActionPerformed(ActionEvent evt) throws BadLocationException {
Object sb = evt.getSource();
if(searchB==sb){
getSearch();
}
}
private void getSearch() throws BadLocationException {
// my jtextfield
String jtf = searchT.getText();
// my jtextarea
String jta = userField.getText();
hilit = userField.getHighlighter();
hilit.removeAllHighlights();
int index = jta.indexOf(jtf);
while(index >=0){
System.out.println("looping");
System.out.println("im searching for"+jtf+" "+index);
int len = jtf.length();
hilit.addHighlight(index,index+len, painter);
index = jta.indexOf(jtf, index+len);
System.out.println("this is what I want to highlight"+ index);
// remove hightlights with a timer for example after 10 seconds
}
}
});
setSize(500, 500);
setLayout(new FlowLayout());
add(userField);
add(searchT);
add(searchB);
setVisible(true);
}
}
我需要在 JTextArea 上突出显示文本,我使用 JTextField 获取用户输入,然后使用 Button 获取 JTextFields 文本。最终我需要让它突出显示 JTextArea exp 中字符串的所有出现:我有 200 个单词和 10 个单词 'dog' 我希望狗被突出显示 10 次。
我似乎对循环本身有问题,它突出显示了第一次出现,然后是 none。
private void getSearch() throws BadLocationException {
// my textfield (searchT)
String jtf = searchT.getText();
// my jtextarea (userField);
String jta = userField.getText();
hilit = userField.getHighlighter();
hilit.removeAllHighlights();
int index = jta.indexOf(jtf);
while(index >=0){
System.out.println("looping");
int len = jtf.length();
hilit.addHighlight(index,index+len, painter);
index = jta.indexOf(jta, index+len);
}
}
**PER REQUEST:**
public class project extend Frame implements ActionListener{
Highlighter hilit;
Highlighter.HighlightPainter painter;
public project(){
userField = new JTextArea();
searchT = new JTextField("Spotlight");
searchT.setEditable(true);
searchT.setBorder(new LineBorder (Color.black));
searchB = new JButton("Search");
hilit = new DefaultHighlighter();
painter = new DefaultHighlighter.DefaultHighlightPainter(HILIT_COLOR);
// JButton (searchB) with ActionListener
searchB.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt) {
try {
searchBActionPerformed(evt);
} catch (BadLocationException ex) {
Logger.getLogger(DaWord.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void searchBActionPerformed(ActionEvent evt) throws BadLocationException {
Object sb = evt.getSource();
if(searchB==sb){
getSearch();
}
}
private void getSearch() throws BadLocationException {
// my jtextfield
String jtf = searchT.getText();
// my jtextarea
String jta = userField.getText();
hilit = userField.getHighlighter();
hilit.removeAllHighlights();
int index = jta.indexOf(jtf);
while(index >=0){
System.out.println("looping");
System.out.println("im searching for"+index);
int len = jtf.length();
hilit.addHighlight(index,index+len, painter);
index = jta.indexOf(jta, index+len);
System.out.println("this is what I want to highlight"+ index);
// remove hightlights with a timer for example after 10 seconds
}
}
是的,搜索正确的字符串:
while(index >=0){
System.out.println("looping");
int len = jtf.length();
hilit.addHighlight(index,index+len, painter);
index = jta.indexOf(jtf, index+len);
}
--
我根据你的代码编写了一个小程序:唯一的问题是正如我所说你正在寻找错误的字符串(你没有在 indexOf() 中将 jta 更改为 jtf。否则它工作正常并突出显示聚光灯红色(我的颜色你可以设置成你想要的):
class project extends Frame { // implements ActionListener{
Highlighter hilit;
Highlighter.HighlightPainter painter;
JTextArea userField;
JTextField searchT;
JButton searchB;
public project(){
userField = new JTextArea("spotlight aaa spotlight");
searchT = new JTextField("spotlight");
searchT.setEditable(true);
// searchT.setBorder(new LineBorder (Color.black));
searchB = new JButton("Search");
hilit = new DefaultHighlighter();
painter = new DefaultHighlighter.DefaultHighlightPainter(Color.red);
// JButton (searchB) with ActionListener
searchB.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt) {
try {
searchBActionPerformed(evt);
} catch (BadLocationException ex) {
// Logger.getLogger(DaWord.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void searchBActionPerformed(ActionEvent evt) throws BadLocationException {
Object sb = evt.getSource();
if(searchB==sb){
getSearch();
}
}
private void getSearch() throws BadLocationException {
// my jtextfield
String jtf = searchT.getText();
// my jtextarea
String jta = userField.getText();
hilit = userField.getHighlighter();
hilit.removeAllHighlights();
int index = jta.indexOf(jtf);
while(index >=0){
System.out.println("looping");
System.out.println("im searching for"+jtf+" "+index);
int len = jtf.length();
hilit.addHighlight(index,index+len, painter);
index = jta.indexOf(jtf, index+len);
System.out.println("this is what I want to highlight"+ index);
// remove hightlights with a timer for example after 10 seconds
}
}
});
setSize(500, 500);
setLayout(new FlowLayout());
add(userField);
add(searchT);
add(searchB);
setVisible(true);
}
}