2012-06-21 33 views
4

我想使用此代码颜色在jTable..i特定行这么做是为了列,着色JTable中排

private class CustomCellRenderer extends DefaultTableCellRenderer { 

/* (non-Javadoc) 
* @see  
javax.swing.table.DefaultTableCellRenderer#getTableCellRendererComponent(javax.swing.JTable, java.lang.Object, boolean, boolean, int, int) 
*/ 

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

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

//Set foreground color 
// rendererComp.setForeground(Color.red); 
//Set background color 
    rendererComp .setBackground(Color.pink); 

return rendererComp ; 
} 

} 

我呼吁使用上面的代码,

jTable1.getColumnModel().getColumn(3).setCellRenderer(new CustomCellRenderer()); 

但我想要对jTable中的行做同样的事情。在行的情况下没有getColumnModel()或getColumn()。那么做这些的替代方法是什么?我正在使用Java Swing在Netbeans中执行此操作..

回答

6

这里是你如何可以结合两种颜色列和行颜色的例子。您基本上在TableCellRenderer中执行测试以查看背景是否应该是一种颜色或另一种颜色。

import java.awt.Color; 
import java.awt.Component; 
import java.util.Enumeration; 
import java.util.Vector; 

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.TableCellRenderer; 
import javax.swing.table.TableColumn; 

public class TestTable { 

    public class MyTableCellRenderer extends DefaultTableCellRenderer implements TableCellRenderer { 

     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
      setBackground(null); 
      super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
      setText(String.valueOf(value)); 
      boolean interestingRow = row % 5 == 2; 
      boolean secondColumn = column == 1; 
      if (interestingRow && secondColumn) { 
       setBackground(Color.ORANGE); 
      } else if (interestingRow) { 
       setBackground(Color.YELLOW); 
      } else if (secondColumn) { 
       setBackground(Color.RED); 
      } 
      return this; 
     } 

    } 

    private JFrame f; 
    private JTable table; 

    protected void initUI() { 
     Vector<Vector<Object>> data = new Vector<Vector<Object>>(); 
     Vector<String> columNames = new Vector<String>(); 
     columNames.add("Col 0"); 
     columNames.add("Col 1"); 
     columNames.add("Col 2"); 
     for (int i = 0; i < 20; i++) { 
      Vector<Object> v = new Vector<Object>(); 
      v.add(i % 3 == 0 ? "Hello" : "World"); 
      v.add("Some data in row " + (i + 1)); 
      v.add("Some other data in row " + (i + 1)); 
      data.add(v); 
     } 
     table = new JTable(new DefaultTableModel(data, columNames)); 
     Enumeration<TableColumn> en = table.getColumnModel().getColumns(); 
     while (en.hasMoreElements()) { 
      TableColumn tc = en.nextElement(); 
      tc.setCellRenderer(new MyTableCellRenderer()); 
     } 
     f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setLocationRelativeTo(null); 
     f.add(new JScrollPane(table)); 
     f.pack(); 
     f.setVisible(true); 

    } 

    public static void main(String[] args) { 

     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TestTable().initUI(); 
      } 
     }); 
    } 

} 
+0

对(INT I = 0;我 Luna

+0

@Tickua我不确定我是否理解你的评论。在getTableCellRendereComponent方法中,您可以访问所有可能需要的信息:JTable,单元格的当前值以及表格(行和列)中单元格的位置,以及当前行是否被选中并且如果当前细胞被聚焦。从表中您还可以访问TableModel(table.getModel())。我认为从那里计算你想要的任何条件并设置适当的背景色应该是相当容易的。 –

+0

我知道..但我的问题是我如何通过指定我的第一行和第一列来调用方法getTableCellRendereComponent()..我试过这种方式也..最终CustomCellRenderer渲染器= new CustomCellRenderer(); ,renderer.getTableCellRendererComponent(jTable1,1,true,true,i,1); – Luna

0

这似乎是一种非常肮脏的处理方式。如果你使用layoutManager为你的包含器(我认为它必须是JFrame)使用一个gridLayout将是一个更好的主意。 U可以添加单个组件(JPanels,Jbuttons或任何其他JComponent)并使用paint()/ repaint()方法处理它们的外观。

编辑

OR你可以改变的getTableCellRendererComponent(....)方法来设置自定义背景颜色使用根据INT行嵌套的if-else语句或开关的情况下,INT列(作为参数提供)。

这会容易得多

+1

我不明白这是怎么弄脏的。相反,使用JTable来显示TableData实际上是一个好习惯。人们经常使用复杂的布局和面板来显示TableData。 –

+0

使用JTable是好的,但你应该实现接口TableCellRenderer而不是继承整个类 – vedant1811

+1

这将是什么意思?使用DefaultTableCellRenderer,您还可以自动获得适当的L&F相关颜色(不同L&F /平台上的背景选择颜色不同)。除非渲染实际上不是JLabel,而是更复杂的东西,否则我不明白为什么不重用已经存在的东西。 –

3

当你想改变整个行,而不管列类,考虑重写prepareRenderer(),所讨论的hereTableCellRendererprepareRenderer()方法是对比here