public class TJableTest { public static void main(String... args) {
JTable table = new JTable(new Object[][] { { true }, { false },
{ new Object[] { "one", "two" } }, { "text field" } },
new Object[] { "Header" }); table.setDefaultRenderer(Object.class, new MyTableCellRenderer()); JFrame frame = new JFrame("JTable");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(table);
frame.pack();
frame.setVisible(true);
} public static class MyTableCellRenderer extends DefaultTableCellRenderer { private JCheckBox check = new JCheckBox(); private JTextField text = new JTextField(); public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
if (value instanceof Boolean) {
check.setSelected((Boolean) value);
return check;
} else if (value instanceof Object[]) {
JComboBox combo = new JComboBox((Object[]) value);
return combo;
} else {
text.setText(value.toString());
return text;
}
}
}
}请问这个 Renderer 的 Editor 该怎么写?我对JTable 还很陌生,希望能给个没有调试错误的
MyTableCellRenderer 的 class 。非常感谢!
JTable table = new JTable(new Object[][] { { true }, { false },
{ new Object[] { "one", "two" } }, { "text field" } },
new Object[] { "Header" }); table.setDefaultRenderer(Object.class, new MyTableCellRenderer()); JFrame frame = new JFrame("JTable");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(table);
frame.pack();
frame.setVisible(true);
} public static class MyTableCellRenderer extends DefaultTableCellRenderer { private JCheckBox check = new JCheckBox(); private JTextField text = new JTextField(); public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
if (value instanceof Boolean) {
check.setSelected((Boolean) value);
return check;
} else if (value instanceof Object[]) {
JComboBox combo = new JComboBox((Object[]) value);
return combo;
} else {
text.setText(value.toString());
return text;
}
}
}
}请问这个 Renderer 的 Editor 该怎么写?我对JTable 还很陌生,希望能给个没有调试错误的
MyTableCellRenderer 的 class 。非常感谢!
当然最强大展示方式的就是通过自定义自己的renderer组件,通过Java2D来绘制各种天花乱坠的效果。 另外需要TableCellEditor的配合
TableCellEditor主要是用来当用户点击在具体cell时进行编辑的组件,所以TableCellEditor除了
具有TableCellRenderer一样的绘制功能外还可以进行交互动作,例如在cell上出现下拉框、勾选框
甚至通过按钮弹出更复杂的对话框让用户进行输入编辑。注意这里的renderer只是用来显示效果,并没有进行交互动作击在cell上时,JTable定位在的editor,
所以不要徒劳在renderer做点击事项处理,renderer是不会接受到交互事项的,renderer只是个画笔.
你这个程序有点乱. 整不太明白.
我写了个例子.
/**
* project:test
*
* <p>
* description:
* </p>
*
* @author herry-huangcm <[email protected]>
* @copyright 2008, BestWiz(Dalian) Co.,Ltd
* @version TestT.java 2008-1-31 下午01:01:53
*/public class TestT extends JFrame {
public TestT() { JTable table = new JTable(3,1);
TableColumn tableColumn = table.getColumnModel().getColumn(0);
tableColumn.setCellRenderer(new Renderer());
tableColumn.setCellEditor(new Editor()); this.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
this.setSize(500, 300);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
JCheckBox box =new JCheckBox();
JTextField text =new JTextField();
JComboBox com =new JComboBox(new String[]{"aa","bb"});
class Editor extends AbstractCellEditor implements TableCellEditor {
public Object getCellEditorValue() {return null;} public Component getTableCellEditorComponent(JTable table,Object value, boolean isSelected, int row, int column) {
switch(row){
case 0:return box;
case 1:return text;
case 2:return com;
}
return null;
}
} class Renderer extends JComponent implements TableCellRenderer {
public Component getTableCellRendererComponent(JTable table,Object value, boolean isSelected, boolean hasFocus, int row,int column) {
switch(row){
case 0:return box;
case 1:return text;
case 2:return com;
}
return null;
}
} public static void main(String[] args) {
new TestT();
}
}
/*
* ColorRenderer.java (compiles with releases 1.2, 1.3, and 1.4) is used by
* TableDialogEditDemo.java.
*/import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.border.Border;
import javax.swing.table.TableCellRenderer;
import java.awt.Color;
import java.awt.Component;public class ColorRenderer extends JLabel
implements TableCellRenderer {
Border unselectedBorder = null;
Border selectedBorder = null;
boolean isBordered = true; public ColorRenderer(boolean isBordered) {
this.isBordered = isBordered;
setOpaque(true); //MUST do this for background to show up.
} public Component getTableCellRendererComponent(
JTable table, Object color,
boolean isSelected, boolean hasFocus,
int row, int column) {
Color newColor = (Color)color;
setBackground(newColor);
if (isBordered) {
if (isSelected) {
if (selectedBorder == null) {
selectedBorder = BorderFactory.createMatteBorder(2,5,2,5,
table.getSelectionBackground());
}
setBorder(selectedBorder);
} else {
if (unselectedBorder == null) {
unselectedBorder = BorderFactory.createMatteBorder(2,5,2,5,
table.getBackground());
}
setBorder(unselectedBorder);
}
}
setToolTipText("RGB value: " + newColor.getRed() + ", "
+ newColor.getGreen() + ", "
+ newColor.getBlue());
return this;
}
}
我的bloghttp://blog.sina.com.cn/s/blog_466f1918010002co.html
http://blog.sina.com.cn/s/blog_466f1918010002cp.html
我的目的是想让 editor 通用一些,
当Cell 里的值是 String 的时候 return Label,
当Cell 里的值是 int 的时候 return JSpinner
当Cell 里的值是 String[] 的时候 return JComboBox ,
当Cell 里的值是 Boolean 的时候 return CheckBox.
因此的我的 Renderer 是public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
if (value instanceof Boolean) {
check.setSelected((Boolean) value);
return check;
} else if (value instanceof Object[]) {
JComboBox combo = new JComboBox((Object[]) value);
return combo;
} else {
text.setText(value.toString());
return text;
}
}
但是我的 Java 基础不是很好,所以我不知道 相应的 Editor 该怎么写,以及如何让public Object getCellEditorValue()
public Object setCellEditorValue()做出正确的判断?如果你还有时间的话,请帮帮忙?在此,祝各位朋友们新春快乐,身体健康,阖家幸福!
TableCellEditor editor)如果尚未在 TableColumn 中设置编辑器,则设置要使用的默认单元格编辑器。如果表不需要进行编辑,或者表中的特定列不需要编辑,则使用 TableModel 接口中的 isCellEditable 方法来确保此 JTable 在这些列中不启动编辑器。如果 editor 为 null,则移除此 columnClass 的默认编辑器。 参数:
columnClass - 设置此 columnClass 的默认单元格编辑器
editor - 此 columnClass 要使用的默认单元格编辑器
另请参见:
TableModel.isCellEditable(int, int), getDefaultEditor(java.lang.Class), setDefaultRenderer(java.lang.Class, javax.swing.table.TableCellRenderer)
import javax.swing.AbstractCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableColumn;public class Test { public static void main(String... args) {
Test test = new Test();
JTable table = new JTable(new Object[][] { { true }, { false },
{ new Object[] { "one", "two" } }, { "text field" } },
new Object[] { "Header" }); TableColumn tableColumn = table.getColumnModel().getColumn(0); tableColumn.setCellRenderer(test.new MyTableCellRenderer());
tableColumn.setCellEditor(test.new Editor()); JFrame frame = new JFrame("JTable");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(table);
frame.pack();
frame.setVisible(true);
} private JCheckBox check = new JCheckBox(); private JTextField text = new JTextField(); class MyTableCellRenderer extends DefaultTableCellRenderer { public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
if (value instanceof Boolean) {
check.setSelected((Boolean) value);
return check;
}
else if (value instanceof Object[]) {
JComboBox combo = new JComboBox((Object[]) value);
return combo;
}
else {
text.setText(value.toString());
return text;
}
}
} class Editor extends AbstractCellEditor implements TableCellEditor { public Object getCellEditorValue() {
return null;
} public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) { if (value instanceof Boolean) {
check.setSelected((Boolean) value);
return check;
}
else if (value instanceof Object[]) {
JComboBox combo = new JComboBox((Object[]) value);
return combo;
}
else {
text.setText(value.toString());
return text;
}
}
}
}