Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

I am trying to highlight the text of a jtable cell. This is my code: when i am getting the editor for specified cell in testingHighlighter method and trying to highlight the text in that editor component. please help me where i am wrong.

public class test extends JFrame
{
    DefaultTableModel model;
    JTable table;
    String col[] = {"Name","Address","Phone","test"};

    public static void main(String args[])
    {
        test t = new test();
        t.start();
        t.testingHightligher();

    }

    public void start()
    {

         model = new DefaultTableModel(col,2); 
         table=new JTable(model){@Override
         public boolean isCellEditable(int arg0, int arg1) {

                return true;
            }};

        JScrollPane pane = new JScrollPane(table);

        setColumnEditor( table.getColumnModel().getColumn( 0 ), new Object[] { "AND",
            "OR" }, "Logical Operator" );


        Object[] objs = new Object[] { "==", "=" };
        setColumnEditor( table.getColumnModel().getColumn( 2 ), objs, "Logical Operator");

        JTextField field = new JTextField();
        DefaultCellEditor editor = new DefaultCellEditor( field );

        editor.setClickCountToStart( 1 );
        TableColumn col = table.getColumnModel().getColumn( 3 );

        col.setCellEditor( editor );

        DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
        renderer.setToolTipText( "click to edit" );
        col.setCellRenderer( renderer );

        table.getColumnModel().getColumn( 0 ).setPreferredWidth( 25 );
        table.getColumnModel().getColumn( 1 ).setPreferredWidth( 120 );
        table.getColumnModel().getColumn( 2 ).setPreferredWidth( 25 );
        table.getColumnModel().getColumn( 3 ).setPreferredWidth( 100 );

        table.getTableHeader().setReorderingAllowed( false );

        table.setValueAt("csanuragjain",0,3);

        add(pane);
        setVisible(true);
        setSize(500,400);
        setLayout(new FlowLayout());
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    private void setColumnEditor( TableColumn col, Object[] editValues, String renderTip )
    {
        JComboBox comboBox = null;
        if( editValues != null )
        {
            comboBox = new JComboBox( editValues );
        }
        else
        {
            comboBox = new JComboBox();
        }

        comboBox.setMaximumRowCount( 6 );

        DefaultCellEditor editor = new DefaultCellEditor( comboBox );
        editor.setClickCountToStart( 2 );
        col.setCellEditor( editor );

        DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();

        renderer.setToolTipText( renderTip );
        col.setCellRenderer( renderer );


        TableCellRenderer headerRenderer = col.getHeaderRenderer();
        if( headerRenderer instanceof DefaultTableCellRenderer )
        {
            ( (DefaultTableCellRenderer) headerRenderer ).setToolTipText( "test" );
        }
    }

    void testingHightligher()
    {
        Object value = table.getValueAt(0, 3);
        JTextField field = (JTextField) table.getColumnModel().getColumn( 3 ).getCellEditor().getTableCellEditorComponent(table, value, true, 0, 3);

        try
        {

            field.getHighlighter().addHighlight(0, 3, new javax.swing.text.DefaultHighlighter.DefaultHighlightPainter( Color.RED ));

        }
        catch(BadLocationException ex)
        {
            ex.printStackTrace();
        }
    }
}



Please help me where i am wrong..
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
135 views
Welcome To Ask or Share your Answers For Others

1 Answer

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);
        }
    }

}

enter image description here


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...