java JTable怎么设置每个网格颜色 做了一个酒店管理系统 每一个网格都代表一个房间 当点击某个房间后 设置该网格颜色为XX,并获取该网格所代表的房间号~~现在就差填入数据了
                                     谢谢 各位大牛

解决方案 »

  1.   

    哦 对了 还有个问题 怎么给JTable遍历填入数据,以前JSP是遍历就可以了 但是JTable第一次用 怎么才能遍历到对应的表格中呢?
      

  2.   

    for循环数据用DefaultTableModel装放到JTabel中。
      

  3.   


    package com.jctest.color;import java.awt.Color;
    import java.awt.Component;
    import java.awt.Dimension;  import java.util.Enumeration;import javax.swing.JTable;
    import javax.swing.RowSorter;
    import javax.swing.table.DefaultTableCellRenderer;import javax.swing.table.JTableHeader;
    import javax.swing.table.TableColumn;
    import javax.swing.table.TableColumnModel;
    import javax.swing.table.TableModel;
    import javax.swing.table.TableRowSorter;/**
    * 本类实现了对JTable颜色的控制,提供了两套方案:
    * 1.实现了表格行两种颜色交替的效果
    * 2.实现了用一个控制颜色的字符串数组来设置所对应行的颜色
    * 本文件与PlanetTable.java文件相配合使用
    * @author Sidney
    * @version 1.0 (2008-1-14)
    */
    public class StyleTable extends JTable 
    {
        private String[] color = null; //用于设定行颜色的数组    public StyleTable() 
        {
            super();
        }    public StyleTable(Object[][] rowData, Object[] columnNames) 
        {
            super(rowData, columnNames);
            paintRow(); //将奇偶行分别设置为不同颜色
            
            //setFixColumnWidth(this); //固定表格的列宽
            
            //通过点击表头来排序列中数据resort data by clicking table header
            RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(this.getModel());
            this.setRowSorter(sorter);
            
            this.setIntercellSpacing(new Dimension(5,5)); //设置数据与单元格边框的眉边距
            
            //根据单元内的数据内容自动调整列宽resize column width accordng to content of cell automatically
            fitTableColumns(this);
        }    public StyleTable(Object[][] rowData, Object[] columnNames, String[] color) 
        {
            super(rowData, columnNames);
            this.color = color;
            paintColorRow();
            
            setFixColumnWidth(this);
            
            RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(this.getModel());
            this.setRowSorter(sorter);
            
            this.setIntercellSpacing(new Dimension(5,5));
            
            fitTableColumns(this);
        }    /**
         * 根据color数组中相应字符串所表示的颜色来设置某行的颜色,注意,JTable中可以对列进行整体操作
         * 而无法对行进行整体操作,故设置行颜色实际上是逐列地设置该行所有单元格的颜色。
         */
        public void paintRow() 
        {
            TableColumnModel tcm = this.getColumnModel();
            for (int i = 0, n = tcm.getColumnCount(); i < n; i++) 
            {
                TableColumn tc = tcm.getColumn(i);
                tc.setCellRenderer(new RowRenderer());
            }
        }    public void paintColorRow() 
        {
            TableColumnModel tcm = this.getColumnModel();
            for (int i = 0, n = tcm.getColumnCount(); i < n; i++) 
            {
                TableColumn tc = tcm.getColumn(i);
                tc.setCellRenderer(new RowColorRenderer());
            }
        }    /**
         * 将列设置为固定宽度。//fix table column width
         *
         */
        public void setFixColumnWidth(JTable table)
        {
            //this.setRowHeight(30);
            this.setAutoResizeMode(table.AUTO_RESIZE_OFF);
            /**/
            //The following code can be used to fix table column width
            TableColumnModel tcm = table.getTableHeader().getColumnModel();
            for (int i = 0; i < tcm.getColumnCount(); i++) 
            {
                TableColumn tc = tcm.getColumn(i);
                tc.setPreferredWidth(50);
                // tc.setMinWidth(100);
                tc.setMaxWidth(50);
            }
        }
        
        /**
         * 根据数据内容自动调整列宽。//resize column width automatically
         *
         */
        public void fitTableColumns(JTable myTable)
        {
             myTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
             JTableHeader header = myTable.getTableHeader();
             int rowCount = myTable.getRowCount();
             Enumeration columns = myTable.getColumnModel().getColumns();
             while(columns.hasMoreElements())
             {
                 TableColumn column = (TableColumn)columns.nextElement();
                 int col = header.getColumnModel().getColumnIndex(column.getIdentifier());
                 int width = (int)header.getDefaultRenderer().getTableCellRendererComponent
                 (myTable, column.getIdentifier(), false, false, -1, col).getPreferredSize().getWidth();
                 for(int row = 0; row < rowCount; row++)
                 {
                     int preferedWidth = (int)myTable.getCellRenderer(row, col).getTableCellRendererComponent
                     (myTable, myTable.getValueAt(row, col), false, false, row, col).getPreferredSize().getWidth();
                     width = Math.max(width, preferedWidth);
                 }
                 header.setResizingColumn(column); // 此行很重要
                 column.setWidth(width+myTable.getIntercellSpacing().width);
             }
        }
        
        /**
         * 定义内部类,用于控制单元格颜色,每两行颜色相间,本类中定义为蓝色和绿色。
         *
         * @author Sidney
         *
         */
        private class RowRenderer extends DefaultTableCellRenderer 
        {
            public Component getTableCellRendererComponent(JTable t, Object value,
                        boolean isSelected, boolean hasFocus, int row, int column) 
            {
                //设置奇偶行的背景色,可在此根据需要进行修改
                if (row % 2 == 0)
                    setBackground(Color.BLUE);
                else
                    setBackground(Color.GREEN);
       
                return super.getTableCellRendererComponent(t, value, isSelected,
                        hasFocus, row, column);
            }
        }    /**
         * 定义内部类,可根据一个指定字符串数组来设置对应行的背景色
         *
         * @author Sidney
         *
         */
        private class RowColorRenderer extends DefaultTableCellRenderer 
        {
            public Component getTableCellRendererComponent(JTable t, Object value,
                        boolean isSelected, boolean hasFocus, int row, int column) 
            {
                //分支判断条件可根据需要进行修改
                if (color[row].trim().equals("E")) 
                {
                    setBackground(Color.RED);
                } 
                else if (color[row].trim().equals("H")) 
                {
                    setBackground(Color.CYAN);
                } 
                else if (color[row].trim().equals("A")) 
                {
                    setBackground(Color.BLUE);
                } 
                else if (color[row].trim().equals("F")) 
                {
                    setBackground(Color.ORANGE);
                } 
                else 
                {
                    setBackground(Color.WHITE);
                }
       
                return super.getTableCellRendererComponent(t, value, isSelected,
                        hasFocus, row, column);
            }
        }
    }
    测试类
    package com.jctest.color;//(2)PlanetTable.java文件用于利用上面的实现展示功能。import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener; 
    //
    //
    //
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    /**
    * 本类为JTable一个简单应用,实现了JTable的行颜色设置及表格的打印功能
    * 本文件与StyleTable.java文件相配合使用
    */
    public class PlanetTable 
    {
      public static void main(String[] args) 
      {
          JFrame frame = new PlanetTableFrame();
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.setVisible(true);
      }
    }class PlanetTableFrame extends JFrame 
    {
      private Object[][] cells = {
              { "Mercury", new Double(2440.0), new Integer(0),
                new Boolean(false), Color.yellow },
              { "Venus", new Double(60520.0), new Integer(0), new Boolean(false),
                Color.yellow },
              { "Earth", new Double(6378.0), new Integer(1), new Boolean(false),
                Color.blue },
              { "Mars", new Double(3397.0), new Integer(2), new Boolean(false),
                Color.red },
              { "Jupiter", new Double(71492.0), new Integer(16),
                new Boolean(false), Color.orange } };  private String[] columnNames = { "Planet", "Radius", "Moons", "Gaseous",
              "Color" };
    //
      private static final int DEFAULT_WIDTH = 400;
      private static final int DEFAULT_HEIGHT = 200;
      
      public PlanetTableFrame() 
      {
          // 用于控制每一行颜色的数组
          String[] color = { "H", "A", "F", "E", "W" };      setTitle("PlanetTable");
          setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
          // 定义JTable,实例成自己扩展的JTable类,并传入用于设定颜色的数组
          //final JTable table = new StyleTable(cells, columnNames, color);
          // 下面这行代码可实现相邻两行颜色交替的效果,注意与上一行的区别
           final JTable table = new StyleTable(cells, columnNames);
          add(new JScrollPane(table), BorderLayout.CENTER);
          
          JButton printButton = new JButton("Print");
          printButton.addActionListener(new ActionListener() {
              public void actionPerformed(ActionEvent event) 
              {
                  try {
                          table.print();
                  } catch (java.awt.print.PrinterException e) {
                      e.printStackTrace();
                  }
              }
          });
          JPanel buttonPanel = new JPanel();
          buttonPanel.add(printButton);
          add(buttonPanel, BorderLayout.SOUTH);
      }
    }
      

  4.   

    http://image.baidu.com/i?ct=503316480&z=0&tn=baiduimagedetail&word=%BE%C6%B5%EA%B9%DC%C0%ED%CF%B5%CD%B3&in=1498&cl=2&lm=-1&st=-1&pn=12&rn=1&di=44718588675&ln=1962&fr=&fm=index&fmq=1330324203621_R&ic=&s=0&se=&sme=0&tab=&width=&height=&face=&is=&istype=2#pn13&-1&di83760022800&objURLhttp%3A%2F%2Fwww.lllufh.com%2Fupimages%2F2007-11%2F2007112538641737.JPG&fromURLhttp%3A%2F%2Fwww.lllufh.com%2Fsoftware%2Fcatalog24%2F149.html&W1024&H768&T8697&S132&TPjpg
      

  5.   

    这段代码可以实现,你自己根据需要改点东西,就是当点击了哪个单元格后,那个单元格就变色,其它的不变色,下面代码很容易看懂的,结贴吧!public class TrafficInfoTable extends JTable {
      static class TrafficInfoTableCellRenderer extends DefaultTableCellRendere..
      // static final Color RED = new Color(240, 0, 0);
      static final Color YELLOW = new Color(255, 255, 204);
      static final Color BLUE = new Color(195, 217, 255);
      public Component getTableCellRendererComponent(JTable table,
      Object value, boolean isSelected, boolean hasFocus, int row,
      int column) {
      // TODO Auto-generated method stub
      Color foreground, background;
      if (isSelected) {
      foreground = Color.black;
      background = BLUE;
      } else {
      if (row % 2 == 0) {
      foreground = Color.BLACK;
    background = YELLOW;
      } else {
      foreground = Color.BLACK;
      background = Color.WHITE;
    }
      }
      

  6.   

    你这一段代码我看得懂 但是我想问的主要是 你的isSelected在哪里设为True?初始肯定是false 。在监听里设为true么?但是我查API了 没有单个表格的监听!只有:public interface ListSelectionListenerextends EventListener列表选择值发生更改时收到通知的侦听器。 另请参见:
    ListSelectionModelpublic interface TableModelListenerextends EventListenerTableModelListener 定义侦听 TableModel 中更改的对象的接口。 另请参见:
    TableModel但是我试过这俩个了,没用啊 有这个的例子么? 主要是监听然后获得所点击表格 更改颜色 遍历那些我会。
      

  7.   

    百度搜【JTable 操作单元格 行 列】,这是我自己搞出来的,呵呵
      

  8.   

    Swing支持html的
    在JTable单元格内写HTML改变背景颜色
    例如设置字体颜色是:
    <html><font color='red'>红色</font></html>