DefaultTableModel dm = new DefaultTableModel() { public boolean isCellEditable(int row, int column) { if (column == 0) { return true; } return false; } };如果有类似的地方,注意红色标注,只在你设定可以编辑的列里,才可以编辑。
//单元格编辑器 MyCellEditor myCellEditor = new MyCellEditor(); TableColumn index = table.getColumnModel().getColumn(2); index.setCellEditor(myCellEditor);
我将编辑器加载在了第三列上,下面是我自己写的编辑器 /** * 单元格编辑器 * */ static class MyCellEditor extends AbstractCellEditor implements TableCellEditor { String strIndex = " "; private JPanel panel; static MyCellEditor n; JDialog dialog = null; JDialog dialognull = new JDialog(); /** * 单态模式获取实例 * @return SqlManager对象 */ public static MyCellEditor getInstance() { if (n == null) { n = new MyCellEditor(); } return n; }
//第二种机制 public MyCellEditor() { // dialog = new JDialog(dialognull,"选择listtype",true); dialog = new JDialog(); dialog.setTitle("选择listtype"); dialog.setModal(true);
dialog.setSize(300,300);
JPanel panel = new JPanel(); String str[] = {"类型1:对话,无参数","类型2:杀指定类型怪,参数1怪物类型ID,参数2杀怪数量","类型3:杀指定的怪,参数1怪物帐户ID,参数2杀怪数量","类型4:搜集物品,参数1物品ID,参数2物品数量","类型5:对指定怪物NPC使用物品,参数1NPCID,参数2物品ID","类型6:杀指定类型怪并且获得指定物品,参数1怪物类型ID,参数2怪物数量,参数3物品ID,参数4物品数量"}; final JList list = new JList(str); list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
public void setIndex(String str) { this.strIndex = str; }
@Override public Object getCellEditorValue() { // TODO Auto-generated method stub //应该返回一个字符串 System.out.println("返回的值是 : " +strIndex); // return tasktypeEdit.getInstance().getSelectIndex(); return strIndex; } @Override public boolean isCellEditable(EventObject anEvent) { // TODO Auto-generated method stub
return true; } @Override public boolean shouldSelectCell(EventObject anEvent) { //点击单元格时调用该方法 // TODO Auto-generated method stub /*tasktypeEdit.getInstance().setVisible(true); tasktypeEdit.getInstance().setSize(300,300);*/ System.out.println("开始编辑"); dialog.setVisible(true); return true; } @Override public boolean stopCellEditing() { // TODO Auto-generated method stub /*System.out.println("stopCellEditing"); tasktypeEdit.getInstance().setVisible(false);*/ //点击确定按钮时,调用该方法
dialog.setVisible(false); System.out.println("编辑结束了"); super.stopCellEditing(); return true; } @Override public void cancelCellEditing() { //点击取消时调用该方法 // TODO Auto-generated method stub System.out.println("你取消了操作 "+"cancelCellEditing()"); // tasktypeEdit.getInstance().setVisible(false); dialog.setVisible(false); super.cancelCellEditing(); } @Override public void addCellEditorListener(CellEditorListener l) { // TODO Auto-generated method stub
} @Override public void removeCellEditorListener(CellEditorListener l) { // TODO Auto-generated method stub
} @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { // TODO Auto-generated method stub panel = new JPanel();
return panel; }
}
编辑器的构造方法去生成一个对话框,对话的确定按钮会调用MyCellEditor.getInstance().stopCellEditing();书上说这样是告诉系统你结束了编辑,会将编辑后的值传给getCellEditorValue(),在该方法中返回编辑后要返回的值,系统会调用 setValueAt(Object aValue, int rowIndex, int columnIndex)
public boolean isCellEditable(int row, int column) {
if (column == 0) {
return true;
}
return false;
}
};如果有类似的地方,注意红色标注,只在你设定可以编辑的列里,才可以编辑。
MyCellEditor myCellEditor = new MyCellEditor();
TableColumn index = table.getColumnModel().getColumn(2);
index.setCellEditor(myCellEditor);
/**
* 单元格编辑器
*
*/
static class MyCellEditor extends AbstractCellEditor implements TableCellEditor {
String strIndex = " ";
private JPanel panel;
static MyCellEditor n;
JDialog dialog = null;
JDialog dialognull = new JDialog();
/**
* 单态模式获取实例
* @return SqlManager对象
*/
public static MyCellEditor getInstance() {
if (n == null) {
n = new MyCellEditor();
}
return n;
}
//第二种机制
public MyCellEditor() {
// dialog = new JDialog(dialognull,"选择listtype",true);
dialog = new JDialog();
dialog.setTitle("选择listtype");
dialog.setModal(true);
dialog.setSize(300,300);
JPanel panel = new JPanel();
String str[] = {"类型1:对话,无参数","类型2:杀指定类型怪,参数1怪物类型ID,参数2杀怪数量","类型3:杀指定的怪,参数1怪物帐户ID,参数2杀怪数量","类型4:搜集物品,参数1物品ID,参数2物品数量","类型5:对指定怪物NPC使用物品,参数1NPCID,参数2物品ID","类型6:杀指定类型怪并且获得指定物品,参数1怪物类型ID,参数2怪物数量,参数3物品ID,参数4物品数量"};
final JList list = new JList(str);
list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
JButton bt = new JButton("确定");
bt.addActionListener(new ActionListener(){
//取得选择的项的索引
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
int index[] = list.getSelectedIndices();
for(int i = 0 ; i< index.length; i++){
index[i] = index[i]+1;
if(i == index.length )
strIndex += index[i] ;
else if(i == 0)
strIndex = index[i] + ",";
else
strIndex += index[i] + ",";
}
System.out.println("取得列索引,用于返回,它的值是 : " + strIndex);
MyCellEditor.getInstance().setIndex(strIndex);
MyCellEditor.getInstance().getCellEditorValue();
MyCellEditor.getInstance().stopCellEditing();
// dialog.setVisible(false);
list.clearSelection();
}
});
panel.add(bt);
bt = new JButton("取消");
bt.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
MyCellEditor.getInstance().cancelCellEditing();
}
});
panel.add(bt);
dialog.add(list,BorderLayout.CENTER);
dialog.add(panel,BorderLayout.SOUTH);
}
public void setIndex(String str) {
this.strIndex = str;
}
@Override
public Object getCellEditorValue() {
// TODO Auto-generated method stub
//应该返回一个字符串
System.out.println("返回的值是 : " +strIndex);
// return tasktypeEdit.getInstance().getSelectIndex();
return strIndex;
} @Override
public boolean isCellEditable(EventObject anEvent) {
// TODO Auto-generated method stub
return true;
} @Override
public boolean shouldSelectCell(EventObject anEvent) {
//点击单元格时调用该方法
// TODO Auto-generated method stub
/*tasktypeEdit.getInstance().setVisible(true);
tasktypeEdit.getInstance().setSize(300,300);*/
System.out.println("开始编辑");
dialog.setVisible(true);
return true;
} @Override
public boolean stopCellEditing() {
// TODO Auto-generated method stub
/*System.out.println("stopCellEditing");
tasktypeEdit.getInstance().setVisible(false);*/
//点击确定按钮时,调用该方法
dialog.setVisible(false);
System.out.println("编辑结束了");
super.stopCellEditing();
return true;
} @Override
public void cancelCellEditing() {
//点击取消时调用该方法
// TODO Auto-generated method stub
System.out.println("你取消了操作 "+"cancelCellEditing()");
// tasktypeEdit.getInstance().setVisible(false);
dialog.setVisible(false);
super.cancelCellEditing();
} @Override
public void addCellEditorListener(CellEditorListener l) {
// TODO Auto-generated method stub
} @Override
public void removeCellEditorListener(CellEditorListener l) {
// TODO Auto-generated method stub
} @Override
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
// TODO Auto-generated method stub
panel = new JPanel();
return panel;
}
}
* @Title: TableTest.java
* @Package com.yjb.test
* @Description: TODO(用一句话描述该文件做什么)
* @author 游建波
* @date 2010-9-13 下午03:13:10
* @version V1.0
*/
package com.yjb.test;import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;public class TableTest extends JFrame
{
private JTable table;
public TableTest()
{
DefaultTableModel dm = new DefaultTableModel() {
public boolean isCellEditable(int row, int column) {
if (column == 0) {
return true;
}
return false;
}
};
dm.setDataVector(new Object[][] {
{ "请输入", "String", "JLabel", "JTextField" } ,
{ "请输入", "String", "JLabel", "JTextField" } }, new Object[] {
"Component", "Data", "Renderer", "Editor" });
table = new JTable(dm);
table.getSelectionModel().addListSelectionListener(new ListSelectionListener()
{
@Override
public void valueChanged(ListSelectionEvent e) {
tableSelectionChanged();
}
});
getContentPane().add(table);
setSize(400, 160);
setVisible(true);
}
private void tableSelectionChanged() {
int rowIndex = table.getSelectedRow();
int cellIndex = table.getSelectedColumn();
if(cellIndex == 0)
{
String value = JOptionPane.showInputDialog(null,"请输入值",
"Enter",JOptionPane.QUESTION_MESSAGE);
//JOptionPane.showMessageDialog(null, "您选择的是 行 "+rowIndex+" 列 "+cellIndex);
table.setValueAt(value, rowIndex, cellIndex);
table.repaint();
}
//table.clearSelection();
}
public static void main(String args[])
{
TableTest t = new TableTest();
t.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
这个问题我也遇到过, 我是这么解决的就是你在用单例模式的时候关闭dialog,其实那个实例还存在,所以在你在点击Jtable的时候dialog是不会显示的
解决办法就在你 点击Jtable弹出dialog的事件里加上dialog.setVisible(true); 就没问题了