Swing - Is it possible to set the font color of a “specific” text in a JTable cell?

I have a JTable where in one column the values ​​are displayed in the following format:

423545(50),[7568787(50)],53654656,2021947(50),[021947],2021947(50),[8021947(50)]

I am wondering if it is possible to display values ​​in square brackets in RED?

Over the past few days, I have been looking for search queries and found several examples showing how to set the "background" of a cell, but not how to change the font of a cell, especially not a specific part of the text.

public class myTableCellRenderer
       extends DefaultTableCellRenderer {
  public Component getTableCellRendererComponent(JTable table,
                                                 Object value,
                                                 boolean isSelected,
                                                 boolean hasFocus,
                                                 int row,
                                                 int column) {
    Component c = 
      super.getTableCellRendererComponent(table, value,
                                          isSelected, hasFocus,
                                          row, column);

    if (column == 3) {
       c.setForeground(Color.YELLOW);
       c.setBackground(Color.RED);
    }
    return c;
  }

Is it possible to change part of the text to a different color (i.e. text that is in square brackets).

Edit

, , - , ( ). , , , , 3.

:

product_id |product_name| invoice_numbers
12         |    Books   | 423545(50),[7568787(50)],53654656,2021947(50),[021947],2021947(50),[8021947(50)]
323        |    Videos  | 423545(50),[7568787(50)],53654656,2021947(50),[021947],2021947(50),[8021947(50)]
4434       |    Music   | 423545(50),[7568787(50)],53654656,2021947(50),[021947],2021947(50),[8021947(50)]
+5
4

HTML.

:

import java.awt.BorderLayout;
import java.awt.Component;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

public class TestTable2 {

    class MyCellRenderer extends DefaultTableCellRenderer {
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            Component tableCellRendererComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            if (value instanceof String) {
                String string = (String) value;
                if (string.indexOf('[') > -1) {
                    setText(getHTML(string));
                }
            }
            return tableCellRendererComponent;
        }

        private String getHTML(String string) {
            StringBuilder sb = new StringBuilder();
            sb.append("<html>");
            int index = 0;
            while (index < string.length()) {
                int next = string.indexOf('[', index);
                if (next > -1) {
                    int end = string.indexOf(']', next);
                    if (end > -1) {
                        next++;
                        sb.append(string.substring(index, next));
                        sb.append("<span style=\"color: red;\">");
                        sb.append(string.substring(next, end));
                        sb.append("</span>");
                        index = end;
                    } else {
                        break;
                    }
                } else {
                    break;
                }
            }
            sb.append(string.substring(index, string.length()));
            sb.append("</html>");
            return sb.toString();
        }
    }

    protected void initUI() {
        DefaultTableModel model = new DefaultTableModel();
        for (int i = 0; i < 2; i++) {
            model.addColumn("Col-" + (i + 1));
        }
        for (int i = 0; i < 200; i++) {
            Vector<Object> row = new Vector<Object>();
            for (int j = 0; j < 5; j++) {
                row.add("423545(50),[7568787(50)],53654656,2021947(50),[021947],2021947(50),[8021947(50)]");
            }
            model.addRow(row);
        }
        JTable table = new JTable(model);
        table.setDefaultRenderer(Object.class, new MyCellRenderer());
        JFrame frame = new JFrame(TestTable2.class.getSimpleName());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JScrollPane scrollpane = new JScrollPane(table);
        frame.add(scrollpane, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException,
            UnsupportedLookAndFeelException {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestTable2().initUI();
            }
        });
    }

}

:

Result

+5
Is it really possible to change part of the text to be a different color

,

  • JTextField/JTextArea Renderers component

  • Highlighter JTextPane Renderers component

  • () , Html ( Java up to Html3.2)

+2

,

:

  • Get the default cell rendering component using a function getTableCellRendererComponent()with the appropriate parameters.

  • analyze cell text and apply formatting using the function setForeground().

+1
source

Yes it is possible.
EDIT
First you need to create a subclass DefaultTableCellRendererwhere you redefine the method getTableCellRendererComponentto render the desired column according to your needs. And then change the renderer for this column by subclass DefaultTableCellRenderer.
Here is an example to achieve this:

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
import java.util.*;
public class TableExample extends JFrame
{
    JTable myTable ;
    Object[][] data= {
                    {"34","[56],987,[(56)]"},
                    {"5098","345,([{78}])"},
                    {"567","4312"}
                };
    Object[] col = {"First","Second"};
    public TableExample()
    {
        super("CellRendererExample");
    }
    public void prepareAndShowGUI()
    {
        myTable = new JTable(data,col);
        myTable.getColumnModel().getColumn(1).setCellRenderer(new MyTableCellRenderer());
        JScrollPane jsp = new JScrollPane(myTable);
        getContentPane().add(jsp);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }
    public class MyTableCellRenderer extends DefaultTableCellRenderer 
    {
        public Component getTableCellRendererComponent(JTable table,Object oValue, boolean isSelected, boolean hasFocus, int row, int column) 
        {
            Component c = super.getTableCellRendererComponent(table, oValue,isSelected, hasFocus,row, column);
            String value = (String)oValue;
            StringBuilder sBuilder = new StringBuilder();
            sBuilder.append("<HTML><BODY>");
            StringTokenizer tokenizer = new StringTokenizer(value,",");
            while (tokenizer.hasMoreTokens())
            {
                String token = tokenizer.nextToken();
                int index = token.indexOf("[");
                if (index != -1)
                {
                    sBuilder.append(token.substring(0,index));
                    int lastIndex = token.lastIndexOf(']');
                    String subValue = token.substring(index + 1,lastIndex);
                    sBuilder.append("[<FONT color = red>"+subValue+"</FONT>]");
                    if (lastIndex < token.length() -1)
                    {
                        sBuilder.append(token.substring(lastIndex+1,token.length()));
                    }
                    sBuilder.append(",");
                }
                else
                {
                    sBuilder.append(token+",");
                }
            }
            if (sBuilder.lastIndexOf(",") == sBuilder.length() - 1)
            {
                sBuilder.deleteCharAt(sBuilder.length() - 1 );
            }
            sBuilder.append("</BODY></HTML>");
            value = sBuilder.toString(); ;
            JLabel label =(JLabel)c;
            label.setText(value);
            return label;
        }
    }
    public static void main(String st[])
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                TableExample tae = new TableExample();
                tae.prepareAndShowGUI();
            }
        });
    }

}
0
source

All Articles