package com.cn.nec.jxl.oracle;import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
public class AddRemoveCells implements ActionListener
{
JTable table = null;
DefaultTableModel defaultModel = null;
public AddRemoveCells()
{
JFrame f = new JFrame();
String[] name = {"字段 1","字段 2","字段 3","字段 4","字段 5"};
Object data[][] = {{new String(),new String(),new String(),new String(),new Boolean(false),new Boolean(false),new String()},
{new String(),new String(),new String(),new String(),new Boolean(false),new Boolean(false),new String()}};
defaultModel = new DefaultTableModel(data,name);
table=new JTable(defaultModel);
table.setPreferredScrollableViewportSize(new Dimension(400, 80));
JScrollPane s = new JScrollPane(table);
JPanel panel = new JPanel();
JButton b = new JButton("增加行",new ImageIcon("add.png"));
panel.add(b);
b.addActionListener(this);
b = new JButton("增加列");
panel.add(b);
b.addActionListener(this);
b = new JButton("删除行");
panel.add(b);
b.addActionListener(this);
b = new JButton("删除列");
panel.add(b);
b.addActionListener(this);
Container contentPane = f.getContentPane();
contentPane.add(panel, BorderLayout.NORTH);
contentPane.add(s, BorderLayout.CENTER);
f.setTitle("AddRemoveCells");
f.pack();
f.setVisible(true);
f.validate();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public void actionPerformed(ActionEvent e)
{
if(e.getActionCommand().equals("增加列"))
defaultModel.addColumn("增加列");
if(e.getActionCommand().equals("增加行"))
defaultModel.addRow(new Vector());
if(e.getActionCommand().equals("删除列"))
{
int columncount = defaultModel.getColumnCount()-1;
if(columncount >= 0)
{
TableColumnModel columnModel = table.getColumnModel();
TableColumn tableColumn = columnModel.getColumn(columncount);
columnModel.removeColumn(tableColumn);
defaultModel.setColumnCount(columncount);
}
}
if(e.getActionCommand().equals("删除行"))
{
int rowcount = defaultModel.getRowCount()-1;
if(rowcount >= 0)
{
defaultModel.removeRow(rowcount);
defaultModel.setRowCount(rowcount);
}
}
table.revalidate();
}
public static void main(String args[]) {
new AddRemoveCells();
}
}
为什么我定义了boolean实例,没有出现复选框呢,而且我点击“添加行”按钮,虽然加行了,可也没有出现带复选框按钮的
行,苦想中
import java.awt.event.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
public class AddRemoveCells implements ActionListener
{
JTable table = null;
DefaultTableModel defaultModel = null;
public AddRemoveCells()
{
JFrame f = new JFrame();
String[] name = {"字段 1","字段 2","字段 3","字段 4","字段 5"};
Object data[][] = {{new String(),new String(),new String(),new String(),new Boolean(false),new Boolean(false),new String()},
{new String(),new String(),new String(),new String(),new Boolean(false),new Boolean(false),new String()}};
defaultModel = new DefaultTableModel(data,name);
table=new JTable(defaultModel);
table.setPreferredScrollableViewportSize(new Dimension(400, 80));
JScrollPane s = new JScrollPane(table);
JPanel panel = new JPanel();
JButton b = new JButton("增加行",new ImageIcon("add.png"));
panel.add(b);
b.addActionListener(this);
b = new JButton("增加列");
panel.add(b);
b.addActionListener(this);
b = new JButton("删除行");
panel.add(b);
b.addActionListener(this);
b = new JButton("删除列");
panel.add(b);
b.addActionListener(this);
Container contentPane = f.getContentPane();
contentPane.add(panel, BorderLayout.NORTH);
contentPane.add(s, BorderLayout.CENTER);
f.setTitle("AddRemoveCells");
f.pack();
f.setVisible(true);
f.validate();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public void actionPerformed(ActionEvent e)
{
if(e.getActionCommand().equals("增加列"))
defaultModel.addColumn("增加列");
if(e.getActionCommand().equals("增加行"))
defaultModel.addRow(new Vector());
if(e.getActionCommand().equals("删除列"))
{
int columncount = defaultModel.getColumnCount()-1;
if(columncount >= 0)
{
TableColumnModel columnModel = table.getColumnModel();
TableColumn tableColumn = columnModel.getColumn(columncount);
columnModel.removeColumn(tableColumn);
defaultModel.setColumnCount(columncount);
}
}
if(e.getActionCommand().equals("删除行"))
{
int rowcount = defaultModel.getRowCount()-1;
if(rowcount >= 0)
{
defaultModel.removeRow(rowcount);
defaultModel.setRowCount(rowcount);
}
}
table.revalidate();
}
public static void main(String args[]) {
new AddRemoveCells();
}
}
为什么我定义了boolean实例,没有出现复选框呢,而且我点击“添加行”按钮,虽然加行了,可也没有出现带复选框按钮的
行,苦想中
第二,虽然默认确实提供了对于Boolean类型支持,显示为checkbox。但是有些问题。你必须提供某一列的类型,也就是改写getColumnClass方法。
将你定义的model写成如下,你就可以看到效果。因为你只定义了第五列索引为4的。
public Class<?> getColumnClass(int columnIndex) {
// TODO Auto-generated method stub
return columnIndex == 4 ? Boolean.class : String.class;
}
第三,这样做仍存在问题。如果像你的题目所说,加入的复选框不是规则地分布在同一列上,或者一列上存在多种展示,这样仍然无法满足。所以建议考虑我所说的第一条,而且对于数据类型复杂的情形,直接new的时候加参数,传递数据,可能会有问题,例如保存修改的值等等。
第四,写法。你可以看到,出现了硬编码。非常不利于阅读,维护和扩展。例如,如果那你的7列数据全部加上,那你就要写成
columnIndex == 4 || columnIndex == 6
那如果更多呢?表格20列,十列是checkbox,你就罗列十个,太繁琐。
当然,其他
方法还有很多,当然也相对复杂一点。慢慢摸索吧。
我只是随意的唠叨了几句,纯属个人观点了,不必太在意。
往往需要配合renderer和editor使用。根据modelgetalueAt返回得到的数据类型来进行展示的。所以model返回的可以是Object类型,这个数据,就是真实展示的依据。有的时候,表格里面的展示,每个单元格都有可能不同,有的是checkBox,有的是Combobox,我甚至还搞过里面是什么 JList,JTable,JTree等等。每个单元格都是这些的一种。痛苦啊。不知道你是不是知道renderer和editor的原理。如果你知道了,这些对于你就很容易了。别急,慢慢来。
我虽然有一些代码,可是这些都是在项目中,有些没有封装好,单独拿出一段代码来也没有用。
你先慢慢看吧。高人很多,但我不是。人外有人啊。
我虽然有一些代码,可是这些都是在项目中,有些没有封装好,单独拿出一段代码来也没有用。
你先慢慢看吧。
呵呵,这本就是j2se啦!!!!
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
public class AddRemoveCells implements ActionListener
{
JTable table = null;
DefaultTableModel defaultModel = null;
public AddRemoveCells()
{
JFrame f = new JFrame();
String[] name = {"字段 1","字段 2","字段 3","字段 4","字段 5"};
Object data[][] = {{new String(),new String(),new String(),new String(),new Boolean(false),new Boolean(false),new String()},
{new String(),new String(),new String(),new String(),new Boolean(false),new Boolean(false),new String()}};
defaultModel = new DefaultTableModel(data,name);
table=new JTable(defaultModel);
table.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(new JCheckBox("true")));//复选框单元格
table.setPreferredScrollableViewportSize(new Dimension(400, 80));
JScrollPane s = new JScrollPane(table);
JPanel panel = new JPanel();
JButton b = new JButton("增加行",new ImageIcon("add.png"));
panel.add(b);
b.addActionListener(this);
b = new JButton("增加列");
panel.add(b);
b.addActionListener(this);
b = new JButton("删除行");
panel.add(b);
b.addActionListener(this);
b = new JButton("删除列");
panel.add(b);
b.addActionListener(this);
Container contentPane = f.getContentPane();
contentPane.add(panel, BorderLayout.NORTH);
contentPane.add(s, BorderLayout.CENTER);
f.setTitle("AddRemoveCells");
f.pack();
f.setVisible(true);
f.validate();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public void actionPerformed(ActionEvent e)
{
if(e.getActionCommand().equals("增加列"))
defaultModel.addColumn("增加列");
if(e.getActionCommand().equals("增加行"))
defaultModel.addRow(new Vector());
if(e.getActionCommand().equals("删除列"))
{
int columncount = defaultModel.getColumnCount()-1;
if(columncount >= 0)
{
TableColumnModel columnModel = table.getColumnModel();
TableColumn tableColumn = columnModel.getColumn(columncount);
columnModel.removeColumn(tableColumn);
defaultModel.setColumnCount(columncount);
}
}
if(e.getActionCommand().equals("删除行"))
{
int rowcount = defaultModel.getRowCount()-1;
if(rowcount >= 0)
{
defaultModel.removeRow(rowcount);
defaultModel.setRowCount(rowcount);
}
}
table.revalidate();
}
public static void main(String args[]) {
new AddRemoveCells();
}
} 是要这样的结果不!!运行后点击添加,再点击添加行的第一列
Vector<String> colName = new Vector<String>(); // data to display
Vector<Vector<Object>> data = new Vector<Vector<Object>>(); private JTable table; public JCheckBoxTable() {
super();
initData(); Container c = getContentPane();
c.setLayout(new BorderLayout()); table = new JTable(new CModel());
JScrollPane jsp = new JScrollPane();
jsp.setViewportView(table); c.add(jsp); JButton button = new JButton("ok");
c.add(button, BorderLayout.SOUTH);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
table.setModel(new CModel());
} }); setSize(800, 600);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
} private void initData() {
for (int i = 0; i < 6; i++) {
colName.add("column " + i);
} for (int i = 0; i < 20; i++) {
Vector<Object> record = new Vector<Object>();
record.add(new Boolean(i % 2 == 0));
record.add(new Boolean(i % 3 == 0));
record.add(i + " 2");
record.add(i + " 3");
record.add(new Boolean(false));
record.add("i" + i + "5"); data.add(record);
}
} class CModel extends AbstractTableModel { private static final long serialVersionUID = 1L; @Override
public int getColumnCount() {
return colName.size();
} @Override
public int getRowCount() {
return data.size();
} @Override
public Object getValueAt(int rowIndex, int columnIndex) {
return data.get(rowIndex).get(columnIndex);
} @Override
public Class<?> getColumnClass(int columnIndex) {
return data.get(0).get(columnIndex).getClass(); } @Override
public String getColumnName(int column) {
return colName.get(column);
} @Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
// return columnIndex == 0;
return (getValueAt(rowIndex, columnIndex) instanceof Boolean);
} @Override
public void setValueAt(Object value, int rowIndex, int columnIndex) {
data.get(rowIndex).set(columnIndex, value);
fireTableCellUpdated(rowIndex, columnIndex);
}
} public static void main(String[] args) {
new JCheckBoxTable();
}
}
* @author gentalguo(暗淡星辰)
* @Date 2009-12-17
*
*/
public class JtableWithMultibleEditor extends JFrame { private static final long serialVersionUID = 1L;
private Vector<String> colNames = new Vector<String>();
private Vector<Vector<String>> data = new Vector<Vector<String>>(); private JTable table; public JtableWithMultibleEditor() {
super();
initData();
initUI(); setSize(600, 400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
} private void initData() {
for (int i = 0; i < 5; i++) {
colNames.add("Column" + i);
} for (int i = 0; i < 50; i++) {
Vector<String> v = new Vector<String>();
for (int j = 0; j < 5; j++) {
v.add(i + "," + j);
}
data.add(v);
}
} private void initUI() {
Container c = getContentPane();
c.setLayout(new BorderLayout());
table = new JTable() {
private static final long serialVersionUID = 1L; @Override
public void changeSelection(int rowIndex, int columnIndex,
boolean toggle, boolean extend) {
// TODO Auto-generated method stub
super.changeSelection(rowIndex, columnIndex, toggle, extend);
if (isCellEditable(rowIndex, columnIndex)) {
editCellAt(rowIndex, columnIndex);
}
}
};
table.setModel(new DefaultTableModel() {
private static final long serialVersionUID = 1L; @Override
public int getColumnCount() {
return colNames.size();
} @Override
public String getColumnName(int column) {
return colNames.get(column);
} @Override
public int getRowCount() {
return data.size();
} @Override
public Object getValueAt(int row, int column) {
return data.get(row).get(column);
} @Override
public boolean isCellEditable(int row, int column) {
// only last row, 1st,2nd Columns are editable
return (row == (getRowCount() - 1))
&& (column == 0 || column == 1);
}
}); c.add(new JScrollPane(table));
table.getColumnModel().getColumn(0).setCellRenderer(
new JButtonRenderer());
table.getColumnModel().getColumn(1).setCellRenderer(
new JButtonRenderer());
table.getColumnModel().getColumn(0).setCellEditor(new JButtonEditor());
table.getColumnModel().getColumn(1).setCellEditor(new JButtonEditor());
table.getTableHeader().setReorderingAllowed(false); } private class JButtonRenderer extends DefaultTableCellRenderer {
private static final long serialVersionUID = 1L;
private JButton button; public JButtonRenderer() {
button = new JButton();
} @Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
if (table.getModel().isCellEditable(row, column)) {
button.setText(value == null ? "" : value.toString());
return button;
} else {
return super.getTableCellRendererComponent(table, value,
isSelected, hasFocus, row, column);
}
}
} private class JButtonEditor extends DefaultCellEditor { private static final long serialVersionUID = 1L; private JButton button;
private JTable table;
private int row, column; public JButtonEditor() {
super(new JTextField());
button = new JButton();
button.setContentAreaFilled(false);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane
.showMessageDialog(
table.getParent(),
"Hello, you selected row "
+ row
+ " Column "
+ column
+ ", you can replace these lines of codes and "
+ "do any thing you want here");
}
});
} @Override
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
this.table = table;
this.row = row;
this.column = column;
if (table.isCellEditable(row, column)) {
button.setText(value == null ? "" : value.toString()); return button;
} else {
return super.getTableCellEditorComponent(table, value,
isSelected, row, column);
} }
} public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
// TODO: handle exception
}
new JtableWithMultibleEditor();
}}
这是只在最后一行的第一和第二列,展现为按钮的例子。你要其他的类型,把相应的展现方式和返回的数据修改即可。根据你的需要,判断那些可以编辑,那些不可编辑。
有一个问题,就是,编辑表格的时候,用这个方式,总是需要先选中单元格,进入编辑状态,然后再点才会触发编辑器的事件。如果想点击之后一次就直接有反应,可以采用加鼠标监听的方式。