突出一个JTable中单元格的文本 [英] Highlighting the text of a jtable cell

查看:549
本文介绍了突出一个JTable中单元格的文本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想强调一个JTable单元格的文本。
    这是我的code:
    当我得到的testingHighlighter方法​​指定单元格的编辑器,并刻意突出该编辑器组件的文本。请帮我在哪里,我错了。

 公共类测试扩展的JFrame
{
    的DefaultTableModel模型;
    JTable的表;
    字符串COL [] = {姓名,地​​址,电话,测试};    公共静态无效的主要(字符串ARGS [])
    {
        测试T =新的测试();
        t.start();
        t.testingHightligher();    }    公共无效的start()
    {         模型=新的DefaultTableModel(COL,2);
         表=新的JTable(模型){@覆盖
         公共布尔的isCellEditable(INT为arg0,ARG1 INT){                返回true;
            }};        JScrollPane的窗格=新JScrollPane的(表);        setColumnEditor(table.getColumnModel()。getColumn(0),新的对象[] {和
            OR},逻辑运算符);
        [对象] OBJ文件=新的对象[] {==,=};
        setColumnEditor(table.getColumnModel()getColumn(2),OBJ文件,逻辑运算符。);        JTextField的领域=新的JTextField();
        DefaultCellEditor编辑器=新DefaultCellEditor(场);        editor.setClickCountToStart(1);
        TableColumn的山口= table.getColumnModel()getColumn(3)。        col.setCellEditor(编辑);        DefaultTableCellRenderer呈现=新DefaultTableCellRenderer();
        renderer.setToolTipText(点击编辑);
        col.setCellRenderer(渲染);        table.getColumnModel()getColumn(0).SET preferredWidth(25)。
        table.getColumnModel()getColumn(1).SET preferredWidth(120)。
        table.getColumnModel()getColumn(2).SET preferredWidth(25)。
        table.getColumnModel()getColumn(3).SET preferredWidth(100)。        。table.getTableHeader()setReorderingAllowed(假);        table.setValueAt(csanuragjain,0,3);        加(面板);
        调用setVisible(真);
        的setSize(500,400);
        的setLayout(新的FlowLayout());
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }    私人无效setColumnEditor(TableColumn的关口,对象[] editValues​​,字符串renderTip)
    {
        JComboBox的下拉框中= NULL;
        如果(editValues​​!= NULL)
        {
            组合框=新的JComboBox(editValues​​);
        }
        其他
        {
            组合框=新的JComboBox();
        }        comboBox.setMaximumRowCount(6);        DefaultCellEditor编辑器=新DefaultCellEditor(组合框);
        editor.setClickCountToStart(2);
        col.setCellEditor(编辑);        DefaultTableCellRenderer呈现=新DefaultTableCellRenderer();        renderer.setToolTipText(renderTip);
        col.setCellRenderer(渲染);
        的TableCellRenderer的HeaderRenderer = col.getHeaderRenderer();
        如果(的HeaderRenderer的instanceof DefaultTableCellRenderer)
        {
            ((DefaultTableCellRenderer)的HeaderRenderer).setToolTipText(测试);
        }
    }    无效testingHightligher()
    {
        对象值= table.getValueAt(0,3);
        的JTextField字段=(JTextField中)table.getColumnModel()getColumn(3).getCellEditor()getTableCellEditorComponent(表中,值,真,0,3)。。        尝试
        {            。field.getHighlighter()addHighlight(0,3,新javax.swing.text.DefaultHighlighter.DefaultHighlightPainter(Color.RED));        }
        赶上(BadLocationException的前)
        {
            ex.printStackTrace();
        }
    }
}请帮我在哪里我错了..


解决方案

您的下一个问题,你试着突出TableCellEditor的,你看编辑的JTable 在启动<$ C; C>,但在那一刻,你看到的只是CellRenderer中,您可以通过添加 table.editCellAt(0,3)解决您的code $ C> testingHightligher()方法。也叫你的测试就像在接下来的code你的的main()

  SwingUtilities.invokeLater(Runnable的新(){        @覆盖
        公共无效的run(){
              t.testingHightligher();
        }
});

如果你想突出的JTable 文本而这是无法编辑,你需要使用的 的TableCellRenderer 这里是教程的。

例如:

 的TableCellRenderer R =新的TableCellRenderer(){
        JTextField的F =新的JTextField();        @覆盖
        公共组件getTableCellRendererComponent(JTable中为arg0,ARG1对象,布尔ARG2,布尔ARG3,诠释ARG4,诠释arg5){
            如果(ARG1!= NULL){
                f.setText(arg1.toString());
                尝试{
                    。f.getHighlighter()addHighlight(0,3,新javax.swing.text.DefaultHighlighter.DefaultHighlightPainter(Color.RED));
                }赶上(BadLocationException的E){
                    e.printStackTrace();
                }
            }其他{
                f.setText();
                f.getHighlighter()removeAllHighlights()。
            }
            返回F;
        }
    };

您需要somthin这个样子,我也建议您更换的JTextField 这里由的JLabel 和hightligh它像<一个HREF =htt​​p://stackoverflow.com/a/3537009/2894369>这里写

编辑:

下面是完整的例子给你,它的工作原理,观察和审视它:

 公共类表扩展的JFrame {    私人字符串textForSearch =;
    私人的JTable吨;    公开形式(){
        的DefaultTableModel模型;
        T =新的JTable(型号=新的DefaultTableModel(新对象[] [] {},新的对象[] {1}));
        对(INT I = 0; I&小于10;我++){
            model.addRow(新的对象[] {I});
        }
        的for(int i = 0; I&LT; t.getColumnCount();我++){
            t.getColumnModel()getColumn(ⅰ).setCellRenderer(getRenderer())。
        }        JScrollPane的JSP =新JScrollPane的(T);
        最后RightPanel右=新RightPanel();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        加(JSP,BorderLayout.CENTER);
        加(右,BorderLayout.EAST);
        包();
        setLocationRelativeTo(NULL);
    }    私人的TableCellRenderer getRenderer(){
        返回新的TableCellRenderer(){
            JTextField的F =新的JTextField();            @覆盖
            公共组件getTableCellRendererComponent(JTable中为arg0,ARG1对象,布尔ARG2,布尔ARG3,诠释ARG4,诠释arg5){
                如果(ARG1!= NULL){
                    f.setText(arg1.toString());
                    串串= arg1.toString();
                    如果(string.contains(textForSearch)){
                        INT的indexOf = string.indexOf(textForSearch);
                        尝试{
                            。f.getHighlighter()addHighlight(的indexOf,的indexOf + textForSearch.length(),新javax.swing.text.DefaultHighlighter.DefaultHighlightPainter(Color.RED));
                        }赶上(BadLocationException的E){
                            e.printStackTrace();
                        }
                    }
                }其他{
                    f.setText();
                    f.getHighlighter()removeAllHighlights()。
                }
                返回F;
            }
        };
    }    公共静态无效的主要(字串[] args)抛出异常{
        SwingUtilities.invokeLater(Runnable的新(){            公共无效的run(){
                新表()调用setVisible(真);
            }
        });
    }    类RightPanel继承JPanel {
        公共RightPanel(){
            的setLayout(新的GridBagLayout());
            GridBagConstraints的C =新的GridBagConstraints();
            c.insets =新插图(5,5,5,5);
            c.gridy = 0;
            最终的JTextField F =新的JTextField,(5);
            加(F,C);
            JButton的B =的新的JButton(搜索);
            b.addActionListener(新的ActionListener(){                @覆盖
                公共无效的actionPerformed(ActionEvent的为arg0){
                    textForSearch = f.getText();
                    t.repaint();
                }
            });
            c.gridy ++;
            加(B,C);
        }
    }}

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

解决方案

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

}

这篇关于突出一个JTable中单元格的文本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆