java - Swing - 是否可以在 JTable 单元格中设置 'specific' 文本的字体颜色?

标签 java swing user-interface fonts awt

我有一个 JTable,其中一列以下列格式显示值:

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

我想知道是否可以用红色显示方括号内的值?

过去几天我一直在谷歌上搜索,发现了几个示例,展示了如何设置单元格的“背景”,但没有真正说明如何更改单元格的字体,尤其是文本的特定部分。

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

是否真的可以将部分文本更改为不同的颜色(即方括号内的文本)。

编辑

我作为示例显示的文本是表格单元格中显示的实际文本(逗号分隔符不代表列)。单元格中显示的文本是逗号分隔的字符串,我显示在表格的第 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)]

最佳答案

您必须结合使用 Cell 渲染器和 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

关于java - Swing - 是否可以在 JTable 单元格中设置 'specific' 文本的字体颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14546968/

相关文章:

asp.net-mvc-3 - 如何为下拉列表使用数据注释?

java - 使用 Spring Data Solr 提升多个字段的一个值

java - 使用 Log4J 属性文件免除给定类不写入我的日志文件的义务

java - java如何区分Lambda中的Callable和Runnable?

Java 玻璃面板

java - Swing JTabbedPane 中的外观未更新

wcf - 如何从 MessageHeaderInfo 中获取值

java - 如何用swing绘制 'biohazard'

java - 何时使用 JFrame 或 JPanel

java - 如何在 Android 应用程序中阻止或改善横向 View