簡體   English   中英

更改JTable的特定單元格中的字體顏色?

[英]Change the font color in a specific cell of a JTable?

在開始之前,我已經查看了一些解決方案和文檔。 我似乎無法弄清楚為什么我的代碼無法按照我認為的方式工作。 我已經擴展了DefaultTableCellRenderer,但是我不相信它正在被應用-否則我會將事情弄亂了。

以下是發布此問題之前我調查過的主題/網站:

我意識到第一個鏈接使用HTML來更改字體顏色,但是我認為我的處理方式應該會產生相同的結果。

為了使那些想幫助我解決問題的人更輕松,我創建了一個SSCCE。

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;


public class TableTest {

    private static final int IMPORTANT_COLUMN = 2;

    public static void createAndShowGUI() {
        Object[][] data = new Object[2][4];
        //create sample data
        String[] realRowData = { "1", "One", "1.0.2", "compile" };
        String[] fakeRowData = { "2", "Two", "1.3.2-FAKE", "compile" };
        //populate sample data
        for(int i = 0; i < realRowData.length; i++) {
            data[0][i] = realRowData[i];
            data[1][i] = fakeRowData[i];
        }

        //set up tableModel
        JTable table = new JTable();
        table.setModel(new DefaultTableModel(data, 
                new String[] { "ID #", "Group #", "version", "Action" }) 

            {
                Class[] types = new Class[] {
                    Integer.class, String.class, String.class, String.class
                };

                boolean[] editable = new boolean[] {
                    false, false, true, false  
                };

                @Override
                public Class getColumnClass(int columnIndex) {
                    return types[columnIndex];
                }

                @Override
                public boolean isCellEditable(int rowIndex, int columnIndex) {
                    return editable[columnIndex];
                }
            });

        //set custom renderer on table
        table.setDefaultRenderer(String.class, new CustomTableRenderer());

        //create frame to place table
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setMinimumSize(new Dimension(400, 400));
        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setViewportView(table);
        f.add(scrollPane);
        f.pack();
        f.setVisible(true);

    }

    //MAIN
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                createAndShowGUI();
            }
        });
    }

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

            String versionVal = table.getValueAt(row, IMPORTANT_COLUMN).toString();

            if(versionVal.contains("FAKE")) {
                //set to red bold font
                c.setForeground(Color.RED);
                c.setFont(new Font("Dialog", Font.BOLD, 12));
            } else {
                //stay at default
                c.setForeground(Color.BLACK);
                c.setFont(new Font("Dialog", Font.PLAIN, 12));
            }
            return c;
        }

    }
}

我的目標是突出顯示版本欄中包含紅色粗體字FAKE所有值。

我已經擴展了DefaultTableCellRenderer,但是我不相信它已被應用

一些簡單的調試技巧:

  1. 將簡單的System.out.println(...)添加到您認為應調用的方法中
  2. 覆蓋方法時,請確保使用@Override批注(在TableModel類中使用了它,但在渲染器類中沒有使用過)。

您的問題是鍵入錯誤,因為您沒有覆蓋正確的方法:

    @Override
    // public Component getTableCellRenderer(...) // this is wrong
    public Component getTableCellRendererComponent(...)

覆蓋注釋將顯示一條編譯消息。 在更改代碼之前嘗試一下。

同樣,您的第一列也不是Integer類。 僅因為它包含整數的字符串表示形式,並不會使它成為整數。 您需要向模型添加一個Integer對象。

將您的自定義表格單元格rendere替換為以下內容。

解釋在注釋中。 基本上,您應該重寫getTableCellRendererComponent然后檢查是否有正確的列(可能有其他方法代替檢查標題值),然后根據顏色設置單元格。

如果不是您想要的列,請不要忘記將last else塊設置為默認顏色。

//Custom DefaultTableCellRenderer
public static class CustomTableRenderer extends DefaultTableCellRenderer {

    // You should override getTableCellRendererComponent
    @Override
    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);

        // Check the column name, if it is "version"
        if (table.getColumnName(column).compareToIgnoreCase("version") == 0) {
            // You know version column includes string
            String versionVal = (String) value;

            if (versionVal.contains("FAKE")) {
                //set to red bold font
                c.setForeground(Color.RED);
                c.setFont(new Font("Dialog", Font.BOLD, 12));
            } else {
                //stay at default
                c.setForeground(Color.BLACK);
                c.setFont(new Font("Dialog", Font.PLAIN, 12));
            }
        } else {
            // Here you should also stay at default
            //stay at default
            c.setForeground(Color.BLACK);
            c.setFont(new Font("Dialog", Font.PLAIN, 12));
        }
        return c;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM