62,616
社区成员
发帖
与我相关
我的任务
分享
import java.awt.Color;
import java.awt.Component;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.EventObject;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
/**
* @version 1.0
*/
public class TestRendererJTableAll extends JFrame{
/** serialVersionUID = 1L. */
private static final long serialVersionUID = 1L;
public TestRendererJTableAll() {
int tableRow = 10;
int tableColumn = 6;
Object[][] datas = new Object[tableRow][tableColumn];
Object[] names = new Object[tableColumn];
for (int r = 0; r < tableRow; r++) {
for (int c = 0; c < tableColumn; c++) {
datas[r][c] = "(" + String.valueOf(r) + "," + String.valueOf(c) + ")";
}
}
for (int c = 0; c < tableColumn; c++) {
names[c] = c;
}
JTable table = new CustomTable(datas, names);
add(new JScrollPane(table));
this.setSize(500, 500);
}
/**
* @author ems
*/
class CustomTable extends JTable {
/** serialVersionUID = 1L */
private static final long serialVersionUID = 1L;
/**
*
*/
public CustomTable() {
super();
}
/**
* @param dm
*/
public CustomTable(TableModel dm) {
super(dm, null, null);
}
/**
* @param rowData
* @param columnNames
*/
public CustomTable(final Object[][] rowData, final Object[] columnNames) {
super(rowData, columnNames);
setRowHeight(super.getRowHeight() + 5);
}
/**
* @see javax.swing.JTable#getCellRenderer(int, int)
*/
@Override
public TableCellRenderer getCellRenderer(int row, int column) {
return new JComponentTableCellRenderer(column);
}
/**
* @see javax.swing.JTable#getCellEditor(int, int)
*/
@Override
public TableCellEditor getCellEditor(int row, int column) {
return new JComponentTableCellRenderer(column);
}
}
/**
* @author ems
*/
class JComponentTableCellRenderer extends JComponent implements
TableCellRenderer,
TableCellEditor {
final Color SELECTION_BACKGROUND = UIManager.getColor("TextField.selectionBackground");
final Color SELECTION_FOREGROUND = UIManager.getColor("TextField.selectionForeground");
private ArrayList<WeakReference> listeners = new ArrayList<WeakReference>();
private static final long serialVersionUID = 1L;
private JComponent component_ = null;
private int type_ = 0;
public JComponentTableCellRenderer(int type) {
this.type_ = type;
}
/**
* @see javax.swing.table.TableCellRenderer#getTableCellRendererComponent(javax.swing.JTable,
* java.lang.Object, boolean, boolean, int, int)
*/
@Override
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
if (null == value) {
return null;
}
setComponent(value);
this.component_.setOpaque(true);
if (isSelected) {
this.component_.setBackground(SELECTION_BACKGROUND);
this.component_.setForeground(SELECTION_FOREGROUND);
}
if (hasFocus) {
this.component_.setBackground(Color.GREEN);
this.component_.setForeground(Color.BLUE);
}
return this.component_;
}
private void setComponent(Object value) {
switch (this.type_) {
case 1: // JButton
case 2: // JButton
this.component_ = new JButton();
((JButton) this.component_).setText(value.toString());
break;
case 3: // JComboBox
this.component_ = new JComboBox();
((JComboBox) this.component_).addItem(value);
((JComboBox) this.component_).addItem("test 1");
((JComboBox) this.component_).addItem("test 2");
break;
case 4: // JCheckBox
this.component_ = new JCheckBox();
if (value.equals(true)) {
((JCheckBox) this.component_).setSelected(true);
} else if (value.equals(false)) {
((JCheckBox) this.component_).setSelected(false);
}
break;
case 5: // JRadioButton
this.component_ = new JRadioButton();
if (value.equals(true)) {
((JRadioButton) this.component_).setSelected(true);
} else if (value.equals(false)) {
((JRadioButton) this.component_).setSelected(false);
}
break;
default: // JLabel, default
this.component_ = new JLabel();
((JLabel) this.component_).setText(value.toString());
}
this.component_.setBorder(null);
}
@Override
public Component getTableCellEditorComponent(JTable table,
Object value,
boolean isSelected,
int row,
int column) {
setComponent(value);
return this.component_;
}
@Override
public void addCellEditorListener(CellEditorListener l) {
listeners.add(new WeakReference(l));
}
@Override
public void cancelCellEditing() {
fireEditingCanceled();
}
@Override
public Object getCellEditorValue() {
Object value = null;
switch (this.type_) {
case 1: // // JButton
value = ((JButton) this.component_).getText();
break;
case 2: // JButton
value = ((JButton) this.component_).getText();
break;
case 3: // JComboBox
value = ((JComboBox) this.component_).getSelectedItem();
break;
case 4: // JCheckBox
value = ((JCheckBox) this.component_).isSelected();
break;
case 5: // JRadioButton
value = ((JRadioButton) this.component_).isSelected();
break;
default: // JLabel, default
value = ((JLabel) this.component_).getText();
}
return value;
}
@Override
public boolean isCellEditable(EventObject anEvent) {
return false;
//这就是重点了。返回true可编辑,返回false不可编辑
}
@Override
public void removeCellEditorListener(CellEditorListener l) {
this.listeners.remove(new WeakReference(l));
}
@Override
public boolean shouldSelectCell(EventObject anEvent) {
return true;
}
@Override
public boolean stopCellEditing() {
fireEditingStopped();
return true;
}
protected void fireEditingStopped() {
ChangeEvent e = new ChangeEvent(this.component_);
for (WeakReference ref : this.listeners) {
CellEditorListener l = (CellEditorListener) ref.get();
l.editingStopped(e);
}
}
protected void fireEditingCanceled() {
ChangeEvent e = new ChangeEvent(this.component_);
for (WeakReference ref : this.listeners) {
CellEditorListener l = (CellEditorListener) ref.get();
l.editingCanceled(e);
}
}
}
public static void main(String[] args){
new TestRendererJTableAll().setVisible(true);
}
}
在Jtable中添加的组件实现TableCellEditor接口。
还是将isCellEditable()方法返回false就行了。