【问题标题】:Highlighting the text of a jtable cell突出显示 jtable 单元格的文本
【发布时间】:2013-11-21 06:24:19
【问题描述】:

我正在尝试突出显示 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..

【问题讨论】:

    标签: java swing awt


    【解决方案1】:

    接下来的问题是,您尝试在 TableCellEditor 中突出显示文本,您在编辑 JTable 的单元格时会看到该文本,但在那一刻您只看到 CellRenderer,您可以通过在开头添加 table.editCellAt(0, 3); 来修复您的代码testingHightligher() 方法。还可以像 main() 中的下一个代码一样调用您的测试:

    SwingUtilities.invokeLater(new Runnable() {
    
            @Override
            public void run() {
                  t.testingHightligher();
            }
    });
    

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

    例子:

    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,然后像written here一样高亮它

    编辑:

    这是给你的完整例子,它可以工作,观察和检查它:

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

    【讨论】:

    • 获得tableCellRendererComponent后能否更改其格式。就像我做 JTextField field = (JTextField) table.getColumnModel().getColumn(3).getCellRenderer().getTableCellRendererComponent(table, value, true, true, 0, 3);之后,我使用 JTextField 荧光笔突出显示单元格文本。我试过了,但没有成功..有可能吗.??
    • 我觉得不行,为什么你不能用我的例子?
    • 在我的情况下,渲染器已经为表列定义,我想实现对这个表的搜索。我的要求是突出显示特定单元格中的搜索文本。我怎样才能实现这种行为?
    • 使用自定义渲染器,在 textField 中写入文本,然后在渲染器中搜索它的值,如果它有你的 searchText 高亮它
    • 如果已经为 jtable 列定义了自定义渲染器怎么办。我可以在不更改自定义渲染器的情况下做到这一点吗??
    猜你喜欢
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2013-09-19
    • 2021-09-01
    • 2011-03-27
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多