Java 突出显示jtable单元格的文本

Java 突出显示jtable单元格的文本,java,swing,awt,Java,Swing,Awt,我试图突出显示jtable单元格的文本。 这是我的代码: 当我在testingHighlighter方法中获取指定单元格的编辑器并尝试高亮显示该编辑器组件中的文本时。请帮助我哪里错了 public class test extends JFrame { DefaultTableModel model; JTable table; String col[] = {"Name","Address","Phone","test"}; public static voi

我试图突出显示jtable单元格的文本。 这是我的代码: 当我在testingHighlighter方法中获取指定单元格的编辑器并尝试高亮显示该编辑器组件中的文本时。请帮助我哪里错了

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..

下一步的问题是,您试图突出显示TableCellEditor中的文本,在编辑
JTable
的单元格时可以看到这些文本,但此时您只能看到CellRenderer,您可以通过添加
table.editCellAt(0,3)来修复代码在测试HightLigher()方法的开始处。也可以像调用
main()中的下一个代码一样调用测试:

如果要在
JTable
中突出显示未编辑的文本,则需要使用。这是一个教程

例如:

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;
        }
    };
你需要这样的东西,我也建议你在这里用
JLabel
替换
JTextField
,然后像这样调高它

编辑:

下面是一个完整的示例,它可以工作,观察并检查它:

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

}
公共类表单扩展JFrame{
私有字符串textForSearch=“”;
专用JTT表;
公共表格(){
默认表格模型;
t=新的JTable(model=新的DefaultTableModel(新对象[][]{},新对象[]{1}));

对于(int i=0;我可以在获取TableCellRenderComponent后更改其格式。例如,如果我执行JTextField=(JTextField)table.getColumnModel().getColumn(3.getCellRenderer().GetTableCellRenderComponent(表,值,true,true,0,3);之后,我用JTextField highlighter突出显示单元格文本。我尝试过,但没有成功。可能吗?我想不,为什么不能使用我的示例?在我的例子中,已经为表列定义了渲染器,我想实现对此表的搜索。我的要求是突出显示特定单元格中的搜索文本。如何我可以实现此行为吗?使用自定义渲染器执行此操作,在文本字段中写入文本,然后在渲染器中在值中搜索它,如果它具有您的searchText Highlight,那么如果已经为jtable列定义了自定义渲染器,该怎么办?我可以在不更改自定义渲染器的情况下执行此操作吗??
 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);
        }
    }

}