代码之家  ›  专栏  ›  技术社区  ›  exhuma

在具有自定义行背景色的JTable中使用intercellSpacing会导致意外结果

  •  3
  • exhuma  · 技术社区  · 15 年前

    public class MyTable extends JTable {
    
        private List<RefData> data = null;
    
        public List<RefData> getData() {
            return data;
        }
    
        public void setData(List<RefData> data) {
            this.data = data;
        }
    
        @Override
        public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
            Component comp = super.prepareRenderer(renderer, row, column);
    
            if (this.data == null || row < 0 || row > this.data.size()-1){
                return comp;
            }
    
            RefData rowData = this.data.get(row);
            if (rowData.getStatus() < 3000){
                comp.setBackground(Color.YELLOW);
            } else {
                comp.setBackground(Color.WHITE);
            }
    
            return comp;
        }
    
    }
    

    所有这一切都很有魅力,我得到了我想要的。接下来,在查看生成的GUI时,我意识到表看起来过于精简。一切看起来都挤在一起了。与默认JTable设置一样;)

    好吧,这很容易解决,我想:

    myTable.setIntercellSpacing(new java.awt.Dimension(10, 1));
    

    现在,细胞间距很好 ,添加的单元格边距现在是默认的表格背景色,在我的例子中是白色。这看起来很难看。

    我假设单元格间距增加了单元格边框和prepareRenderer返回的组件之间的间距。这可以解释结果。但是我怎样才能让它改变细胞本身的背景呢?

    prepareRenderer 解决方案不适合此任务?或者还有别的办法?

    3 回复  |  直到 15 年前
        1
  •  3
  •   Denis Tulskiy    15 年前

    边界方法是正确的,但最好使用单元格渲染器,而不是 prepareRenderer() 方法:

        JTable.setDefaultRenderer(Object.class, new DefaultCellRenderer() {
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                JComponent component = (JComponent) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                component.setBorder(...);
                return component;
            }
        });
    
        2
  •  3
  •   Community Mohan Dere    9 年前

    超越 prepareRenderer() 具有应用于所有单元格的优点,并且“内部实现总是使用此方法来准备呈现程序,以便此默认行为可以被子类安全地重写。”即使以后使用 setDefaultRenderer() 对于一个特定的类。

    Table Row Rendering 与此相关 answer .

        3
  •  1
  •   exhuma    15 年前

    正确的 请在机翼上做?

    public class MyTable extends JTable {
    
        // [snip]
    
        private Border paddingBorder = BorderFactory.createEmptyBorder(2, 3, 2, 3);
    
        // [snip]
    
        @Override
        public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
            Component comp = super.prepareRenderer(renderer, row, column);
    
            if (JComponent.class.isInstance(comp)){
                ((JComponent)comp).setBorder(paddingBorder);
            }
    
            // [snip]
        }
    
        // [snip]
    
    }