各位大侠,小弟初学swing,请各位指教
我想根据内容动态的设置单元格的字体颜色,比如“负值”显示为“红色”
需要说明的是:只想动态改变某一个单元格(第 i 行,第 j 列)的字体颜色,不是改变“一行”或者“一列”的颜色,设置“行”“列”的颜色已经解决了,呵呵
憋了一天也没有找到比较好的方法,请大虾们出手帮忙啊

解决方案 »

  1.   

    (*^__^*) 嘻嘻……
    我研究研究看看呀,好久没有用 Swing
      

  2.   

    jtData. getCellEditor(int row, int column).getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column).setFont(Font f); 
    对吗
      

  3.   

    to“zzjava”
    我试了,没有达到效果啊
    比如我想设置第0行第0列以“Dialog”显示“-1”,是下面这样的语句
    table. getCellEditor(0, 0).getTableCellEditorComponent(table,“-1”, true, 0, 0).new java.awt.Font("Dialog", 0, 12);
    不知道是不是参数设置错误啊?请详细解释一下
      

  4.   

    自己上网搜搜,写个cellRenderer就搞定了。
      

  5.   

    看看这个:import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.table.*;
    //主类
    @SuppressWarnings("unchecked")
    public class TryJTable extends JFrame 
    {
    private static final long serialVersionUID = 1L;
    //创建自定义表格模型对象
    MyTableModel dtm=new MyTableModel();
    //创建JTable对象
    JTable jt=new JTable(dtm);
    //将JTable封装进滚动窗格
    JScrollPane jsp=new JScrollPane(jt);
    //自定义的表格模型
    private class MyTableModel extends AbstractTableModel
    {

    private static final long serialVersionUID = 1L;
    //创建表示各个列类型的类型数组
    Class[] typeArray=
          {Object.class,Double.class,Boolean.class,Icon.class,Color.class};
    //创建列标题字符串数组
    String[] head={"Object","Number","Boolean","Icon","Color"};
    //创建初始表格数据
    Object[][] data={{"这里是字符串1",new Integer(20),new Boolean(true),
    new ImageIcon("D:/p1.gif "),Color.black},
    {"这里是字符串2",new Double(12.34),new Boolean(false),
    new ImageIcon("D:/p2.gif "),Color.darkGray},
    {"这里是字符串3",new Integer(125),new Boolean(true),
    new ImageIcon("D:/p3.gif"),Color.white}};
    //重写getColumnCount方法
    public int getColumnCount()
    {
    return head.length;
    }
    //重写getRowCount方法
    public int getRowCount()
    {
    return data.length;
    }
    //重写getColumnName方法
    public String getColumnName(int col)
    {
    return head[col];
    }
    //重写getValueAt方法
    public Object getValueAt(int r,int c)
    {
    return data[r][c];
    }
    //重写getColumnClass方法
    public Class getColumnClass(int c)
    {
    return typeArray[c];
    }
    //重写isCellEditable方法
    public boolean isCellEditable(int r,int c)
    {
    return true;
    }
    //重写setValueAt方法
    public void setValueAt(Object value,int r,int c)
    {
    data[r][c]=value;
    //
    this.fireTableCellUpdated(r,c);
    }
    }
    //自定义的绘制器
    private class MyCellRendererForColorClass 
    extends JLabel implements TableCellRenderer
    {
    private static final long serialVersionUID = 1L;
    //定义构造器
    public MyCellRendererForColorClass ()
    {
    //设置标签为不透明状态
    this.setOpaque(true);
    //设置标签的文本对齐方式为居中
    this.setHorizontalAlignment(JLabel.CENTER);
    }
    //实现获取呈现控件的getTableCellRendererComponent方法
    public Component getTableCellRendererComponent(JTable table,Object value,
                boolean isSelected,boolean hasFocus,int row,int column)
    {
    //获取要呈现的颜色
    Color c=(Color)value;
    //根据参数value设置背景色
    this.setBackground(c);
    //设置前景色为背景色反色
    this.setForeground(new Color(255-c.getRed()
                        ,255-c.getGreen(),255-c.getBlue()));
    //设置标签中显示RGB的值
    this.setText("["+c.getRed()+","+c.getGreen()+","+c.getBlue()+"]");
    //将自己返回
    return this;
    }
    }
    //声明Color类型的自定义编辑器
    class MyEditorForColorClass extends AbstractCellEditor 
    implements TableCellEditor,ActionListener
    {
    private static final long serialVersionUID = 1L;
    //定义Color变量
    Color c;
    //定义对话框变量
    JDialog jd;
    //创建一个按扭
    JButton jb=new JButton();
    //创建JColorChooser对象
    JColorChooser jcc=new JColorChooser();
    //声明一个常量
    public static final String EDIT="edit";
    //定义构造器
    public MyEditorForColorClass()
    {
    //为按扭注册监听器
    jb.addActionListener(this);
    //设置此按扭的动作命令
    jb.setActionCommand(EDIT);
    //获取颜色选择器
    jd=JColorChooser.createDialog(jb,"选择颜色",true,jcc,this,null);
    }
    //实现actionPerformed方法
    public void actionPerformed(ActionEvent e)
    {
    //测试获得的动作命令是否等于EDIT常量
    if(e.getActionCommand().equals(EDIT))
    {
    //设置按扭的背景颜色
    jb.setBackground(c);
    //设置前景色为背景色反色
    jb.setForeground(new Color(255-c.getRed()
                        ,255-c.getGreen(),255-c.getBlue()));
    //设置按钮中显示RGB的值
    jb.setText("["+c.getRed()+","+c.getGreen()+","+c.getBlue()+"]");

    //设置颜色选择器的颜色
    jcc.setColor(c);
    //设置颜色选择器可见
    jd.setVisible(true);
    //通知所有监听器,以延迟方式创建事件对象
    this.fireEditingStopped();
    }
    else
    {
    //获取颜色
    c=jcc.getColor();
    }
    }
    //定义getCellEditorValue方法返回颜色值
    public Object getCellEditorValue()
    {
    return c; 
    }
    //重写getTableCellEditorComponent方法
    public Component getTableCellEditorComponent(JTable table,
            Object value,boolean isSelected,int row,int column)
        {
         c=(Color)value;
         return jb;  
        }
    }
    //声明Icon类型的自定义编辑器
    class MyEditorForIconClass extends AbstractCellEditor 
    implements TableCellEditor,ActionListener
    {
    private static final long serialVersionUID = 1L;
    //定义Icon变量
    Icon icon;
    //创建一个按扭
    JButton jb=new JButton();
    //创建JColorChooser对象
    JFileChooser jfc=new JFileChooser();
    //声明一个常量
    public static final String EDIT="edit";
    //定义构造器
    public MyEditorForIconClass()
    {
    //为按扭注册监听器
    jb.addActionListener(this);
    //设置此按扭的动作命令
    jb.setActionCommand(EDIT);
    }
    //实现actionPerformed方法
    public void actionPerformed(ActionEvent e)
    {
    //测试获得的动作命令是否等于EDIT常量
    if(e.getActionCommand().equals(EDIT))
    {
    //设置按扭的图标
    jb.setIcon(icon);
    //显示文件选择器对话框
    jfc.showOpenDialog(jb);
    //获取新图片
    if(jfc.getSelectedFile()!=null)
    {
    icon=new ImageIcon(jfc.getSelectedFile().getAbsolutePath());
    }
    //通知所有监听器,以延迟方式创建事件对象
    this.fireEditingStopped();
    }
    }
    //定义getCellEditorValue方法返回图标
    public Object getCellEditorValue()
    {
    return icon; 
    }
    //重写getTableCellEditorComponent方法
    public Component getTableCellEditorComponent(JTable table,
            Object value,boolean isSelected,int row,int column)
        {
         icon=(Icon)value;
         return jb;  
        }
    }
    //构造器
    public TryJTable()
    {
    //设置表格每行的高度为30个像素
    jt.setRowHeight(30);
    //将含JTable的滚动窗格添加进窗体的中间
    this.add(jsp,BorderLayout.CENTER);
    //创建自定义的表格绘制器
    MyCellRendererForColorClass mcr=new MyCellRendererForColorClass();
    //向表格注册指定类型数据的绘制器
    jt.setDefaultRenderer(Color.class,mcr);
    //创建自定义的表格编辑器
    MyEditorForColorClass mefcc=new MyEditorForColorClass();
    MyEditorForIconClass mefic=new MyEditorForIconClass();
    //向表格注册指定类型数据的编辑器
    jt.setDefaultEditor(Color.class,mefcc);
    jt.setDefaultEditor(Icon.class,mefic);
    //设置窗体的关闭动作、标题、大小位置以及可见性
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setTitle("自定义表格绘制器与编辑器案例");
    this.setBounds(100,100,500,200);
    this.setVisible(true);
    }
    //主方法
    public static void main(String[] args)
    {
    //创建TryJTable窗体对象
    new TryJTable ();
    }
    }
      

  6.   

    to“fengzhou0920”
    你的code很好,调试成功了,非常感谢我也找到了另一种方法,大家指教啊
    //TableCellColor.java
    import javax.swing.*;
    import java.awt.*;
    import javax.swing.table.*;public class TableCellColor extends JFrame {
      String[] columnNames = {"第1列", "第2列", "第3列"};
      Object[][] data = {
          {
          "(1,1)", "(1,2)", "(1,3)"}
          , {
          "(2,1)", "(2,2)", "(2,3)"}
          , {
          "(3,1)", "(3,2)", "(3,3)"}
          , {
          "(4,1)", "(4,2)", "(4,3)"}
          ,
      };
      int r = 1, c = 0; //      用于控制变色区域
      public TableCellColor() {
        DefaultTableModel dtm = new DefaultTableModel(data, columnNames);
        JTable table = new JTable(dtm);
        table = new JTable(dtm) {      public Component prepareRenderer(TableCellRenderer renderer, int row,
                                           int column) {
            Component component = super.prepareRenderer(renderer, row, column);        if (row == r && column == c) {
              component.setBackground(Color.gray);
            }        return component;
          }
        };    JScrollPane scroll = new JScrollPane(table);
        this.setContentPane(scroll);
        this.setBounds(100, 50, 300, 150);
      }  public static void main(String arg[]) {
        TableCellColortes = new TableCellColor();
        tes.setVisible(true);
        tes.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      }
    }
      

  7.   

    给你说个思路吧 首先页面定义一下 JTABLE 和一个颜色选择器的按钮 接着假如用户点击了一个JTABEL中的一个框 然后选择颜色 这个时候先拿到用户点击JTABEL的那一格 然后取到COLOR控件的颜色 然后把这个颜色保存 再SET给刚才选择的那个JTABEL中的某一个框的颜色设置里面就可以了 试试吧 我做的一个报表里面有这个功能 给你贴 你看就要看N久 这个思路没问题 你自己摸索一下