62,614
社区成员
发帖
与我相关
我的任务
分享
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);
}
}
if ((row != -1) && (column != -1)) { //判断是否存在单元格
table.setSelectionBackground(background);//设置选中背景色
}