特定行和列的自定义单元格渲染器 [英] custom cell renderer for particular row and column

查看:44
本文介绍了特定行和列的自定义单元格渲染器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

puuuuuuf,我开始喜欢swing :)我正在尝试编写一个cellRenderer来自定义呈现第一行和第一列以外的所有单元格.所以我写了以下内容:

puuuuuuf, I'm starting to like swing :) I'm trying to write a cellRenderer to customy render all cells besides those which in first row and column. So I wrote the following:

public class CustomTableCellRenderer extends DefaultTableCellRenderer {
        public Component getTableCellRendererComponent(JTable table, Object obj, boolean isSelected, boolean hasFocus, int row, int column) {
            Component cell = super.getTableCellRendererComponent(table, obj, isSelected, hasFocus, row, column);

            if(row >0&&column>0){
                cell.setBackground(Color.GREEN);
            }

            return cell;
        }
    }

并将渲染器设置如下:

scheduleTable.setDefaultRenderer(Object.class, new CustomTableCellRenderer()); 

但是由于某种原因,这种方法将渲染器应用于所有单元.所以他们都是绿色的.如果我做错了事,请您帮我一下吗?

but for some reason such an approach applies renderer to all the cell. So all of them are Green. If I'm doing something wrong, could you help me with that please?

提前谢谢!

scheduleTable = new JTable() {
                    @Override
                    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                        Component comp = super.prepareRenderer(renderer, row, column);
                        int modelRow = convertRowIndexToModel(row);
                        int modelColumn = convertColumnIndexToModel(column);
                        if (modelColumn != 0 && modelRow != 0) {
                            comp.setBackground(Color.GREEN);
                        }
                        return comp;
                    }
                };  

此代码也使所有表变为绿色.

this code makes all the table green as well.

此代码:

scheduleTable = new JTable(tableModel) {
                    @Override
                    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                        Component comp = super.prepareRenderer(renderer, row, column);
                        int modelRow = convertRowIndexToModel(row);
                        int modelColumn = convertColumnIndexToModel(column);

                            if (modelRow != 0 && modelColumn != 0) {
                                setBackground(Color.GREEN);
                            } else {
                                setBackground(Color.WHITE);
                            }

                        return comp;
                    }
                };

给我以下结果;(

gives me the following result ;(

以下情况与表达式row != 0 && column != 0中的n不同:

The following situations I have with differents n in expression row != 0 && column != 0:

推荐答案

  • 您可以使用 prepareRenderer ,它比XxxCellRenderer

    伟大的代码示例是表格行呈现 @camickr

    great code example is Table Row Rendering by @camickr

    if (modelColumn != 0 || modelRow != 0) {
    

    以及if (modelColumn != 0 && modelRow != 0) {

    来自代码

    import java.awt.*;
    import java.awt.font.TextAttribute;
    import java.util.Map;
    import javax.swing.*;
    import javax.swing.border.Border;
    import javax.swing.border.CompoundBorder;
    import javax.swing.border.EmptyBorder;
    import javax.swing.border.MatteBorder;
    import javax.swing.table.*;
    
    public class TablePrepareRenderer extends JFrame {
    
        private static final long serialVersionUID = 1L;
        private JTable table;
    
        public TablePrepareRenderer() {
            Object[] columnNames = {"Type", "Company", "Shares", "Price", "Boolean"};
            Object[][] data = {
                {"Buy", "IBM", new Integer(1000), new Double(80.50), false},
                {"Sell", "MicroSoft", new Integer(2000), new Double(6.25), true},
                {"Sell", "Apple", new Integer(3000), new Double(7.35), true},
                {"Buy", "Nortel", new Integer(4000), new Double(20.00), false}
            };
            DefaultTableModel model = new DefaultTableModel(data, columnNames) {
    
                private static final long serialVersionUID = 1L;
    
                @Override
                public Class getColumnClass(int column) {
                    return getValueAt(0, column).getClass();
                }
            };
            table = new JTable(model) {
    
                private static final long serialVersionUID = 1L;
                private Border outside = new MatteBorder(1, 0, 1, 0, Color.red);
                private Border inside = new EmptyBorder(0, 1, 0, 1);
                private Border highlight = new CompoundBorder(outside, inside);
    
                @Override
                public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                    int modelRow = convertRowIndexToModel(row);
                    int modelColumn = convertColumnIndexToModel(column);
                    if (!isRowSelected(modelRow)) {
                        if (modelColumn != 0 || modelRow != 0) {
                            comp.setBackground(Color.GREEN);
                        } else {
                            comp.setBackground(table.getBackground());
                        }
                    }
                    return comp;
    
                    /*Component comp = super.prepareRenderer(renderer, row, column);
                    JComponent jc = (JComponent) comp;
                    Map attributes = (new Font("Serif", Font.PLAIN, 12)).getAttributes();
                    //attributes.put(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD);
                    attributes.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON);
                    if (!isRowSelected(row)) {
                    comp.setForeground(Color.black);
                    comp.setBackground(row % 2 == 0 ? Color.white : Color.orange);
                    int modelRow = convertRowIndexToModel(row);
                    String type = (String) getModel().getValueAt(modelRow, 0);
                    if (type.equals("Sell")) {
                    comp.setFont(new Font(attributes));
                    comp.setForeground(Color.red);
                    } else {
                    comp.setFont(new Font("Serif", Font.BOLD, 12));
                    }
                    } else {
                    comp.setFont(table.getFont());
                    }
                    jc.setBorder(BorderFactory.createCompoundBorder(jc.getBorder(), BorderFactory.createEmptyBorder(0, 0, 0, 5)));
                    return comp;*/
                }
            };
            table.setPreferredScrollableViewportSize(table.getPreferredSize());
            JScrollPane scrollPane = new JScrollPane(table);
            getContentPane().add(scrollPane);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    TablePrepareRenderer frame = new TablePrepareRenderer();
                    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    }
    

    这篇关于特定行和列的自定义单元格渲染器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆