Your problem in next, you try to highlight text in TableCellEditor, which you see when editing a cell of JTable
, but in that moment you see only CellRenderer, you can fix your code by adding table.editCellAt(0, 3);
at start of testingHightligher()
method. Also call your test like next code in your main()
:
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
t.testingHightligher();
}
});
IF you want to highlight text in JTable
while it isn't edit, you need to use TableCellRenderer
. Here is tutorial for that.
Example :
TableCellRenderer r = new TableCellRenderer() {
JTextField f = new JTextField();
@Override
public Component getTableCellRendererComponent(JTable arg0, Object arg1, boolean arg2, boolean arg3, int arg4, int arg5) {
if(arg1 != null){
f.setText(arg1.toString());
try {
f.getHighlighter().addHighlight(0,3,new javax.swing.text.DefaultHighlighter.DefaultHighlightPainter(Color.RED));
} catch (BadLocationException e) {
e.printStackTrace();
}
} else {
f.setText("");
f.getHighlighter().removeAllHighlights();
}
return f;
}
};
You need somthin like this, also I recommend you replace JTextField
here by JLabel
and hightligh it like written here
EDIT:
Here is full example for you, it works, watch and examine it:
public class Form extends JFrame {
private String textForSearch = "";
private JTable t;
public Form() {
DefaultTableModel model;
t = new JTable(model = new DefaultTableModel(new Object[][]{},new Object[]{1}));
for(int i =0;i<10;i++){
model.addRow(new Object[]{i});
}
for(int i =0;i<t.getColumnCount();i++){
t.getColumnModel().getColumn(i).setCellRenderer(getRenderer());
}
JScrollPane jsp = new JScrollPane(t);
final RightPanel right = new RightPanel();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(jsp, BorderLayout.CENTER);
add(right, BorderLayout.EAST);
pack();
setLocationRelativeTo(null);
}
private TableCellRenderer getRenderer() {
return new TableCellRenderer() {
JTextField f = new JTextField();
@Override
public Component getTableCellRendererComponent(JTable arg0, Object arg1, boolean arg2, boolean arg3, int arg4, int arg5) {
if(arg1 != null){
f.setText(arg1.toString());
String string = arg1.toString();
if(string.contains(textForSearch)){
int indexOf = string.indexOf(textForSearch);
try {
f.getHighlighter().addHighlight(indexOf,indexOf+textForSearch.length(),new javax.swing.text.DefaultHighlighter.DefaultHighlightPainter(Color.RED));
} catch (BadLocationException e) {
e.printStackTrace();
}
}
} else {
f.setText("");
f.getHighlighter().removeAllHighlights();
}
return f;
}
};
}
public static void main(String[] args) throws Exception {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Form().setVisible(true);
}
});
}
class RightPanel extends JPanel{
public RightPanel(){
setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(5, 5, 5, 5);
c.gridy = 0;
final JTextField f = new JTextField(5);
add(f,c);
JButton b = new JButton("search");
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
textForSearch = f.getText();
t.repaint();
}
});
c.gridy++;
add(b,c);
}
}
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…