当前位置: 首页 > 知识库问答 >
问题:

Swing-是否可以在JTable单元格中设置“特定”文本的字体颜色?

凌成天
2023-03-14

我有一个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)]

共有3个答案

斜向文
2023-03-14
Is it really possible to change part of the text to be a different color

是的,有可能,对于

>

多个荧光灯必须将JTextPane作为Renderers组件

(更简单的方法)您可以使用Html(今天的Java到Html3.2)来格式化单元格

乜飞航
2023-03-14

这就是您要查找的单元渲染

如何进行:

>

  • 使用具有适当参数的getTableCellRendererComponent()函数获取默认单元格渲染组件。

    使用set前台()函数解析单元格文本并应用格式设置。

  • 杭柏
    2023-03-14

    必须使用结合超文本标记语言的单元格渲染器。

    下面是一个小演示示例:

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

    结果是:

     类似资料:
    • 在开始之前,我查看了一些解决方案和文档。我似乎不明白为什么我的代码没有按我认为应该的方式工作。我已经扩展了DefaultTableCellRenderer,但我不相信它正在被应用——否则我就把事情搞砸了。 以下是我在发布此问题之前查看过的帖子/网站: Swing-是否可以在JTable单元格中设置特定文本的字体颜色? JTable细胞渲染器 http://docs.oracle.com/javas

    • 问题内容: 我试图使自己熟悉JTables,TableModels,JTableHeaders,渲染器等。我试图制作一个简单的虚拟表(出于练习目的),看起来像这样: 我还希望B2单元格-并且只有该单元格-具有蓝色(Color.BLUE)背景-所有其他单元格都可以具有自动分配的Swing默认颜色。 我的代码在下面,并且基于我在本网站和整个互联网上发现的无数示例。但是我没有得到想要的结果。相反,我得到

    • 我只想在假设有一个值列表的单元格中添加一个JComboBox。下面是我的代码,但它在列中的所有单元格中添加了组合框。让我知道我的代码中缺少了什么,以便只在选定的单元格上设置组合框。

    • 问题内容: 在我的Java桌面应用程序中,我有一个包含3列的JavaFX表。我想将第三列的字体颜色设置为红色。我根本无法设置Tableb的字体颜色。我查看了CSS,但没有找到任何东西。有没有办法用CSS做到这一点?我还希望通过setFont()进行设置。空空如也。我什至无法找到在某个单元格上设置某些内容的方法。 我该怎么做?如何设置字体颜色?任何帮助将不胜感激。 问题答案: 您需要覆盖CellFa

    • 我试图在我的文档末尾设置一个新表,并根据我的规格将其格式化。但是背景色和文本色似乎不起作用。字体大小也不完全是我想要的,因为它适用于整个表格,而不仅仅是一个单元格。 这就是我到目前为止所做的: 我想要表格的第一行没有边框,字体14,粗体,灰色背景上的白色文本。

    • 我必须为JTextArea中选定的文本设置定义的颜色(像红色)。这就像是在文本区域(jTextArea)中突出显示进程。当我选择特定的文本并点击任何按钮时,它应该以预定义的颜色改变。