jTable某一列为数字时,如何使他们的值在修改时互换? 例如我jTable第一列是1-90的数字,当修改第34行的值:35为45时,45此前所对应的第44行的值就改为35,用什么方法?说详细点~ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 那,你的描述不是很清楚。你究竟是哪里卡住了?这个过程你整个都不会做?还是说处理到某个步骤的时候遇到什么问题。你问的这么笼统,怎么给你说详细呢?但是不管怎么说,有一点可以肯定。在setValueAt方法里面去作文章。找到前面或者后面与之匹配的记录,然后更改对应的数据。最后通知视图刷新。你所要增加的无非是找寻要交换的东西而已。最好把代码贴出来。要你这个table对应的model代码。还有model所操作的数据的对象和结构。 谢谢大大又来帮忙~整个过程还没思路,我只是想能不能加这个功能,所以说得也很笼统~想知道是不是要加tableModelEvent,还是changeEvent,就是说我如何知道他修改了哪一个单元格的值,下面应该比较简单,就是取出它的值进行匹配,如果有一样的,修改那个单元格的值。 哦?那么,setValueAt(Object value, int row, int column)你看这个方法如何?row,column就是修改的行列号,不正是你想要的吗?value则是修改后的新数据,也就是table的单元格用户操作后产生的数据,你这里应该就是一个~~id吧?在真正修改前你还可以得到原来的数据呢~~这个方法在单元格结束编辑的时候会自动被调用,你改写model的这个方法,来实现你的需求。一般都是setValue改一个值就可以,但是你需要的话可以随意更改任意多个的。甚至可以整个地来个天翻地覆也未尝不可啊~~那,我感觉你的想法应该是可行的哦。所有的料都备齐了,嗯,我看你可以炒这盘菜了,哈哈~~tableModelEvent和changeEvent这里似乎没必要吧~~来盘小炒就能达到要求,就别添油加醋了,你说呢? 恩,我没说清楚~我是想表格生成后,有用户(这里就是偶了)在视图上修改第一列(也就是id列,汗,连偶是id列都知道了~~)的值时,表格自动进行互换修改,就是我现在id列有90行,分别是数字1--90(一一对应,第一行是1,第90行是90),然后用户双击一个单元格,例如第30行进行编辑,把第30行的数字30改为40,然后回车啦,或是鼠标点击其他地方等方式使编辑结束,此时表格第40行的数字40自动变为30.问题就在于我怎么知道他进行了编辑,并知道他编辑的是哪一行,应该要加Event吧~ ok。你稍等。我写一个小demo,回头代码贴给你,20分钟~~也许我说的不是非常明白,把你搞晕了~~ import java.awt.BorderLayout;import java.awt.Container;import java.util.ArrayList;import java.util.List;import javax.swing.JFrame;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.table.DefaultTableModel;public class ExchangeDemo extends JFrame { /** * */ private static final long serialVersionUID = 1L; private List<List<String>> data = new ArrayList<List<String>>(); private static final String[] COLUMN_NAMES = { "AA", "BB", "CC", "DD" }; public ExchangeDemo() { super(); initData(); Container c = getContentPane(); final JTable table = new JTable(); table.setModel(new DefaultTableModel() { /** * */ private static final long serialVersionUID = 1L; @Override public int getColumnCount() { return COLUMN_NAMES.length; } @Override public int getRowCount() { return data.size(); } @Override public String getColumnName(int column) { return COLUMN_NAMES[column]; } @Override public Object getValueAt(int row, int column) { Object value = data.get(row).get(column); return value == null ? "" : value.toString(); } @Override public void setValueAt(Object value, int row, int column) { if (row < data.size() && column < COLUMN_NAMES.length) { int iValue; try { iValue = Integer.parseInt(value.toString()); } catch (Exception e) { // TODO: 这地方的判断小子自己做吧 e.printStackTrace(); return; } String oldValue = data.get(row).get(column); data.get(row).set(column, value == null ? "" : value.toString()); // 这地方得问题,你要是输入个1000或10000的怎么搞,我就不玩了 if (iValue - 1 < data.size()) { data.get(iValue - 1).set(0, oldValue); } } fireTableDataChanged(); } }); c.setLayout(new BorderLayout()); c.add(new JScrollPane(table)); setSize(600, 400); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); } private void initData() { for (int i = 0; i < 20; i++) { List<String> record = new ArrayList<String>(); record.add(String.valueOf(i + 1)); record.add("aa"); record.add("bb"); record.add("cc"); data.add(record); } } public static void main(String args[]) { new ExchangeDemo(); }}呵呵,看来十分钟还没到,随意写的,有些可能遇到的问题没有处理,写了一些假数据,做演示。你看一下,很简单的东西——几分钟的东西,说它复杂也没人相信啊~~看看是不是你想要的? 谢谢了,我去试试看,没用过ArrayList,ArrayList是不是比Vector好用,增加删除等方法是不是一样啊?我看网上说同步的时候用Vector,怎样算同步?另:大大有空帮偶看看另一个帖子:http://topic.csdn.net/u/20090616/11/6eec4363-5f5f-4da4-b0df-b1fc496fe56f.html 同步啊,确实,ArrayList不是线程安全的。也不能说就比Vector好用,呵呵,只是比较常用而已,好多人习惯用这个。其实Vector用法差不多但是的确Vector自身更完善,如果说你的增删特别多,考虑LinkedList好一些。如果说更多是查找,修改某个位置的数据了,ArrayList还不错,定位快,但若是删除插入就没LinkedList那么有效率了。这都是数据结构里面什么连续数组,线性链表之类的。唉~~还有啊~~这代码其实是有问题的,好多的判断需要加啊,我都没加,比如你写了个几千,其实就不应该让他继续走了,这我也没做~~我这~~恩~~料不是我备的,但是~~佐料该算我的吧,哈哈,慢慢炒哦~~ 程序基本看懂了, value == null ? "" : value.toString());什么意思?还有个问题是例如把2改成4,第2行和第4行的值会互换,再把3改成2,照说现在要去和第4行的换,可是还是去和第2行的值换,有两个2~不过这么快写出来很强啊~~呵呵~ o~~明白。那就是说并不应该和绝对的行去互换,而是找到对应的id,按照id去互换,对吧。那可就要思考一下怎么找了。我在你另外一个贴子里面回了。两个问题我就一个demo搞了。不知道你的需求到底有多复杂~~是否需要改写cellRender或者editor。我就投机取巧了啊~~ 如何能获得选择的JTree的结点? 高分求教小问题,如何替换word中的指定字符串 关于createTempFile()与deleteOnExit()方法 请教高手 在一个界面用socket同时进行 双机通信 和 文件传输 怎么解决? 一个页面验证码的问题 在一维数组输出中("a["+0+"]="+a[0]);是什么意思?请各位高手帮帮,谢谢! switch 语句的一个问题 提个关于Applet的问题,看看那位做过或给个思路 1怎么确定控件的大小,方位.2.怎么弹出对话框(messagebox)? 如何判断复选框全部没被选中 关于自定的annotation,求教
要你这个table对应的model代码。还有model所操作的数据的对象和结构。
整个过程还没思路,我只是想能不能加这个功能,所以说得也很笼统~想知道是不是要加tableModelEvent,还是changeEvent,就是说我如何知道他修改了哪一个单元格的值,下面应该比较简单,就是取出它的值进行匹配,如果有一样的,修改那个单元格的值。
你看这个方法如何?row,column就是修改的行列号,不正是你想要的吗?value则是修改后的新数据,也就是table的单元格用户操作后产生的数据,你这里应该就是一个~~id吧?
在真正修改前你还可以得到原来的数据呢~~
这个方法在单元格结束编辑的时候会自动被调用,你改写model的这个方法,来实现你的需求。一般都是setValue改一个值就可以,但是你需要的话可以随意更改任意多个的。甚至可以整个地来个天翻地覆也未尝不可啊~~那,我感觉你的想法应该是可行的哦。
所有的料都备齐了,嗯,我看你可以炒这盘菜了,哈哈~~
tableModelEvent和changeEvent这里似乎没必要吧~~来盘小炒就能达到要求,就别添油加醋了,你说呢?
import java.awt.Container;
import java.util.ArrayList;
import java.util.List;import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;public class ExchangeDemo extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
private List<List<String>> data = new ArrayList<List<String>>();
private static final String[] COLUMN_NAMES = { "AA", "BB", "CC", "DD" }; public ExchangeDemo() {
super();
initData();
Container c = getContentPane();
final JTable table = new JTable();
table.setModel(new DefaultTableModel() {
/**
*
*/
private static final long serialVersionUID = 1L; @Override
public int getColumnCount() {
return COLUMN_NAMES.length;
} @Override
public int getRowCount() {
return data.size();
} @Override
public String getColumnName(int column) {
return COLUMN_NAMES[column];
} @Override
public Object getValueAt(int row, int column) {
Object value = data.get(row).get(column);
return value == null ? "" : value.toString();
} @Override
public void setValueAt(Object value, int row, int column) {
if (row < data.size() && column < COLUMN_NAMES.length) {
int iValue;
try {
iValue = Integer.parseInt(value.toString());
} catch (Exception e) {
// TODO: 这地方的判断小子自己做吧
e.printStackTrace();
return;
} String oldValue = data.get(row).get(column);
data.get(row).set(column,
value == null ? "" : value.toString());
// 这地方得问题,你要是输入个1000或10000的怎么搞,我就不玩了
if (iValue - 1 < data.size()) {
data.get(iValue - 1).set(0, oldValue);
}
} fireTableDataChanged();
}
});
c.setLayout(new BorderLayout());
c.add(new JScrollPane(table));
setSize(600, 400);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
} private void initData() {
for (int i = 0; i < 20; i++) {
List<String> record = new ArrayList<String>();
record.add(String.valueOf(i + 1));
record.add("aa");
record.add("bb");
record.add("cc"); data.add(record);
}
} public static void main(String args[]) {
new ExchangeDemo();
}
}呵呵,看来十分钟还没到,随意写的,有些可能遇到的问题没有处理,写了一些假数据,做演示。你看一下,很简单的东西——几分钟的东西,说它复杂也没人相信啊~~看看是不是你想要的?
还有个问题是例如把2改成4,第2行和第4行的值会互换,再把3改成2,照说现在要去和第4行的换,可是还是去和第2行的值换,有两个2~不过这么快写出来很强啊~~呵呵~
我在你另外一个贴子里面回了。两个问题我就一个demo搞了。不知道你的需求到底有多复杂~~是否需要改写cellRender或者editor。我就投机取巧了啊~~