做个软件修改渲染器也不行无法设置单个单元格颜色(设置别的格之前的表格颜色不改变)。
界面源代码发下求大神解决:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;public class TableExample extends JFrame implements ActionListener{
private JScrollPane scrollPane;
private JPanel contentPane;
private JTable table;
private JPanel panel;
private JButton backgroundButton;
private JColorChooser jColorChooser;
static Vector<Cell> Cellvector=new Vector<Cell>();
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
TableExample frame = new TableExample();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
 * Create the frame.
 */
public TableExample() {
this.setTitle("JTable背景颜色设定练习");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 712, 541);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);

scrollPane = new JScrollPane();
contentPane.add(scrollPane, BorderLayout.CENTER);

table = new JTable();
scrollPane.setViewportView(table);

String[] Column={"第一列","第二列","第三列","第四列"};    //设定列名
DefaultTableModel TableModle=new DefaultTableModel();
TableModle.setColumnIdentifiers(Column);
TableModle.setRowCount(20);
for(int i=0;i<20;i++){    //输入行值
for(int j=0;j<4;j++){
TableModle.setValueAt("["+i+","+j+"]", i, j);
}
}
table.setModel(TableModle);

jColorChooser=new JColorChooser();
contentPane.add(jColorChooser, BorderLayout.SOUTH);

panel = new JPanel();
contentPane.add(panel, BorderLayout.NORTH);

backgroundButton = new JButton("\u8BBE\u7F6E\u5355\u5143\u683C\u80CC\u666F\u989C\u8272");
backgroundButton.addActionListener(this);
panel.add(backgroundButton);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource()==backgroundButton){
int row=table.getSelectedRow();   //得到所选行索引
int column=table.getSelectedColumn(); //得到所选列索引
Color background=jColorChooser.getColor();//得到所选颜色
if((row!=-1)&&(column!=-1)){  //判断是否存在单元格 }
}
}
}jtablejavajavase软件

解决方案 »

  1.   


    if ((row != -1) && (column != -1)) { //判断是否存在单元格
    table.setSelectionBackground(background);//设置选中背景色
    }
      

  2.   

    自己写一个 TableCellRenderer用一个 Map<Point, Color> colorMap 存储背景色,只存特别设置的颜色,默认颜色不存。当选择颜色 color 时, 调用方法做下面的事:Point p = new Point(table.getSelectedRow(), table.getSelectedColumn());
    colorMap.put(p, color);然后 fire table 的更新。
      

  3.   

    http://pastebin.com/gP7HuHJC
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.Point;
    import java.util.HashMap;
    import java.util.Map;
    import javax.swing.BorderFactory;
    import javax.swing.JColorChooser;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.SwingUtilities;
    import javax.swing.UIManager;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.DefaultTableCellRenderer;
    /**
     *
     * @date   18/06/2013
     */
    public class TableCellColorDemo {
      
      public static void main(String[] args) {
        
        SwingUtilities.invokeLater(new Runnable() {      @Override
          public void run() {
            
            try {
              
              UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
              
              JFrame f = new JFrame("Test Table Cell Background");
              
              final BackgroundMutableCellRenderer renderer = new BackgroundMutableCellRenderer();
              final JTable table = new JTable(new DummyTableModel(5, 10));
              
              table.setDefaultRenderer(Object.class, renderer);
              table.setPreferredScrollableViewportSize(table.getPreferredSize());
              
              final JColorChooser colorChooser = new JColorChooser();
              colorChooser.getSelectionModel().addChangeListener(new ChangeListener() {            @Override
                public void stateChanged(ChangeEvent e) {
                  
                  int row = table.getSelectedRow();
                  int column = table.getSelectedColumn();
                  renderer.setBackground(row, column, colorChooser.getColor());
                  
                  table.repaint();
                }
              });
              
              f.getContentPane().setLayout(new BorderLayout(5, 5));
              f.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
              f.getContentPane().add(colorChooser, BorderLayout.SOUTH);
              ((JComponent)f.getContentPane()).setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
              
              f.pack();
              f.setLocationRelativeTo(null);
              f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
              f.setVisible(true);
            }
            catch(Exception e) {
              
              e.printStackTrace();
            }
          }
        });
      }
    }
    class DummyTableModel extends AbstractTableModel {
      
      /*
       * rows & columns count of the dummy table model, accessed in EDT only
       */
      private Dimension size;
      
      DummyTableModel(int width, int height) {
        
        assert width > 0;
        assert height > 0;
        
        this.size = new Dimension(width, height);
      }  @Override
      public int getRowCount() {
        
        return size.height;
      }  @Override
      public int getColumnCount() {
        
        return size.width;
      }  @Override
      public Object getValueAt(int rowIndex, int columnIndex) {
        
        return String.format("CELL [ %03d, %03d ]", rowIndex + 1, columnIndex + 1);
      }
      
      @Override
      public String getColumnName(int column) {
        
        return "COLUMN " + (column + 1);
      }
    }class BackgroundMutableCellRenderer extends DefaultTableCellRenderer {
      
      /*
       * the default color blending ratio, when mixing the default "selection background
       * color" and the specifically set cell background color.
       */
      private static final float DEFAULT_MIX_RATIO = 0.5f;
      
      /*
       * store the background color set, accessed in EDT only
       */
      private Map<Point, Color> mapBGs;
      
      /*
       * store the original background color of the super implementation, accessed 
       * in EDT only
       */
      private Color origBG;
      
      BackgroundMutableCellRenderer() {
        
        mapBGs = new HashMap<Point, Color>();
        origBG = super.getBackground();
      }
      
      void setBackground(int row, int col, Color c) {
        
        mapBGs.put(new Point(row, col), c);
      }
      
      @Override
      public Component getTableCellRendererComponent(
              JTable table, Object value, boolean isSelected, boolean hasFocus, 
              int row, int column) {
        
        Component result = super.getTableCellRendererComponent(
                table, value, isSelected, hasFocus, row, column);
        
        Color c = mapBGs.get(new Point(row, column));
        
        if( table.getSelectedRow() == row ) {
          
          if( c != null )
            result.setBackground(mix(result.getBackground(), c, DEFAULT_MIX_RATIO));
        }
        else {
          
          result.setBackground(c == null ? origBG : c);
        }
        
        return result;
      }
      
      private Color mix(Color c1, Color c2, float ratio) {
        
        float rest = 1.0f - ratio;
        
        int r = (int)(c1.getRed() * ratio + c2.getRed() * rest);
        int g = (int)(c1.getGreen() * ratio + c2.getGreen() * rest);
        int b = (int)(c1.getBlue() * ratio + c2.getBlue() * rest);
        
        return new Color(r, g, b);
      }
    }