如题。这是我的代码,他只能给整行加颜色,而不能给某个格加。请大虾帮忙改一下,谢谢各位了!!package table;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import javax.swing.border.AbstractBorder;
import javax.swing.border.Border;
import javax.swing.plaf.basic.BasicBorders.FieldBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;/**
 * @author James Woo 2006-5-17 17:51:17 @
 */
public class Example {
private String[] headers = new String[] { "1", "2", "3" }; // private Object[][] values = new Object[][] {
// { "james", new Integer(333), new Boolean(true) },
// { "woo", new Integer(333), new Boolean(true) } };
private Object[][] values = new Object[][] { { "", "", "" }, { "", "", "" } }; public Example() {
DefaultTableModel tm = new DefaultTableModel(values, headers); JFrame f = new JFrame();
f.setSize(600, 160);
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); JTable jt = new JTable(tm); FieldBorder border = new FieldBorder(Color.WHITE, Color.WHITE,
Color.WHITE, Color.WHITE);
jt.setBorder(border); jt.setDefaultRenderer(Object.class, new TableCellRenderer() { public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
JTextField text = new JTextField(value.toString());
if (row == 0) { text.setBackground(Color.GREEN);
text.setForeground(Color.BLACK);
} else {
text.setBackground(Color.YELLOW);
text.setForeground(Color.CYAN); } return text;
} }); JScrollPane jsp = new JScrollPane(jt);
f.getContentPane().add(jsp, BorderLayout.CENTER);
f.setVisible(true);
} public static void main(String[] args) {
new Example();
String[] headers1 = new String[5]; for (int i = 0; i < headers1.length; i++) {
headers1[i] = i + 1 + "";
}
}
}

解决方案 »

  1.   

    还有一个问题:swing中可以像网页那样,table中套table吗?如果可以,那个数组应该怎么写?
      

  2.   

    第一个问题解决了,还有第二个问题,就是table中套table,有知道的吗?
      

  3.   

    package com.yyb.tool;import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.Toolkit;
    import java.util.Vector;import javax.swing.DefaultCellEditor;
    import javax.swing.JComponent;
    import javax.swing.JTable;
    import javax.swing.JTextField;
    import javax.swing.table.DefaultTableCellRenderer;
    import javax.swing.table.TableColumn;/**
     * @author it31 可以添加Component的JTable
     */
    public class ContainerTable extends JTable {
    private ContainerTableEditor ctEditor;
    private ContainerTableRender ctRender; public ContainerTable() {
    super();
    } public ContainerTable(Vector row, Vector column) {
    super(row, column);
    }

    /**
     * 当表中有数据更新时,保证新添加的控件能显示。 如果控件没正确显示,请确认是否调用了该方法。
     */
    public void addNotify() {
    if (ctEditor == null)
    ctEditor = new ContainerTableEditor();
    if (ctRender == null)
    ctRender = new ContainerTableRender();
    for (int i = 0; i < this.getColumnCount(); i++) {
    TableColumn tc = this.getColumn(this.getColumnName(i));
    tc.setCellEditor(ctEditor);
    tc.setCellRenderer(ctRender);
    }
    super.addNotify();
    } class ContainerTableEditor extends DefaultCellEditor {
    private Component com;
    private boolean isComponent; public ContainerTableEditor() {
    super(new JTextField());
    } /**
     * 设置编辑组件为实际的Component,同时记住此状态, 防止完成编辑后,此单元格内容还原为普通的value
     */
    public Component getTableCellEditorComponent(JTable table,
    Object value, boolean isSelected, int row, int column) {
    if (value instanceof Component) {
    com = (Component) value;
    isComponent = true;
    } else {
    com = super.getTableCellEditorComponent(table, value,
    isSelected, row, column);
    isComponent = false;
    }
    return com;
    } /**
     * 如果此单元格内容为Component则返回对应Component
     */
    public Object getCellEditorValue() {
    if (isComponent)
    return com;
    return super.getCellEditorValue();
    }
    } class ContainerTableRender extends DefaultTableCellRenderer {
    public Component getTableCellRendererComponent(JTable table,
    Object value, boolean isSelected, boolean hasFocus, int row,
    int column) {
    if (value instanceof Component) {
    return (Component) value;
    } else
    return super.getTableCellRendererComponent(table, value,
    isSelected, hasFocus, row, column);
    }
    }
    }缺点是要点两下才能获得焦点
      

  4.   

    就像做网页那样,网页的table元素中可以继续嵌套table元素,不知道swing能不能这样……
      

  5.   

    可以做到嵌套Table,使用Renderer实现。正常的数据还是 Object[][],只是在嵌套Table的单元格的Object仍然是Object[][]而已。或者可以使用单元格合并来实现嵌套表格的展现效果
      

  6.   

    这个就是可以放个jtable进去的table啊
    ContainerTable ct1=new ContainerTable();
    ct1.setModel(new javax.swing.table.DefaultTableModel(
    new Object [][] {
    {null, new JButton("Test"), null, null},
    {null, null,"asdas\nasdas\nasdas\n", null},
    {null, null, null, null},
    {null, null, null, null}
    },
    new String [] {
    "Title 1", "Title 2", "Title 3", "Title 4"
    }
    ));
    ContainerTable ct2=new ContainerTable();
    ct2.setModel(new javax.swing.table.DefaultTableModel(
    new Object [][] {
    {null, new JButton("Test"), null, null},
    {null, ct1,"asdas\nasdas\nasdas\n", null},
    {null, null, null, null},
    {null, null, null, null}
    },
    new String [] {
    "Title 1", "Title 2", "Title 3", "Title 4"
    }
    ));
      

  7.   

    5楼的是正解,给表格的单元格提供一个渲染器,去实现CellRenderer接口.