例如我jTable第一列是1-90的数字,当修改第34行的值:35为45时,45此前所对应的第44行的值就改为35,用什么方法?说详细点~

解决方案 »

  1.   

    那,你的描述不是很清楚。你究竟是哪里卡住了?这个过程你整个都不会做?还是说处理到某个步骤的时候遇到什么问题。你问的这么笼统,怎么给你说详细呢?但是不管怎么说,有一点可以肯定。在setValueAt方法里面去作文章。找到前面或者后面与之匹配的记录,然后更改对应的数据。最后通知视图刷新。你所要增加的无非是找寻要交换的东西而已。最好把代码贴出来。
    要你这个table对应的model代码。还有model所操作的数据的对象和结构。
      

  2.   

    谢谢大大又来帮忙~
    整个过程还没思路,我只是想能不能加这个功能,所以说得也很笼统~想知道是不是要加tableModelEvent,还是changeEvent,就是说我如何知道他修改了哪一个单元格的值,下面应该比较简单,就是取出它的值进行匹配,如果有一样的,修改那个单元格的值。
      

  3.   

    哦?那么,setValueAt(Object value, int row, int column)
    你看这个方法如何?row,column就是修改的行列号,不正是你想要的吗?value则是修改后的新数据,也就是table的单元格用户操作后产生的数据,你这里应该就是一个~~id吧?
    在真正修改前你还可以得到原来的数据呢~~
    这个方法在单元格结束编辑的时候会自动被调用,你改写model的这个方法,来实现你的需求。一般都是setValue改一个值就可以,但是你需要的话可以随意更改任意多个的。甚至可以整个地来个天翻地覆也未尝不可啊~~那,我感觉你的想法应该是可行的哦。
    所有的料都备齐了,嗯,我看你可以炒这盘菜了,哈哈~~
    tableModelEvent和changeEvent这里似乎没必要吧~~来盘小炒就能达到要求,就别添油加醋了,你说呢?
      

  4.   

    恩,我没说清楚~我是想表格生成后,有用户(这里就是偶了)在视图上修改第一列(也就是id列,汗,连偶是id列都知道了~~)的值时,表格自动进行互换修改,就是我现在id列有90行,分别是数字1--90(一一对应,第一行是1,第90行是90),然后用户双击一个单元格,例如第30行进行编辑,把第30行的数字30改为40,然后回车啦,或是鼠标点击其他地方等方式使编辑结束,此时表格第40行的数字40自动变为30.问题就在于我怎么知道他进行了编辑,并知道他编辑的是哪一行,应该要加Event吧~
      

  5.   

    ok。你稍等。我写一个小demo,回头代码贴给你,20分钟~~也许我说的不是非常明白,把你搞晕了~~
      

  6.   

    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();
    }
    }呵呵,看来十分钟还没到,随意写的,有些可能遇到的问题没有处理,写了一些假数据,做演示。你看一下,很简单的东西——几分钟的东西,说它复杂也没人相信啊~~看看是不是你想要的?
      

  7.   

    谢谢了,我去试试看,没用过ArrayList,ArrayList是不是比Vector好用,增加删除等方法是不是一样啊?我看网上说同步的时候用Vector,怎样算同步?另:大大有空帮偶看看另一个帖子:http://topic.csdn.net/u/20090616/11/6eec4363-5f5f-4da4-b0df-b1fc496fe56f.html
      

  8.   

    同步啊,确实,ArrayList不是线程安全的。也不能说就比Vector好用,呵呵,只是比较常用而已,好多人习惯用这个。其实Vector用法差不多但是的确Vector自身更完善,如果说你的增删特别多,考虑LinkedList好一些。如果说更多是查找,修改某个位置的数据了,ArrayList还不错,定位快,但若是删除插入就没LinkedList那么有效率了。这都是数据结构里面什么连续数组,线性链表之类的。唉~~还有啊~~这代码其实是有问题的,好多的判断需要加啊,我都没加,比如你写了个几千,其实就不应该让他继续走了,这我也没做~~我这~~恩~~料不是我备的,但是~~佐料该算我的吧,哈哈,慢慢炒哦~~
      

  9.   

    程序基本看懂了, value == null ? "" : value.toString());什么意思?
    还有个问题是例如把2改成4,第2行和第4行的值会互换,再把3改成2,照说现在要去和第4行的换,可是还是去和第2行的值换,有两个2~不过这么快写出来很强啊~~呵呵~
      

  10.   

    o~~明白。那就是说并不应该和绝对的行去互换,而是找到对应的id,按照id去互换,对吧。那可就要思考一下怎么找了。
    我在你另外一个贴子里面回了。两个问题我就一个demo搞了。不知道你的需求到底有多复杂~~是否需要改写cellRender或者editor。我就投机取巧了啊~~