栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

彩色表格单元格

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

彩色表格单元格

是否必须突出显示单元格的决定必须在TableCellRenderer中进行。它不能在JTable中进行。因此,(没有)没有理由要重写JTable中的方法。相反,您可以将列的CellRenderer设置为TableCellRenderer的自己实现。

在此示例中,列2和3接收“
ColoringCellRenderer”。如果此单元格中的值不为null且与列1中的值相同,则此ColoringCellRenderer将突出显示该单元格。

import java.awt.Color;import java.awt.Component;import javax.swing.Jframe;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.SwingUtilities;import javax.swing.table.DefaultTableCellRenderer;import javax.swing.table.DefaultTableModel;import javax.swing.table.TableColumn;public class ColoredTableCells{    public static void main(String[] args)    {        SwingUtilities.invokeLater(new Runnable()        { @Override public void run() {     createAndShowGUI(); }        });    }    private static void createAndShowGUI()    {        Jframe f = new Jframe();        f.getContentPane().add(new JScrollPane(createTable()));        f.pack();        f.setLocationRelativeTo(null);        f.setVisible(true);    }    static JTable createTable()    {        class ColoringTableCellRenderer extends DefaultTableCellRenderer        { ColoringTableCellRenderer() {     setOpaque(true); } @Override public Component getTableCellRendererComponent(JTable table,     Object value, boolean isSelected, boolean hasFocus, int row,     int column) {     super.getTableCellRendererComponent(         table, value, isSelected, hasFocus, row, column);     if (highlightCell(table, row, column))     {         setBackground(Color.CYAN);     }     else     {         setBackground(Color.WHITE);     }     return this; } private boolean highlightCell(JTable table, int row, int column) {     Object thisValue = table.getValueAt(row, column);     Object referencevalue = table.getValueAt(row, 1);     if (thisValue != null && referencevalue != null)     {         return thisValue.equals(referencevalue);     }     return false; }        }        JTable table = new JTable();        table.setModel(new DefaultTableModel(new Object[][] { { "Row1", "1", "2", "3" }, { "Row2", "2", "2", "3" }, { "Row3", "2", "2", "2" },  { "Row3", "2", "1", "2" } }, new String[] { "Header1", "Header2", "Header3", "Header4" }));        for (int i=2; i<table.getColumnCount(); i++)        { TableColumn column = table.getColumnModel().getColumn(i); column.setCellRenderer(new ColoringTableCellRenderer());        }        return table;    }}

编辑:答案已经被接受,但针对评论,一个不同的版本:

该类使用两个类“ DelegatingTableCellRenderer”和“
DelegatingTableCellEditor”。这些类各自接收各自的委托,并且仅设置委托所传递的单元格组件的背景色。

这样,着色表单元格(用于渲染器或编辑器)的功能就与实际渲染器分离了。因此,可以为默认的CellRenderer的背景着色(例如

Boolean
显示JCheckBox的值)。

import java.awt.Color;import java.awt.Component;import java.util.EventObject;import javax.swing.JComponent;import javax.swing.Jframe;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.SwingUtilities;import javax.swing.event.CellEditorListener;import javax.swing.table.DefaultTableCellRenderer;import javax.swing.table.DefaultTableModel;import javax.swing.table.TableCellEditor;import javax.swing.table.TableCellRenderer;public class ColoredTableCells2{    public static void main(String[] args)    {        SwingUtilities.invokeLater(new Runnable()        { @Override public void run() {     createAndShowGUI(); }        });    }    private static void createAndShowGUI()    {        Jframe f = new Jframe();        f.getContentPane().add(new JScrollPane(createTable()));        f.pack();        f.setLocationRelativeTo(null);        f.setVisible(true);    }    static JTable createTable()    {        JTable table = new JTable()        { @Override public Class<?> getColumnClass(int column)  {     if (column == 0)     {         return Object.class;     }     return Boolean.class; }        };        table.setDefaultEditor(Boolean.class,  new DelegatingTableCellEditor(table.getDefaultEditor(Boolean.class)));        table.setDefaultRenderer(Boolean.class,  new DelegatingTableCellRenderer(table.getDefaultRenderer(Boolean.class)));        table.setModel(new DefaultTableModel(new Object[][] { { "Row1", true,  false, true }, { "Row2", true,  true,  false }, { "Row3", false, false, true },  { "Row3", false, true,  false } }, new String[] { "Header1", "Header2", "Header3", "Header4" }));        return table;    }    static class DelegatingTableCellEditor implements TableCellEditor    {        private final TableCellEditor delegate;        DelegatingTableCellEditor(TableCellEditor delegate)        { this.delegate = delegate;        }        @Override        public Object getCellEditorValue()        { return delegate.getCellEditorValue();        }        @Override        public boolean isCellEditable(EventObject anEvent)        { return delegate.isCellEditable(anEvent);         }        @Override        public boolean shouldSelectCell(EventObject anEvent)        { return delegate.shouldSelectCell(anEvent);        }        @Override        public boolean stopCellEditing()        { return delegate.stopCellEditing();        }        @Override        public void cancelCellEditing()        { delegate.cancelCellEditing();        }        @Override        public void addCellEditorListener(CellEditorListener l)        { delegate.addCellEditorListener(l);        }        @Override        public void removeCellEditorListener(CellEditorListener l)        { delegate.removeCellEditorListener(l);        }        @Override        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)        { Component component =      delegate.getTableCellEditorComponent(         table, value, isSelected, row, column); if (component instanceof JComponent) {     JComponent c = (JComponent)component;     c.setOpaque(true); } if (highlightCell(table, row, column)) {     component.setBackground(Color.CYAN); } else {     component.setBackground(Color.WHITE); } return component;        }    }    static class DelegatingTableCellRenderer extends DefaultTableCellRenderer   {        private final TableCellRenderer delegate;        DelegatingTableCellRenderer(TableCellRenderer delegate)        { this.delegate = delegate;        }        @Override        public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)        { Component component =      delegate.getTableCellRendererComponent(         table, value, isSelected, hasFocus, row, column); if (component instanceof JComponent) {     JComponent c = (JComponent)component;     c.setOpaque(true); } if (highlightCell(table, row, column)) {     component.setBackground(Color.CYAN); } else {     component.setBackground(Color.WHITE); } return component;        }     }    private static boolean highlightCell(JTable table, int row, int column)    {        if (column == 1)        { return false;        }        Object thisValue = table.getModel().getValueAt(row, column);        Object referencevalue = table.getModel().getValueAt(row, 1);        if (thisValue != null && referencevalue != null)        { return thisValue.equals(referencevalue);        }        return false;    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/609835.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号