2017-02-11 62 views
0

我想改变JTable中某些单元格的颜色。我试图在一个简单的例子中覆盖getTableCellRendererComponent,它很好。但是,当我做同样的在我的项目没有什么变化......用getTableCellRendererComponent改变颜色JTable单元没有问题

我有我的JPanel与我的JTable在一个盒子这样的:

boxTable=Box.createHorizontalBox(); 
box2Table.add(boxTable); 

//JTable      
tablaContador = new JTable(datosContador,cabeceraContador); 

//MODIF COLOR 
tablaContador.setDefaultRenderer(Object.class, new ColorRenderer()); 

这样做:

System.out.println(tablaContador.getColumnClass(3)); 

我可以知道setDefaultRenderer的第一个参数是Object.class 我不知道问题是否在这里...我只有表中的字符串,但我已经尝试过String.class,没有任何反应

然后我修改JTable中的细胞的一些事情:

tablaContador.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
boxTable.add(tablaContador); 


//Align cells 
for (int i=0; i<cabeceraContador.length;i++){ 
tablaContador.getColumnModel().getColumn(i).setCellRenderer(alinearCeldas); 
       } 

//Modify cells' width 
tablaContador.getColumnModel().getColumn(0).setMinWidth(150); 
for (int i=1; i<cabeceraContador.length;i++){ 
    tablaContador.getColumnModel().getColumn(i).setMaxWidth(40); 
} 

//Scroll for the Table 
scrollContador=new JScrollPane(tablaContador,JScrollPane.VERTICAL_SCROLLBAR_NEVER,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 

scrollContador.setPreferredSize(new Dimension(1000,80)); 
scrollContador.setMinimumSize(new Dimension(1000,80)); 
scrollContador.setMaximumSize(new Dimension(2000,80)); 

//Add scroll to the box   
box2Table.add(scrollContador); 

而且我ColorRenderer类:

public class ColorRenderer extends DefaultTableCellRenderer{ 

    private Component c; 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row, int column) { 

     c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 


     c.setBackground(Color.BLUE);    


     return c; 
    } 


} 

Table result

因此它不会在我的项目工作,我不知道为什么

有什么想法吗?

thaks!

+1

为了获得最佳的帮助,请认真考虑你的问题创建和发布有效的[MCVE]/[SSCCE](http://sscce.org )。这让我们完全理解你的代码和你的问题确实有很大的不同。 –

+0

此问题最初是作为以下副本而封闭的:http://stackoverflow.com/questions/18253881/custom-tablecellrenderer-treetablecellrenderer-doesnt-render-table-cells。我不相信它是重复的,因为这个渲染器“扩展”了DefaultTableCellRenderer(不透明),而另一个问题“实现”了TableCellRenderer,在这种情况下,您确实需要担心使标签不透明。 – camickr

+1

@HovercraftFullOfEels,'你是否让自定义渲染器不透明...默认情况下不是', - 默认情况下DefaultTableCellRenderer是不透明的。 – camickr

回答

2

我看到:

tablaContador.setDefaultRenderer(Object.class, new ColorRenderer()); 

,然后我看到:

for (int i=0; i<cabeceraContador.length;i++) 
{ 
    tablaContador.getColumnModel().getColumn(i).setCellRenderer(alinearCeldas); 
} 

渲染到一个特定的列分配的优先级高于设置的默认渲染所以从来没用过你的色彩渲染。

不完全是你想要做的,但我想你需要将颜色渲染逻辑添加到对齐渲染器。换句话说,所有的渲染逻辑必须包含在一个渲染器中。你不能合并多个渲染器。

这里是一个自定义渲染的一个简单的例子:

import java.awt.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class TableRenderer extends JPanel 
{ 
    public TableRenderer() 
    { 
     String[] columnNames = {"String", "Integer"}; 
     Object[][] data = 
     { 
      {"A", new Integer(1)}, 
      {"B", new Integer(2)}, 
      {"C", new Integer(10)}, 
      {"D", new Integer(4)} 
     }; 

     DefaultTableModel model = new DefaultTableModel(data, columnNames); 
     JTable table = new JTable(model); 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     JScrollPane scrollPane = new JScrollPane(table); 
     add(scrollPane); 

     // Override default renderer on a specific column 

     TableCellRenderer colorRenderer = new ColorRenderer(); 
     table.getColumnModel().getColumn(1).setCellRenderer(colorRenderer); 
    } 

    /* 
    ** Color the focused cell 
    */ 
    class ColorRenderer extends DefaultTableCellRenderer 
    { 
     public ColorRenderer() 
     { 
      super(); 
      setHorizontalAlignment(JLabel.RIGHT); 
     } 

     @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 (isSelected) 
       setBackground(table.getSelectionBackground()); 
      else 
      { 
       setBackground(null); 

       try 
       { 
        int number = Integer.parseInt(value.toString()); 

        if (number > 9) 
         setBackground(Color.RED); 
       } 
       catch(Exception e) {} 
      } 

      return this; 
     } 
    } 

    private static void createAndShowGUI() 
    { 
     JFrame frame = new JFrame("Color Renderer"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new TableRenderer()); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(() -> createAndShowGUI()); 
/* 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
*/ 
    } 
} 
+0

谢谢我的朋友!这是关键...现在是固定的 – pctripsesp